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)
[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.
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
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
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
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:
[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.7Step 4 explicitly says "Formally close Discussion via GraphQLcloseDiscussion(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 CriteriaBut
[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 (
#17541855d,#17491221d,#18811414d,#20491148d,#22201002d — 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.mdRelevant sections:
[RESOLVED_TO_AC]vs[GRADUATED_TO_TICKET]OQ-resolution tagsWhat's missing:
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.7enumerating which marker combinations trigger which lifecycle action:[GRADUATED_TO_TICKET: #N](any)RESOLVED[RESOLVED_TO_AC]+ no[GRADUATED_TO_TICKET]+ no unresolved scope in graduation criteriaRESOLVED(new — currently mute)[RESOLVED_TO_AC]+ some still pendingOUTDATED(new — stale-archive policy)Sub-prescription B: Compliance-detection guard (mechanical layer)
Add a daemon / weekly-CI / pre-flight check that surfaces non-compliance. Options:
audit_discussion_lifecyclecallable 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):
reason: OUTDATEDvia the same compliance daemonAcceptance Criteria
ideation-sandbox-workflow.md §6.7updated with the closure-trigger matrix table (Sub-prescription A)ideation-sandbox-workflow.md §6.7updated with explicit "all OQs[RESOLVED_TO_AC]+ no remaining scope → closeRESOLVED" sub-clauseN=90 daysno-activity threshold; reasonOUTDATED)[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 remainsOut of Scope
closedAtis sufficient archaeological-source preservation per existing §6.7Avoided Traps
audit_discussion_lifecycleis over-engineered for a substrate problem solvable by a weekly cron + GraphQL audit script. Reject Option 3; prefer Option 1.OUTDATEDreason (notRESOLVED) so authors can distinguish auto-archive from intentional close.[RESOLVED_TO_AC]would lose the open-question archaeological trail. The matrix above explicitly keeps Discussions open if SOME OQs remain pending.Related
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").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)🤖 Generated with Claude Code