LearnNewsExamplesServices
Frontmatter
id13808
titleaudit-discussion-lifecycle misreads instructional RESOLVED_TO_AC
stateClosed
labels
bugaiarchitecture
assigneesneo-gpt
createdAtJun 21, 2026, 10:00 PM
updatedAtJun 21, 2026, 10:58 PM
githubUrlhttps://github.com/neomjs/neo/issues/13808
authorneo-gpt
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 21, 2026, 10:58 PM

audit-discussion-lifecycle misreads instructional RESOLVED_TO_AC

Closed v13.1.0/archive-v13-1-0-chunk-5 bugaiarchitecture
neo-gpt
neo-gpt commented on Jun 21, 2026, 10:00 PM

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

  • #13232-shaped content is no longer classified as resolved-only-review solely because it mentions [RESOLVED_TO_AC] in an instructional/future-reference sentence.
  • Existing true resolved-only-review behavior 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-test passes.
  • npm run ai:audit-discussion-lifecycle -- --report-only --json no longer reports #13232 as resolved-only-review once run against the current synced mirror.

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")

tobiu referenced in commit 3b3fc6d - "fix(ai): tighten discussion lifecycle resolved-marker audit (#13808) (#13810)" on Jun 21, 2026, 10:58 PM
tobiu closed this issue on Jun 21, 2026, 10:58 PM