Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Closed |
| createdAt | Jun 26, 2026, 6:41 PM |
| updatedAt | Jul 27, 2026, 12:06 AM |
| closedAt | Jun 26, 2026, 6:42 PM |
| mergedAt | |
| branches | dev ← feat/14119-ledger-drift-spike |
| url | https://github.com/neomjs/neo/pull/14122 |
| contentTrust | |
| projected | |
| quarantined | 1 |
| signals | [] |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #14122 [QUARANTINED_URL: github.com] does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like ``Resolves #N(mandatory closing keyword —Refs/Related alone is NOT sufficient) is missing.
Visible anchors missing (full list)
- ``Resolves #N
(mandatory closing keyword —Refs/Relatedalone is NOT sufficient)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

Closing: a feasibility spike legitimately resolves no leaf, but the PR-body lint (correctly) requires Resolves #N — so a spike-without-a-close-target doesn't fit the PR mold (forcing a Resolves #14119 would over-claim; the spike doesn't implement the full pre-flight). The artifact lives on branch feat/14119-ledger-drift-spike (commit 79b3bd7d5, 7/7 green); feasibility result reported on #14119 for the routing decision.
Refs #14119 — feasibility spike, NOT a resolution. Draft: do not merge until the lead routes #14119 (implement-here vs ideation); disposition is wire-or-retire after that call.
What this proves
#14119 asks for an author-side check that flags when a PR's shipped consumed-surface drifts from the originating ticket's Contract Ledger — but flagged genuine design ambiguity ("how much of 'drift' is mechanically detectable, and where the check belongs"). This spike de-risks the mechanical-feasibility half of that question with a working, tested
detectSignatureDrift:buildDimensionConsistencyDiagnosis(samples, observedAt, serviceId)) and the shipped declaration (export function buildDimensionConsistencyDiagnosis({samples, observedAt, serviceId})).unparseable(never a false-clean).Finding: mechanical signature-drift detection is feasible and cheap. Return-shape + semantic/behavioural drift are deliberately out of scope (they stay reviewer judgement) — so the spike does NOT claim to replace the review-time §5.4 audit; it front-runs the mechanical signature slice author-side.
Evidence: L2 (unit, pure function, no I/O). 7/7 green. This is a proof-of-concept; it is not wired into agent-preflight or the pull-request workflow — that integration point is the open design the routing decision settles.
Deltas from ticket
Test Evidence
npm run test-unit -- test/playwright/unit/ai/buildScripts/util/contractLedgerDrift.spec.mjs→ 7 passed (the real positional-vs-destructured case; no-drift; param-set add; name drift; defaults/types normalized; unparseable→flagged; parser classification).npm run agent-preflight→ gates passed.Post-Merge Validation
detectSignatureDriftinto the chosen integration point (agent-preflight step or pull-request workflow), extend toward return-shape drift, and flip Refs→Resolves on the wired PR. If routed to ideation: this branch is the feasibility input; retire it or fold it into the graduated design.Authored by Ada (Claude Opus 4.8, Claude Code). Session fe9c04d6-1aae-4017-8d53-19b0e5aaf809.