Skip to content

fix: align intent Plan/ingest AC gate + clear audit placeholder (iss-67) - #35

Merged
REPPL merged 2 commits into
mainfrom
auto/iss-67-intent-fidelity
Jul 12, 2026
Merged

fix: align intent Plan/ingest AC gate + clear audit placeholder (iss-67)#35
REPPL merged 2 commits into
mainfrom
auto/iss-67-intent-fidelity

Conversation

@REPPL

@REPPL REPPL commented Jul 12, 2026

Copy link
Copy Markdown
Owner

Resolves iss-67 (native ledger) — intent-lifecycle fidelity gaps from the sweep.

Fixes (internal/core/intent)

  • C9 — Plan/ingest AC coupling. Plan accepted an ## Acceptance Criteria section with any non-blank line, but the ingest gate counts only top-level -/* bullets. So a prose-only or numbered section could be planned, then dead-lettered every fidelity verdict forever (zero positional criteria to map). hasAcceptanceCriteria now delegates to countAcceptanceCriteria, so the Plan gate and the ingest gate agree on what "has criteria" means.
  • seed3 — stale audit placeholder. appendToAuditNotes left the template's Audit Notes placeholder (_Empty. Populated by…_) sitting above the first real review block. It's now dropped when a block lands. The matcher tolerates both delimiter styles the templates have used (italic _…_ and the older angle-bracket <Empty until…>), so wording drift can't leave a placeholder behind — and a real audit line never starts that way, so it can't eat one. Backfills itd-80, the one already-shipped record carrying a stale placeholder.
  • C10 — misleading doc. ReEmitReview's comment claimed it "re-parks the OWED stub," but a terminal (INGESTED/DEAD_LETTER) receipt is not re-reviewed — it returns that status unchanged (the CLI surfaces already_ingested/already_dead_letter, so it was never truly silent). Corrected the doc; behaviour and status-reporting were already right.

Tests (each watched fail on revert)

  • TestPlanRefusesBulletlessAcceptanceCriteria — a prose-only AC section is refused at Plan.
  • TestFirstReviewBlockClearsPlaceholder — both placeholder styles are cleared when a review block lands.

make preflight + make record-lint green (including the itd-80 backfill). Reviewed: security-reviewer PASS (the placeholder strip can't erase real content and doesn't touch the untrusted-verdict path or the receipt digest), ruthless-reviewer SHIP; both review NICE-TO-HAVEs (broaden the matcher, backfill itd-80) applied.

Deferred (seed9)

A DEAD_LETTER re-ingest of a byte-identical payload rewrites the same marker block. Purely cosmetic — the committed record is identical either way, and short-circuiting it would thread a new "unchanged" status through the delicate recovery path where a fixed payload must still move DEAD_LETTER→INGESTED. No correctness impact.

Assisted-by: Claude:claude-opus-4-8

REPPL added 2 commits July 12, 2026 11:59
Three intent-lifecycle fidelity fixes:

- C9: Plan accepted an Acceptance Criteria section with any non-blank line, but
  ingest counts only top-level -/* bullets — so a prose-only or numbered section
  planned, then dead-lettered every fidelity verdict forever (zero positional
  criteria). hasAcceptanceCriteria now delegates to countAcceptanceCriteria, so
  the Plan gate and the ingest gate agree on what 'has criteria' means.

- seed3: appendToAuditNotes preserved the intent template's Audit Notes
  placeholder above the first real review block. It is now dropped when a block
  lands. The matcher tolerates both delimiter styles the templates have used
  (italic _Empty..._ and angle-bracket <Empty...>) so wording drift can't leave a
  placeholder behind; a real audit line never starts that way. Backfills the one
  already-shipped record that carried a stale placeholder (itd-80).

- C10: ReEmitReview's doc claimed it 're-parks the OWED stub' but a terminal
  (INGESTED/DEAD_LETTER) receipt is not re-reviewed — it returns that status
  unchanged (the CLI surfaces it). Corrected the doc; behaviour was already right.

Deferred (seed9): a DEAD_LETTER re-ingest of a byte-identical payload rewrites the
same marker block. Purely cosmetic — the record is byte-identical either way, and
short-circuiting it would thread a new status through the recovery path (a fixed
payload must still move DEAD_LETTER -> INGESTED). No correctness impact.

Reviewed: security PASS + ruthless SHIP; both review NICE-TO-HAVEs (broaden the
placeholder matcher, backfill itd-80) applied.

Assisted-by: Claude:claude-opus-4-8
Assisted-by: Claude:claude-opus-4-8
@REPPL
REPPL merged commit 679d2ea into main Jul 12, 2026
12 checks passed
@REPPL
REPPL deleted the auto/iss-67-intent-fidelity branch July 12, 2026 11:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant