Context
Release classification: post-release / boardless (diagnostic maintenance bug; not release-blocking).
During no-hold lifecycle cleanup on 2026-06-21, npm run ai:audit-discussion-lifecycle correctly surfaced several graduated-open Discussions. After live GitHub verification, those were closed as RESOLVED.
The same audit also reported Discussion #13232 as resolved-only-review, but live inspection showed this is a false positive: the Discussion body explicitly says it is a seed only and is not proposed for graduation, has unresolved Open Questions, has no comments, and has no terminal OQ disposition.
Live latest-open sweep: checked latest 20 open issues immediately before filing; no equivalent issue found.
A2A in-flight claim sweep: checked latest 30 all-status messages immediately before filing; no overlapping [lane-claim] / [lane-intent] found.
Duplicate keyword sweeps: no open/all GitHub issue matched audit-discussion-lifecycle RESOLVED_TO_AC false positive, resolved-only-review RESOLVED_TO_AC audit-discussion-lifecycle, or Discussion Lifecycle Closure Audit false positive.
The Problem
ai/scripts/diagnostics/audit-discussion-lifecycle.mjs classifies a Discussion as resolved-only-review when the body contains [RESOLVED_TO_AC] and hasOpenScope(body) returns false.
#13232 contains [RESOLVED_TO_AC] only in an instructional sentence:
High-blast (...) -> a peer `STEP_BACK` cross-substrate sweep is required before any `[RESOLVED_TO_AC]` / graduation.
That is not a terminal OQ marker. The live body also contains strong non-terminal language:
it is not proposed for graduation this turn
Seeding only
Open Questions
Ready-to-graduate when...
The current script already has a defensive hasGraduatedMarker() path that ignores future/criteria references to [GRADUATED_TO_TICKET], but the RESOLVED_RE path lacks equivalent line-level semantics.
The Architectural Reality
ai/scripts/diagnostics/audit-discussion-lifecycle.mjs is a read-only diagnostic guard for Ideation Sandbox lifecycle hygiene. It scans the synced discussion mirror files under resources/content/discussions/**, not live GitHub state. That means two distinct accuracy constraints matter:
- The script can be stale until sync refreshes live closure state.
- The classifier still needs semantic precision so it does not recommend closing active ideation because a marker token appears in instructions or future criteria prose.
Relevant current implementation:
GRADUATED_RE / hasGraduatedMarker(body) already avoid some future-reference false positives.
RESOLVED_RE = /\[RESOLVED_TO_AC\]/i is a raw body-wide token check.
hasOpenScope(body) currently misses seed/open phrasing used by #13232.
The Fix
Tighten the resolved-only-review path in ai/scripts/diagnostics/audit-discussion-lifecycle.mjs so [RESOLVED_TO_AC] only counts as terminal when it appears as an actual OQ disposition line, not as an instructional/future-reference token.
Likely shape:
- Add a
hasResolvedDispositionMarker(body) helper mirroring the line-level discipline in hasGraduatedMarker(body).
- Ignore lines containing phrases such as
before any, graduation criteria, ready-to-graduate, candidate, or other future/instructional references.
- Expand open-scope detection to catch seed/proposal language such as
not proposed for graduation, Seeding only, and unresolved Open Questions sections when no terminal disposition markers are present.
- Extend
--self-test fixture coverage with a #13232-shaped case: instructional [RESOLVED_TO_AC] plus seed/open language must not produce resolved-only-review.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
ai:audit-discussion-lifecycle resolved-only-review classification |
Ideation Sandbox lifecycle closure audit + current script JSDoc |
Only terminal OQ disposition markers produce resolved-only-review; instructional marker references do not |
Keep reporting stale-open when age threshold is met, but do not recommend RESOLVED closure from instructional text |
Existing script help / self-test comments |
npm run ai:audit-discussion-lifecycle -- --self-test; focused fixture or live mirror check for #13232 |
Decision Record impact
Aligned with existing Ideation Sandbox lifecycle closure substrate. No ADR change required.
Acceptance Criteria
Out of Scope
- Live GitHub sync freshness. The script may still report already-closed Discussions until
resources/content/discussions/** refreshes.
- Automatically closing Discussions.
- Changing stale-open policy for old Discussions.
Avoided Traps
- Do not solve this by globally treating any
Open Questions heading as active; historical Discussions may preserve headings after terminal dispositions.
- Do not weaken the
graduated-open path; the existing line-level marker guard caught real lifecycle gaps.
- Do not make the diagnostic query live GitHub as part of this ticket; that is a separate freshness/architecture question.
Related
- Discussion
#13232 — false-positive example.
ai/scripts/diagnostics/audit-discussion-lifecycle.mjs — affected diagnostic.
.agents/skills/ideation-sandbox/audits/discussion-lifecycle-closure.md — lifecycle semantics.
Origin Session ID: 69f79662-2fbe-403a-a124-78bca1abdb16
Retrieval Hint: query_raw_memories("audit-discussion-lifecycle #13232 RESOLVED_TO_AC false positive seed only")
Context
Release classification: post-release / boardless (diagnostic maintenance bug; not release-blocking).
During no-hold lifecycle cleanup on 2026-06-21,
npm run ai:audit-discussion-lifecyclecorrectly surfaced severalgraduated-openDiscussions. After live GitHub verification, those were closed asRESOLVED.The same audit also reported Discussion
#13232asresolved-only-review, but live inspection showed this is a false positive: the Discussion body explicitly says it is a seed only and is not proposed for graduation, has unresolved Open Questions, has no comments, and has no terminal OQ disposition.Live latest-open sweep: checked latest 20 open issues immediately before filing; no equivalent issue found. A2A in-flight claim sweep: checked latest 30 all-status messages immediately before filing; no overlapping
[lane-claim]/[lane-intent]found. Duplicate keyword sweeps: no open/all GitHub issue matchedaudit-discussion-lifecycle RESOLVED_TO_AC false positive,resolved-only-review RESOLVED_TO_AC audit-discussion-lifecycle, orDiscussion Lifecycle Closure Audit false positive.The Problem
ai/scripts/diagnostics/audit-discussion-lifecycle.mjsclassifies a Discussion asresolved-only-reviewwhen the body contains[RESOLVED_TO_AC]andhasOpenScope(body)returns false.#13232contains[RESOLVED_TO_AC]only in an instructional sentence:High-blast (...) -> a peer `STEP_BACK` cross-substrate sweep is required before any `[RESOLVED_TO_AC]` / graduation.That is not a terminal OQ marker. The live body also contains strong non-terminal language:
The current script already has a defensive
hasGraduatedMarker()path that ignores future/criteria references to[GRADUATED_TO_TICKET], but theRESOLVED_REpath lacks equivalent line-level semantics.The Architectural Reality
ai/scripts/diagnostics/audit-discussion-lifecycle.mjsis a read-only diagnostic guard for Ideation Sandbox lifecycle hygiene. It scans the synced discussion mirror files underresources/content/discussions/**, not live GitHub state. That means two distinct accuracy constraints matter:Relevant current implementation:
GRADUATED_RE/hasGraduatedMarker(body)already avoid some future-reference false positives.RESOLVED_RE = /\[RESOLVED_TO_AC\]/iis a raw body-wide token check.hasOpenScope(body)currently misses seed/open phrasing used by#13232.The Fix
Tighten the
resolved-only-reviewpath inai/scripts/diagnostics/audit-discussion-lifecycle.mjsso[RESOLVED_TO_AC]only counts as terminal when it appears as an actual OQ disposition line, not as an instructional/future-reference token.Likely shape:
hasResolvedDispositionMarker(body)helper mirroring the line-level discipline inhasGraduatedMarker(body).before any,graduation criteria,ready-to-graduate,candidate, or other future/instructional references.not proposed for graduation,Seeding only, and unresolvedOpen Questionssections when no terminal disposition markers are present.--self-testfixture coverage with a#13232-shaped case: instructional[RESOLVED_TO_AC]plus seed/open language must not produceresolved-only-review.Contract Ledger Matrix
ai:audit-discussion-lifecycleresolved-only-reviewclassificationresolved-only-review; instructional marker references do notstale-openwhen age threshold is met, but do not recommendRESOLVEDclosure from instructional textnpm run ai:audit-discussion-lifecycle -- --self-test; focused fixture or live mirror check for#13232Decision Record impact
Aligned with existing Ideation Sandbox lifecycle closure substrate. No ADR change required.
Acceptance Criteria
#13232-shaped content is no longer classified asresolved-only-reviewsolely because it mentions[RESOLVED_TO_AC]in an instructional/future-reference sentence.resolved-only-reviewbehavior remains covered by fixture/self-test coverage.hasGraduatedMarker()behavior remains unchanged for ticketed graduation markers and future-reference exclusions.npm run ai:audit-discussion-lifecycle -- --self-testpasses.npm run ai:audit-discussion-lifecycle -- --report-only --jsonno longer reports#13232asresolved-only-reviewonce run against the current synced mirror.Out of Scope
resources/content/discussions/**refreshes.Avoided Traps
Open Questionsheading as active; historical Discussions may preserve headings after terminal dispositions.graduated-openpath; the existing line-level marker guard caught real lifecycle gaps.Related
#13232— false-positive example.ai/scripts/diagnostics/audit-discussion-lifecycle.mjs— affected diagnostic..agents/skills/ideation-sandbox/audits/discussion-lifecycle-closure.md— lifecycle semantics.Origin Session ID: 69f79662-2fbe-403a-a124-78bca1abdb16
Retrieval Hint:
query_raw_memories("audit-discussion-lifecycle #13232 RESOLVED_TO_AC false positive seed only")