Development record
The record's discipline failures are themselves recorded — a lapse is a capture category, timestamped at the lapse
Press Release
When the recording discipline is suspended, deferred, or evaded, that is captured too. A
lapseentry carries the point in the process at which the discipline gave way and a timestamp at the lapse rather than at write-up. The log is not merely a disclosure obligation: the working claim is that recording at the point of commitment prevents retrospective reconstruction, and the lapse log is the evidence bearing on that claim.
What's In Scope
- The
lapsevalue in capture's validated category list. - The first three entries, written at the outset rather than discovered: the pre-tooling window (which entries were hand-authored before their surfaces existed); anticipation (those populating the record know what the readings will look for, and the instrument is specified alongside the record it will read); any commitment made outside the tooling during the build.
Acceptance Criteria
- Given a lapse, when it is captured, then the entry carries the category, the point in the process at which the discipline was suspended, deferred or evaded, and a timestamp at the lapse rather than at write-up.
Audit Notes
Fidelity review — receipt rcp-a98036202299 (verifier abcd:intent-auditor claude-fable-5).
Provenance: abcd:intent-auditor@claude-fable-5 · rubric_hash sha256:f3bba86a84b329fcbfbd3df64ec5d77d382dda9b4b1a61baf887e316bc41f38e · prompt_hash sha256:f5d0d1ff49565622f1179588454aef242aac986870b562e8ebadefaf028165c6 Input attestations: diff:543aaf19...d4b288a0 (build/itd-182 merged into experiment/cold-reading)@sha256:2b84b6a57ae67782d0f3a56df2c0ec3037017f4e31c4c23938a697a54c700259;
Acceptance rollup: MET 0 · MET_WITH_CONCERNS 1 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET_WITH_CONCERNS: All three elements are realised by mechanism and pinned by passing tests: category via the lapse enum value, the point in the process via the already-required found_during, and the lapse-time via the new lapsed_at property that the reader and the committed-ledger gate both require for category lapse and that the --lapsed-at flag never defaults. Concern: the shipped lapse entries were back-stamped by commit 267e2c74 with midnight-UTC day-granularity instants (2026-08-28T00:00:00Z) after the records existed, so the content honours 'at the lapse' only at day resolution and by later stamping; the gate can enforce presence and shape of the instant, not that it was recorded at the lapse. evidence: internal/core/issueschema/issueschema.go:89 — ""lapse"," evidence: internal/core/issueschema/issueschema.go:114 — "func LapsedAtRequired(category string) bool {" evidence: internal/core/issueschema/issueschema.go:123 — "func ValidLapsedAt(v string) bool {" evidence: internal/core/capture/validate.go:72 — "if strings.TrimSpace(fm["found_during"].(string)) == "" {" evidence: internal/core/capture/validate.go:117 — "if issueschema.LapsedAtRequired(fm["category"].(string)) && lapsedAt == "" {" evidence: internal/core/capture/validate.go:121 — "if lapsedAt != "" && !issueschema.ValidLapsedAt(lapsedAt) {" evidence: internal/surface/cli/cli.go:2402 — "if issueschema.LapsedAtRequired(string(req.Category)) && strings.TrimSpace(req.LapsedAt) == "" {" evidence: internal/surface/cli/cli.go:2432 — "captureCmd.Flags().StringVar(&lapsedAt, "lapsed-at", "", "RFC 3339 instant a discipline gave way (the lapse, not the write-up)")" evidence: internal/core/lint/schema.go:580 — "issueschema.LapsedAtRequired(issueScalar(f.value)) && lapsedAt == "" {" evidence: internal/core/capture/parse_test.go:183 — "func TestValidateStrictLapseRequiresLapsedAt(t *testing.T) {" evidence: internal/core/capture/parse_test.go:239 — "func TestValidateStrictLapseCarriesFoundDuring(t *testing.T) {" evidence: internal/surface/cli/capture_surface_test.go:513 — "func TestCaptureLapsedAtHasNoDefault(t *testing.T) {" evidence: .abcd/work/issues/open/iss-2608300002547145-lapse-pre-tooling-window.md:6 — "category: "lapse"" evidence: .abcd/work/issues/open/iss-2608300002547145-lapse-pre-tooling-window.md:8 — "found_during: "cold-reading workstream preparation, 2026-08-28"" evidence: .abcd/work/issues/open/iss-2608300002547145-lapse-pre-tooling-window.md:10 — "lapsed_at: "2026-08-28T00:00:00Z""
Gap audit:
- honoured:
- lapse is a value in capture's validated category list, judged by the same strict path every issue takes evidence: internal/core/issueschema/issueschema.go:89 — ""lapse"," evidence: internal/core/capture/parse_test.go:152 — "func TestValidateStrictLapseCategory(t *testing.T) {"
- A lapse entry carries the instant the discipline gave way: lapsed_at is required exactly for category lapse, must parse as RFC 3339, and both gates read the one definition in core/issueschema evidence: internal/core/issueschema/issueschema.go:51 — ""lapsed_at": true," evidence: internal/core/capture/validate.go:117 — "if issueschema.LapsedAtRequired(fm["category"].(string)) && lapsedAt == "" {" evidence: internal/core/lint/schema.go:595 — "case lapsedAt != "" && !issueschema.ValidLapsedAt(lapsedAt):" evidence: internal/core/lint/schema_parity_test.go:197 — "func TestIssueRecordShapeFlagsLapseWithoutLapsedAt(t *testing.T) {" evidence: internal/core/capture/parse_test.go:210 — "func TestValidateStrictLapsedAtMustBeRFC3339(t *testing.T) {" evidence: internal/core/capture/parse_test.go:225 — "func TestValidateStrictNonLapseAcceptsAbsentLapsedAt(t *testing.T) {"
- The timestamp is at the lapse rather than at write-up: --lapsed-at has no default, a lapse capture omitting it exits non-zero and writes nothing, and the given instant round-trips unaltered evidence: internal/surface/cli/cli.go:2432 — "captureCmd.Flags().StringVar(&lapsedAt, "lapsed-at", "", ..." evidence: internal/surface/cli/cli.go:2403 — "return &exitError{Code: 2, Msg: "abcd capture --category " + issueschema.CategoryLapse +" evidence: internal/core/capture/workflow.go:162 — "if lapsedAt := strings.TrimSpace(req.LapsedAt); lapsedAt != "" {" evidence: internal/surface/cli/capture_surface_test.go:485 — "func TestCaptureLapsedAtWritesTheGivenInstant(t *testing.T) {" evidence: internal/core/capture/serialize_test.go:201 — "func TestLapsedAtRoundTrips(t *testing.T) {"
- The point in the process is carried by found_during, already required and refused when blank evidence: internal/core/capture/validate.go:73 — "return fmt.Errorf("%w: found_during must be non-empty", ErrMalformedFrontmatter)" evidence: internal/core/capture/parse_test.go:239 — "func TestValidateStrictLapseCarriesFoundDuring(t *testing.T) {"
- The flag is documented on the plugin surface and in the regenerated CLI reference
evidence: commands/capture.md:51 — "
--category lapserequires--lapsed-at: the flag has no default, and a" evidence: docs/reference/cli/commands.md:169 — "--lapsed-at string RFC 3339 instant a discipline gave way (the lapse, not the write-up)" - The first three lapse entries (pre-tooling window, anticipation, outside-tooling commitments) exist in the ledger as category lapse with found_during and lapsed_at evidence: .abcd/work/issues/open/iss-2608300002547145-lapse-pre-tooling-window.md:6 — "category: "lapse"" evidence: .abcd/work/issues/open/iss-2608300002540238-lapse-anticipation.md:10 — "lapsed_at: "2026-08-28T00:00:00Z"" evidence: .abcd/work/issues/open/iss-2608300002544153-lapse-outside-tooling-commitments.md:8 — "found_during: "cold-reading workstream preparation, 2026-08-27/28""
- diverged:
- The spec says the first three entries are 'each an ordinary abcd capture call ... with a --lapsed-at carrying the instant'; in the delivered range the entries pre-existed without lapsed_at and were back-stamped in a separate chore commit (267e2c74) with midnight-UTC day-granularity values, so the instant recorded is a day reconstructed at stamping rather than a captured moment evidence: .abcd/work/issues/open/iss-2608300002547145-lapse-pre-tooling-window.md:10 — "lapsed_at: "2026-08-28T00:00:00Z"" evidence: .abcd/work/issues/open/iss-2608300002557321-lapse-inferred-go-ahead.md:10 — "lapsed_at: "2026-08-29T00:00:00Z"" evidence: .abcd/work/issues/open/iss-2608300002557321-lapse-inferred-go-ahead.md:13 — "Timestamp: 2026-08-29 (at the lapse; written up 2026-08-30 at the restart)."
- The intent scopes 'the first three entries'; the delivered ledger carries four category-lapse records (a fourth, lapse-inferred-go-ahead, is additional to the three named) evidence: .abcd/work/issues/open/iss-2608300002557321-lapse-inferred-go-ahead.md:6 — "category: "lapse""
- The one-line committed-ledger mirror the spec describes grew into a multi-case gate (padded, list-valued, map-valued, block-spelled lapsed_at) across four fix commits, each disclosed as an issue record rather than absorbed silently evidence: internal/core/lint/schema.go:574 — "if hasLapseField && lapsedAt == "" && strings.TrimSpace(lapseField.value) == "" {" evidence: internal/core/lint/schema.go:594 — "add(lapseField.line, "lapsed_at is spelled as an indented block; ..." evidence: .abcd/work/issues/open/iss-2608300212513349-itd-182-review-residue.md:1 — "---"
- missing:
- No delivered mechanism can establish that a lapsed_at instant was recorded at the lapse rather than chosen at write-up; the gates enforce presence and RFC 3339 shape only, and the spec places that judgement out of scope evidence: internal/core/issueschema/issueschema.go:123 — "func ValidLapsedAt(v string) bool {" evidence: internal/core/lint/schema.go:596 — "add(lapseField.line, "lapsed_at '"+lapsedAt+"' is not an RFC 3339 instant (want 2026-08-28T00:00:00Z); capture refuses the record and skips it")"
Grounds
- pursued: Pursued now because the lapse log is not merely a disclosure obligation: the working claim under test in this cycle is that recording at the point of commitment prevents retrospective reconstruction, and the lapse log is the evidence bearing on that claim. A log opened after the cycle's lapses have already accumulated is reconstruction, and so cannot be evidence about reconstruction.
Frontmatter
| id | itd-182 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-182-the-record-s-discipline-failures-are.md
open on GitHub ↗ · commit history ↗
Referenced by1
- spc-60The lapse log: a capture category, timestamped at the lapseimplemented by
mentions10
- dcn-26083000000000172026-08-30 — itd-179 round-5: a RELOCATION is not a BACKFILL, and the forward-only rule forbids only the second. Moving a pre-tooling `## Grounds (pursued)` section from a spec onto its intent (commit 09f7d91a, thirteen specs) put text authored at the moment of pursuit where it belongs; nothing was reconstructed, which is the whole of what "never backfilled" refuses. Three shipped intents therefore carry a `## Grounds` section — itd-177, itd-182, itd-188 — and the surface claim now says so instead of asserting the corpus carries none (iss-2608301657357989). The enforcement is unchanged and stays maximally strict: `RecordGrounds` refuses a shipped or superseded record whatever the provenance of the text, because nothing in it can tell relocated text from invented text, so the relocated state is deliberately not reachable through `abcd intent ready --grounds`. Rejected: weakening the refusal to admit a `--relocate` escape, which would make the distinction a caller's assertion rather than a reviewable fact about a commit.
- iss-2608300002540238Lapse: anticipation. Those populating this cycle's record know what the readings will look for, and the instrument is specified alongside the record it will read. The manifest mitigates by showing what a reading actually saw; the mitigation is partial. Made once at the outset, per the protocol, rather than reconstructed later. Timestamp: 2026-08-28.
- iss-2608300002544153Lapse: commitments made outside the tooling. The workstream's rulings (the construal-admissibility extension, the detection and disposition record design, the closing-run schedule and interpretations, the supply-regime check, the invocation constraint, the lapse-log field, and the three elicitation rulings) were committed in design discussion before the refusing commands existed. Disclosed here once; the decision-log entry carries the rulings themselves. Timestamp: 2026-08-28.
- iss-2608300002547145Lapse: the pre-tooling window. The workstream's earliest ledger entries (the ledger-design construal, the mechanism/content distinction, the extend-not-duplicate decision, the adopted rulings, and this entry itself) are hand-authored before the surfaces existed to write them through commands - the format precedes its enforcement. Point in the process: preparation, before the first schema commit. Timestamp: 2026-08-28 (at the lapse, not at write-up).
- iss-2608300002557321Lapse: autonomy acted on an inferred go-ahead. Session 1's orchestrator read the facilitator's status update that the product thinker would provide the construal as a go-ahead - the inference rested on a misread word in the update - and ran Phase 1 filing (five local commits, nothing pushed) before the construal existed. It was stopped on challenge and the branch deleted. Remedy, procedural: an autonomous run starts only on an explicit go, never on an inference from a status update. Timestamp: 2026-08-29 (at the lapse; written up 2026-08-30 at the restart).
- iss-2608300212513349itd-182 review residue: the record-lint issue-shape check reads a quoted whitespace-only lapsed_at as a present malformed value while capture's reader trims it to absent, so the two gates disagree on a hand-authored non-lapse record and lint's message states a reader refusal that does not happen (trim after issueScalar and pin the padded case); the capture-verb prose flag list on the issues README omits --lapsed-at; the five stamped lapse records assert T00:00:00Z where their bodies state only a day and no record page states the date-only-floored-to-midnight-UTC convention.
- iss-2608301657357989the plugin surface claims the grounds verb refuses a shipped record so no terminal bucket carries grounds while three shipped intents do
- iss-2608301856299268a size classification for specs and tasks is parked as a note and owes a design and filing decision in a future session
- iss-2609012259581057The cold-reading workstream's intents carry no mechanism claim and twelve of fourteen declare no scope condition, so the record was populated by demonstration rather than use
- itd-2609020625400445A committed preset declares the window it was calibrated for, and the record holds every preset to its declaration