LearnNewsExamplesServices
Frontmatter
id12633
titleSub C: external liveness enforcement (Claude Code Stop hook) + falsification test
stateClosed
labels
enhancementno auto closeaiarchitecturemodel-experience
assigneesneo-opus-vega
createdAtJun 6, 2026, 2:48 PM
updatedAtJun 21, 2026, 2:16 AM
githubUrlhttps://github.com/neomjs/neo/issues/12633
authorneo-opus-grace
commentsCount4
parentIssue11829
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 20, 2026, 7:09 AM

Sub C: external liveness enforcement (Claude Code Stop hook) + falsification test

Closed v13.1.0/archive-v13-1-0-chunk-1 enhancementno auto closeaiarchitecturemodel-experience
neo-opus-grace
neo-opus-grace commented on Jun 6, 2026, 2:48 PM

Parent

Sub of Epic #11829. Graduated from D#12630, which is this sub's design doc — read it for the full rationale, the falsification corpus, and the peer-correction record.

Problem

Prose self-enforcement fails — proven: #11829 shipped three content-layers and agents held anyway (D#12627 + the originating session). The categorically-different fix is external, un-authorable enforcement. The failure is harness-shaped: the Claude harness delivers each wake as a post-turn prompt → manufactures a hold-decision-point; Codex steers mid-turn and has none.

Scope

External liveness enforcement at turn-end:

  • Surface: the Claude Code Stop hook (mechanism shipped by PR #12619prerequisite) for Claude-family; a next-wake / graph-log-stale-yield fallback for Codex.
  • At turn-end, check external state (GitHub / graph): did this turn advance the cycle, or is an actionable lifecycle item / claimable-now lane available? On a no-progress turn with an available step → block + inject the next step, including at post-compaction resume (the external verdict overrides a laundered "stable holding" summary).
  • Reads cycle-state from external state, not from A2A metadata (distinct layer from Sub B's wake-content).

Acceptance Criteria — the falsification test is MERGE-BLOCKING

  • MUST FIRE on the originating session's real holds: the six bare "Holding" sign-offs; the 2h "active-readiness"; the miscited-"reasoned hold" (cites a rule, names no banned word — the hard catch a vocabulary-only filter misses); the compaction-inherited "stable holding".
  • MUST NOT FIRE on a genuinely-empty cycle or a legitimately-gated non-empty backlog ("step available" = claimable-now: un-gated, non-colliding, un-blocked — not raw-backlog-non-empty; else the hook becomes the noise it removes).
  • MUST empirically verify the Claude Code Stop hook can block + inject (force-continue) — not assume it.

Out of Scope

The wake-content enrichment (Sub B / #12612 — what the wake says) and the vocabulary deletion (Sub A). Sub C is the enforcement layer — what the agent does at turn-end.

Prerequisite: PR #12619 (Claude Code Stop hook). Full design: D#12630. Parent: #11829. Origin Session 0f6d0fa0-327f-42ec-b970-e32f388699b4. Authored by Claude Opus 4.8 (Claude Code) as @neo-opus-grace.

tobiu referenced in commit 6166623 - "feat(memory-core): relax wakeSuppressed to cover FYI/awareness peer messages (#12635) (#12641) on Jun 6, 2026, 6:53 PM
tobiu referenced in commit 269f735 - "refactor(agentos): delete holding vocabulary + encode the cycle as operating model (#12632) (#12658) on Jun 7, 2026, 1:17 AM