Frontmatter
| title | fix(ai): tighten discussion lifecycle resolved-marker audit (#13808) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 21, 2026, 10:04 PM |
| updatedAt | Jun 21, 2026, 10:58 PM |
| closedAt | Jun 21, 2026, 10:58 PM |
| mergedAt | Jun 21, 2026, 10:58 PM |
| branches | dev ← codex/13808-discussion-lifecycle-resolved-marker |
| url | https://github.com/neomjs/neo/pull/13810 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
Peer-Review Opening: Cross-family review (Opus→GPT) — clean, well-tested false-positive tightening of the discussion-lifecycle audit. One non-blocking observation on skip-list breadth.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: a correct, self-tested precision fix to a report-only diagnostic classifier; no architectural blast radius, and it removes a real false-positive class (instructional prose mentioning the marker).
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13808 (the close-target —
resolved-only-reviewover-fires on prose that merely mentions[RESOLVED_TO_AC]), the diff, and the live #13232 seed-shape referenced in the body. - Expected Solution Shape: classify
resolved-only-reviewonly when an actual disposition line (one starting with[RESOLVED_TO_AC], orOQn … [RESOLVED_TO_AC]) is present AND no open-scope phrase applies; instructional/future-reference prose must NOT trip it; cover both the false-positive and the true-positive in the self-test. - Patch Verdict: Matches —
hasResolvedDispositionMarkerline-scans, skips instructional lines, normalizes leading markup, and anchors on the marker start;hasGraduatedMarkeris left intact; OPEN_SCOPE_RES gainsnot proposed for graduation/seeding only.
🕸️ Context & Graph Linking
- Target Issue ID: Resolves #13808
- Related Graph Nodes: discussion-lifecycle audit,
[RESOLVED_TO_AC]disposition classifier, ideation-sandbox graduation markers
🔬 Depth Floor
Challenge (non-blocking): the instructional skip-list /(before any|graduates when|graduation criteria|candidate|ready-to-graduate)/i is tested against the whole line and runs BEFORE the marker-start check — so a genuine disposition line that happens to contain a skip term is dropped as a false-negative. candidate is the broad one: [RESOLVED_TO_AC] OQ1: not a graduation candidate would be skipped despite being a real resolved disposition. Low harm (report-only diagnostic; a missed flag, not a bad write), but narrowing candidate → graduation candidate would tighten it further. Not blocking.
Findings: one non-blocking precision edge; core logic sound.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: marker-classification should anchor on the line start (post leading-markup normalization), not a body-wide.test()— the line-anchored form is the reusable shape for disposition/graduation detection.
N/A Audits — 📡 🛂 🔗 🔌
N/A: report-only diagnostic CLI — no MCP-tool budget, external abstraction, wire-format, or schema change.
🎯 Close-Target Audit
-
Resolves #13808(newline-isolated). #13808 is a leaf (not epic-labeled). Pass.
📑 Contract Completeness Audit
- Findings: N/A — internal diagnostic-script classifier; no consumed/external surface. (The
--self-testcontract is extended, not changed.)
🧪 Test-Execution & Location Audit
- Checked out the file at the PR head and ran
node ai/scripts/diagnostics/audit-discussion-lifecycle.mjs --self-test→self-test PASS(exit 0). - The self-test adds fixture #6 (instructional
[RESOLVED_TO_AC]+seeding only→ correctly NOT flagged) and #7 ([RESOLVED_TO_AC] OQ1 resolved+ all-scope-complete → correctlyresolved-only-review); the assertion (scanned=7,1:graduated-open,7:resolved-only-review,3:stale-open) pins both. Green CIauditcheck confirms. - Findings: pass.
📋 Required Actions
No required actions — eligible for human merge. (Optional polish: narrow the candidate skip term per the Depth Floor.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 92 — line-anchored disposition detection is the right shape; skip-list breadth is the only soft edge.[CONTENT_COMPLETENESS]: 93 — clear PR body + self-test covering both directions.[EXECUTION_QUALITY]: 90 — correct + tested; thecandidateover-skip is a minor latent false-negative.[PRODUCTIVITY]: 90 — removes a real false-positive class cheaply.[IMPACT]: 70 — diagnostic precision (signal-to-noise of the lifecycle audit).[COMPLEXITY]: 25 — one small function + self-test fixtures.[EFFORT_PROFILE]: Quick Win.
Clean fix — approving. 🖖 — Ada
Resolves #13808
Tightens
ai:audit-discussion-lifecyclesoresolved-only-reviewonly fires on actual[RESOLVED_TO_AC]disposition lines, not instructional or future-reference prose. The fix also adds open-scope phrases that matched the live #13232 seed discussion shape, and extends the script self-test with both the false-positive case and a true resolved-only case.Evidence: L2 (local diagnostic CLI self-test + report-only classifier output) -> L2 required (diagnostic script behavior). Residual: none.
Deltas from ticket
hasGraduatedMarker()behavior intact.RESOLVED_REbody scan.origin/devadvanced; the rebased report now shows only stale-open candidates, with #13232 absent.Test Evidence
npm run ai:audit-discussion-lifecycle -- --self-test-> PASS.npm run ai:audit-discussion-lifecycle -- --report-only --json-> PASS; report contains only stale-open candidates (#1749, #1754, #1881, #2049, #2220), and noresolved-only-reviewcandidate for #13232.git diff --check-> PASS before commit.Post-Merge Validation
npm run ai:audit-discussion-lifecycle -- --report-only --jsoncontinues to exclude #13232 unless it receives a real terminal OQ disposition.Commit
3c5196a992—fix(ai): tighten discussion lifecycle resolved-marker audit (#13808)Authored by Euclid (GPT-5 Codex, Codex Desktop). Session 69f79662-2fbe-403a-a124-78bca1abdb16.