LearnNewsExamplesServices
Frontmatter
id11236
titleStrengthen ideation-sandbox graduation→closure: RESOLVED_TO_AC scope clarity + compliance-detection guard
stateOpen
labels
documentationenhancementaimodel-experience
assigneesneo-opus-ada
createdAtMay 12, 2026, 12:23 AM
updatedAtJun 1, 2026, 10:56 AM
githubUrlhttps://github.com/neomjs/neo/issues/11236
authorneo-opus-ada
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]

Strengthen ideation-sandbox graduation→closure: RESOLVED_TO_AC scope clarity + compliance-detection guard

Open Backlog/active-chunk-12 documentationenhancementaimodel-experience
neo-opus-ada
neo-opus-ada commented on May 12, 2026, 12:23 AM

Context

Operator-surfaced 2026-05-11: "we have /ideation-sandbox. after graduation into a ticket or epic, discussions should get closed. does not really happen often. gut feeling 50%."

Empirical V-B-A confirms the friction. Out of 49 OPEN Ideas-category Discussions:

  • 14 carry graduation-shape markers but remain OPEN (~28.6% — directionally aligned with operator's 50% gut)
  • 2 clean cases (Discussion #11188 → ticket #11192 closed; Discussion #11180 → ticket #11187 open) closed manually in this session
  • 12 ambiguous cases carry only [RESOLVED_TO_AC] markers without explicit Discussion-level [GRADUATED_TO_TICKET: #N] — these are NOT closure-eligible per current skill semantics (per-OQ resolution markers, not whole-Discussion graduation)

The Problem

Layer 1: Mandate exists but compliance is poor

Prior ticket #10450 (closed 2026-04-29) already landed the skill-text mandate: ideation-sandbox-workflow.md §6.7 Step 4 explicitly says "Formally close Discussion via GraphQL closeDiscussion(reason: RESOLVED)". The text discipline is in place.

What's missing is mechanical enforcement: nothing detects authors who add [GRADUATED_TO_TICKET] without then chaining the closure mutation. The substrate currently relies on author-side discipline, which empirically fails ~30% of the time even with the mandate in place.

Layer 2: [RESOLVED_TO_AC] semantic ambiguity (per-OQ vs whole-Discussion)

The skill defines (line 37):

  • [GRADUATED_TO_TICKET] — Discussion requires standalone ticket
  • [RESOLVED_TO_AC] — Open Question resolved within the Discussion via Acceptance Criteria

But [RESOLVED_TO_AC] is per-Open-Question, not whole-Discussion. Empirical anchor: Discussion #10289 explicitly states "4 OQs [RESOLVED_TO_AC] ... 6 remaining, 3 new surfaced = 9 open" — partial resolution.

The skill is mute on: when ALL OQs in a Discussion are [RESOLVED_TO_AC] and no [GRADUATED_TO_TICKET] ever fires (because the resolution didn't need a separate ticket), should the Discussion close? Currently this state can sit open indefinitely — the substrate has no exit.

Layer 3: Stale non-graduated Discussions

Beyond graduation, there's a separate lifecycle question: Discussions that go stagnant without ever reaching graduation. Empirical sweep shows 5 Ideas-category Discussions with 1000+ days of staleness (#1754 1855d, #1749 1221d, #1881 1414d, #2049 1148d, #2220 1002d — pre-AI-era app concerns that became archaeological without an explicit close). Post-AI-era staleness band: 30-40 days for #9694, #9808, #9810, #9871, #9886.

The skill has no stale-archive policy. Discussions don't auto-archive; they just accumulate.

The Architectural Reality

Skill: .agents/skills/ideation-sandbox/references/ideation-sandbox-workflow.md

Relevant sections:

  • §4 (line 37): defines [RESOLVED_TO_AC] vs [GRADUATED_TO_TICKET] OQ-resolution tags
  • §6.7 (lines 179-188): Author Actions Post-Consensus — Step 4 mandates closure
  • §6.8 (lines 190-197): Two-Axis Substrate — graduation gate AND PR-merge gate

What's missing:

  • A unified closure-trigger matrix: which markers trigger which lifecycle transitions
  • Mechanical compliance detection (a script / daemon / pre-flight that catches non-compliance)
  • Stale-archive policy (N-days inactivity → auto-archive with reason)

Adjacent ticket: #10450 (closed) landed the mandate text — this is the enforcement + semantic-disambiguation companion.

The Fix

Three sub-prescriptions, atomic-per-AC:

Sub-prescription A: Closure-trigger matrix table in §6.7

Add an explicit table to ideation-sandbox-workflow.md §6.7 enumerating which marker combinations trigger which lifecycle action:

Marker state Whole-Discussion action Skill section
[GRADUATED_TO_TICKET: #N] (any) Close RESOLVED §6.7 Step 4
All OQs [RESOLVED_TO_AC] + no [GRADUATED_TO_TICKET] + no unresolved scope in graduation criteria Close RESOLVED (new — currently mute) NEW §6.7 sub-clause
Some OQs [RESOLVED_TO_AC] + some still pending Keep open (legitimate ongoing) clarified
No graduation marker + N days no activity Close OUTDATED (new — stale-archive policy) NEW §6.7 sub-clause

Sub-prescription B: Compliance-detection guard (mechanical layer)

Add a daemon / weekly-CI / pre-flight check that surfaces non-compliance. Options:

  • Option 1 (lowest cost): A weekly GitHub Actions cron that runs the discussion audit script + posts a one-shot A2A to the author of any non-compliant Discussion.
  • Option 2 (mid cost): Extend an existing daemon (e.g., the Retrospective daemon) with a graduation-closure-compliance sweep on each REM cycle.
  • Option 3 (high cost): A new MCP tool audit_discussion_lifecycle callable from skill execution paths to verify at-graduation-time that closure was chained.

Option 1 is the minimum viable enforcement substrate and would catch most compliance gaps before they accumulate to 30%.

Sub-prescription C: Stale-archive policy for non-graduated Discussions

Define an explicit policy in §6.7 (or new §6.8 sub-clause):

  • Non-graduated Discussions with no activity for 90 days auto-close with reason: OUTDATED via the same compliance daemon
  • Pre-AI-era app-concern Discussions (>365 days, no AI activity) get a one-time bulk archive sweep with maintainer review

Acceptance Criteria

  • AC1: ideation-sandbox-workflow.md §6.7 updated with the closure-trigger matrix table (Sub-prescription A)
  • AC2: ideation-sandbox-workflow.md §6.7 updated with explicit "all OQs [RESOLVED_TO_AC] + no remaining scope → close RESOLVED" sub-clause
  • AC3: A compliance-detection mechanism implemented (Option 1 minimum: weekly GitHub Actions cron + audit script) — script can be the same Python sweep used to build the empirical baseline in this ticket
  • AC4: Stale-archive policy codified in skill (N=90 days no-activity threshold; reason OUTDATED)
  • AC5: One-time historical sweep run to close pre-AI-era stale Discussions (5 candidates: #1754, #1749, #1881, #2049, #2220) — maintainer-reviewed first
  • AC6: The 12 ambiguous [RESOLVED_TO_AC]-only Discussions (#11210, #11171, #11076, #11002, #11033, #10634, #10630, #10629, #10608, #10354, #10309, #10289) audited under new semantics — close if all OQs resolved + no remaining scope; keep open if scope remains
  • AC7: Substrate-truth verification: the same audit script that produced the 28.6% baseline shows 0% post-implementation (no graduated-but-open Discussions); new compliance metric tracked

Out of Scope

  • Discussion content edits to retroactively add proper graduation markers
  • Migration of graduated Discussions to a different storage substrate (e.g., archive folder) — Discussion closedAt is sufficient archaeological-source preservation per existing §6.7
  • Cross-category cleanup (Q&A, General) — this ticket is scoped to Ideas-category (the Ideation Sandbox surface)
  • Author auto-DM-on-non-compliance — Option 1 weekly audit + A2A is the minimal enforcement; per-author auto-DM is over-engineered for the empirical compliance rate

Avoided Traps

  • Trap: re-codify what #10450 already landed. The skill-text mandate already exists. Rejected because that would be a no-op substrate change. The real gap is enforcement, not text.
  • Trap: write a new MCP tool just for this. audit_discussion_lifecycle is over-engineered for a substrate problem solvable by a weekly cron + GraphQL audit script. Reject Option 3; prefer Option 1.
  • Trap: auto-close any open Discussion >N days. Some Discussions are intentionally archaeological even without graduation markers (e.g., long-running ideation that's resurfaced multiple times). Stale-archive policy MUST be OUTDATED reason (not RESOLVED) so authors can distinguish auto-archive from intentional close.
  • Trap: per-OQ closure. Closing a Discussion when only SOME OQs are [RESOLVED_TO_AC] would lose the open-question archaeological trail. The matrix above explicitly keeps Discussions open if SOME OQs remain pending.

Related

  • #10450 — predecessor ticket (closed); landed the skill-text mandate this enforces
  • #11192 — Discussion #11188's graduated ticket; example of clean-case lifecycle (graduated → ticket closed → Discussion now closed in this audit)
  • #11187 — Discussion #11180's graduated ticket; example of in-flight lifecycle (graduated → ticket open → Discussion closed at graduation per §6.7 Step 4 timing)
  • #11217 — Consensus-mandate (closed); related substrate for Discussion graduation gating
  • #11195 — Step 2.5 Architectural Step-Back 30-day validation (open); parallel substrate-quality tracking
  • Discussion #10289 — empirical anchor for per-OQ semantic ambiguity (explicit "4 RESOLVED_TO_AC, 6 remaining, 3 new surfaced" framing in body)

Origin Session ID

c0d5c29d-dc70-44c8-b5af-d3f6c59936ee (operator-surfaced this session)

Handoff Retrieval Hints

  • query_raw_memories(query="ideation-sandbox graduation closure RESOLVED_TO_AC compliance enforcement")
  • ask_knowledge_base(query="discussion close after graduation ideation-sandbox skill compliance")
  • File anchors: .agents/skills/ideation-sandbox/references/ideation-sandbox-workflow.md §6.7 (closure mandate), .agents/skills/ideation-sandbox/references/ideation-sandbox-workflow.md §4 (OQ-resolution tag semantics)
  • Empirical anchor: 28.6% non-compliance rate as of 2026-05-11 (14 of 49 graduated-shape Discussions open); 2 cleanest cases closed this session as baseline correction

🤖 Generated with Claude Code