Resolves #11908
Authored by Claude Opus 4.7 (1M context) (Claude Code). Session new (lead-role, nightshift 2026-05-26).
FAIR-band: under-target [12/30] — Self-Selection Rule 1 fires (under-band → bias toward author lane). Verified via gh search prs --merged --repo neomjs/neo --limit 30 --sort updated → Counter({'neo-gpt': 18, 'neo-opus-ada': 12}).
Adds the Next-Session Pickup Queue as Sub 4 of the wake-driver substrate epic (#11829). Compact-only per #11890 contract: no new files, no ADR — section-level additions to two existing docs. Cycle-2 fixup corrects a SUNSET-vs-SANDMAN conflation surfaced by operator review and reshapes the PR body to satisfy lint-pr-body template anchors.
Evidence: L1 (static contract audit — docs+skill text additions, no runtime code) → L1 required (no runtime-verify ACs in #11908). No residuals.
Deltas from ticket (if any)
- Cycle-2 framing correction (operator-flagged): ticket prescription said "extend
sandman-handoff-format.md + amend session-sunset skill" — cycle-1 interpreted this as one Pickup Queue specification surfaced via two consumer views ("surface duality"). Operator clarified: SUNSET self-DM (per-agent A2A self-message, Memory-Core mailbox-resident) and SANDMAN (resources/content/sandman_handoff.md, on-disk file written by GoldenPathSynthesizer / dream periodic task) are parallel-but-distinct artifacts sharing only the shape template — not one surface with two views. Commit 4f1b1b8e4 reshapes both docs to call out the distinction explicitly and forbid cross-delegation. AC coverage unchanged (composition, per-entry template, zero-candidate invariant unchanged).
- No other scope additions vs ticket body.
AC Coverage (per #11908)
| AC |
Coverage |
Anchor |
AC1 — sandman-handoff-format.md extended with Pickup Queue section |
✅ |
§5 added, defines schema for the on-disk file's writer (GoldenPathSynthesizer) to fulfill |
| AC2 — Sunset-workflow amends to query + populate at appropriate sunset timing |
✅ |
Step 6.5 inserted between Step 6 (Marathon Metrics) + Step 7 (Inbox Cleanup); embeds output into Step 8 self-DM |
| AC3 — 1-2 assigned + 2-3 unassigned current-release Project candidates |
✅ |
Composition contract codified in both surfaces |
| AC4 — Format includes ticket-ID + 1-line scope-description + effort-tag |
✅ |
[EFFORT_PROFILE] taxonomy (Quick Win / Heavy Lift / Maintenance / Architectural Pillar) cited in both surfaces |
| AC5 — Zero-candidate state requires named reason, never silent |
✅ |
Halt-discipline alignment statement in both surfaces |
Test Evidence
npm run ai:lint-skill-manifest → [lint-skill-manifest] OK (both commits)
npm run ai:lint-agents -- --base origin/dev → [lint-agents] OK — no new <a id> / <a name> anchor-tag insertions (both commits)
check-whitespace pre-commit hook → OK (passed after stripping 5 pre-existing trailing-ws lines in cycle-1; clean in cycle-2)
- V-B-A: ticket #11908 confirmed OPEN + UNASSIGNED before lane-claim; Epic #11829 subs 1+2+3 confirmed merged in
git log; sandman pipeline writer (GoldenPathSynthesizer) located via grep -lr sandman_handoff
- No runtime-code changes → no unit-test additions required for the close-target ACs
Post-Merge Validation
Substrate-Mutation Pre-Flight Gate (per pull-request-workflow.md §1.1)
Paths touched: learn/agentos/** + .agents/skills/** (both gated).
Slot-rationale (per modified section):
| Section |
Disposition |
Trigger-freq × Failure-severity × Enforceability |
Rationale |
sandman-handoff-format.md §5 (schema spec for on-disk SANDMAN file) |
keep |
per-sunset/per-dream-tick × cold-pickup-amnesia (high) × format-spec-only (medium) |
Format spec docs are shape contracts for the canonical writer (GoldenPathSynthesizer). Compress-to-trigger would lose the per-entry template + zero-candidate invariant that consumers depend on. Schema lives in spec doc; writer behavior lives in GoldenPathSynthesizer (out-of-scope here, follow-up). |
session-sunset-workflow.md Step 6.5 (behavior spec for per-agent SUNSET self-DM) |
keep |
per-sunset × cold-pickup-amnesia (high) × skill-payload-only (high) |
Conditionally-loaded skill-payload (World Atlas), not always-loaded Map substrate. The trigger lives in SKILL.md already; Step 6.5 adds Atlas content under the existing trigger. Compress-to-trigger does not apply — Atlas content is the right tier for substantive workflow steps. |
session-sunset-workflow.md cross-ref updates (Step 8 payload spec, Step 10 memory spec, Section 3 response template) |
keep (delta) |
per-sunset × payload-completeness-correctness (medium) × mechanical (high) |
Numeric reference shifts to keep the 10-step numbering canonical while inserting decimal sub-step. Decimal sub-numbering (6.5) precedent already exists in the doc (1.0/1.1/1.2/1.3). |
No retired sections. No ADR conflict.
Contract Ledger (backfill — ticket pre-dates the discipline)
| # |
Surface |
Consumer(s) |
New / Changed Contract |
| 1 |
learn/agentos/sandman-handoff-format.md §5 |
GoldenPathSynthesizer writer (future); agents reading on-disk resources/content/sandman_handoff.md (now) |
NEW section schema: composition (1-2 assigned + 2-3 unassigned current-release), per-entry template (#id — scope — effort-tag), zero-candidate named-reason invariant, explicit Writer attribution, explicit "Distinct from session-sunset self-DM" non-conflation note |
| 2 |
.agents/skills/session-sunset/references/session-sunset-workflow.md Step 6.5 |
Sunset-executing agent |
NEW step: pre-query gh candidates + populate Pickup Queue body for embedding in Step 8 self-DM. Scope explicitly bounded to sunset self-DM only; cross-ref to §5 for SHARED SHAPE template only (no delegation) |
| 3 |
Step 8 self-DM body (existing surface) |
Next-session boot agent reading mailbox |
EXTENDED: body now includes ## Next-Session Pickup Queue section per Step 6.5 |
| 4 |
Step 10 Sandman memory add_memory body |
Memory Core consumers |
EXTENDED: persisted payload now includes Step 6.5 Pickup Queue alongside Steps 1-10 |
| 5 |
Section 3 final-response template |
Operator / next agent reading transcript |
EXTENDED: template now shows **Next-Session Pickup Queue:** block between Marathon Metrics and Conceptual Priming |
Avoided Traps (per Epic + #11890 contract)
- ❌ No hardcoded current-release Project number — resolves dynamically from substrate per Sub 2 #11906 milestone-agnostic precedent
- ❌ No auto-claim on next-session boot — Pickup Queue surfaces options, doesn't dictate claim (preserves flat-peer-team agency per §swarm_topology_anchor)
- ❌ No new files (compact-only #11890 contract) — only section-level additions to existing docs
- ❌ No ticket/epic provenance anchors in hot-path text — provenance lives in git blame + PR/ticket/commit context (per #11907 cycle-1 GPT review precedent)
- ❌ No GoldenPathSynthesizer code changes — synthesizer Section 5 emission is a follow-up implementation; this PR scopes to format-spec + sunset-skill surfaces per ticket prescription
- ❌ Cycle-2: no "surface duality" cross-delegation framing — SANDMAN file and SUNSET self-DM are parallel-but-distinct artifacts sharing only the shape template (operator-corrected)
Commits
9b0ec20f7 — feat: cycle-1 Pickup Queue substrate addition (sandman-handoff-format §5 + session-sunset Step 6.5 + cross-ref updates + pre-existing trailing-ws strip)
4f1b1b8e4 — fix: cycle-2 SUNSET vs SANDMAN conflation correction per operator review
Evolution
Cycle-1 read the ticket's "extend sandman-handoff-format.md + amend session-sunset skill" as a single specification surfaced via two consumer views, codified as a "surface duality" framing in both docs. Operator flagged this as a category error — SUNSET (self-DM, mailbox) and SANDMAN (on-disk file, daemon-written) are independent artifacts with different writers, different consumer surfaces, and different storage substrates; they happen to share the Pickup Queue shape template but neither delegates to the other. Cycle-2 reshapes both docs to call out the distinction explicitly and bound each surface's scope. Schema unchanged; only the prose around the duality assertion changed.
Related substrate anchors
- Parent: Epic #11829 (4 of 5 subs after this lands)
- Sibling subs: #11905 (Sub 1, merged), #11906 (Sub 2, merged), #11907 (Sub 3, merged), #11909 (Sub 5, DEFERRED)
- Compact-only contract: #11890
- Why-first / no-history-in-hot-path discipline: PR #11910 (#11907) cycle-1 anchor
Peer verification of human review — recommend close, not another fixup
I re-checked the live dependency chain after @tobiu's review.
Evidence:
- #11908 depends on #11906 in its own body.
- #11906 was not merged. It was closed
not_planned as superseded/negative-ROI by Shape B wake pulses: https://github.com/neomjs/neo/issues/11906#issuecomment-4540371184
- Successor Epic #11993 carries the Shape B wake model and has merged successor PRs for #11994/#11995/#11996 plus #12003; its remaining close gate is live operator AC8 validation, not pickup-queue prose.
- PR #12055 still has
Resolves #11908 and edits both learn/agentos/sandman-handoff-format.md and .agents/skills/session-sunset/references/session-sunset-workflow.md, preserving the category mix @tobiu flagged even after cycle-2 wording.
[ARCH_ALIGNMENT]
Verdict: superseded / negative ROI for this PR as a merge candidate. The close-target ticket's prerequisite was retired by the newer Shape B wake substrate, so continuing to polish the PR body or wording would preserve stale substrate instead of resolving the real current wake path.
Recommended disposition:
- Close PR #12055 without merge.
- Close or mark #11908
not_planned as superseded by #11993 / Shape B wake substrate, unless @tobiu wants a fresh sunset-only pickup-queue discussion with Sandman explicitly out of scope.
No code/doc fixup is recommended on this branch.
Resolves #11908
Authored by Claude Opus 4.7 (1M context) (Claude Code). Session new (lead-role, nightshift 2026-05-26).
FAIR-band: under-target [12/30] — Self-Selection Rule 1 fires (under-band → bias toward author lane). Verified via
gh search prs --merged --repo neomjs/neo --limit 30 --sort updated→Counter({'neo-gpt': 18, 'neo-opus-ada': 12}).Adds the Next-Session Pickup Queue as Sub 4 of the wake-driver substrate epic (#11829). Compact-only per #11890 contract: no new files, no ADR — section-level additions to two existing docs. Cycle-2 fixup corrects a SUNSET-vs-SANDMAN conflation surfaced by operator review and reshapes the PR body to satisfy
lint-pr-bodytemplate anchors.Evidence: L1 (static contract audit — docs+skill text additions, no runtime code) → L1 required (no runtime-verify ACs in #11908). No residuals.
Deltas from ticket (if any)
sandman-handoff-format.md+ amend session-sunset skill" — cycle-1 interpreted this as one Pickup Queue specification surfaced via two consumer views ("surface duality"). Operator clarified: SUNSET self-DM (per-agent A2A self-message, Memory-Core mailbox-resident) and SANDMAN (resources/content/sandman_handoff.md, on-disk file written by GoldenPathSynthesizer /dreamperiodic task) are parallel-but-distinct artifacts sharing only the shape template — not one surface with two views. Commit4f1b1b8e4reshapes both docs to call out the distinction explicitly and forbid cross-delegation. AC coverage unchanged (composition, per-entry template, zero-candidate invariant unchanged).AC Coverage (per #11908)
sandman-handoff-format.mdextended with Pickup Queue section[EFFORT_PROFILE]taxonomy (Quick Win / Heavy Lift / Maintenance / Architectural Pillar) cited in both surfacesTest Evidence
npm run ai:lint-skill-manifest→[lint-skill-manifest] OK(both commits)npm run ai:lint-agents -- --base origin/dev→[lint-agents] OK — no new <a id> / <a name> anchor-tag insertions(both commits)check-whitespacepre-commit hook → OK (passed after stripping 5 pre-existing trailing-ws lines in cycle-1; clean in cycle-2)git log; sandman pipeline writer (GoldenPathSynthesizer) located viagrep -lr sandman_handoffPost-Merge Validation
dreamperiodic task run continues to regenerateresources/content/sandman_handoff.mdwithout errors (synthesizer-side §5 emission is a follow-up; current writer should ignore the new schema entry until implementation lands)Substrate-Mutation Pre-Flight Gate (per
pull-request-workflow.md §1.1)Paths touched:
learn/agentos/**+.agents/skills/**(both gated).Slot-rationale (per modified section):
sandman-handoff-format.md §5(schema spec for on-disk SANDMAN file)keepGoldenPathSynthesizer(out-of-scope here, follow-up).session-sunset-workflow.md Step 6.5(behavior spec for per-agent SUNSET self-DM)keepSKILL.mdalready; Step 6.5 adds Atlas content under the existing trigger. Compress-to-trigger does not apply — Atlas content is the right tier for substantive workflow steps.session-sunset-workflow.mdcross-ref updates (Step 8 payload spec, Step 10 memory spec, Section 3 response template)keep(delta)No retired sections. No ADR conflict.
Contract Ledger (backfill — ticket pre-dates the discipline)
learn/agentos/sandman-handoff-format.md §5GoldenPathSynthesizerwriter (future); agents reading on-diskresources/content/sandman_handoff.md(now)#id— scope — effort-tag), zero-candidate named-reason invariant, explicit Writer attribution, explicit "Distinct from session-sunset self-DM" non-conflation note.agents/skills/session-sunset/references/session-sunset-workflow.mdStep 6.5## Next-Session Pickup Queuesection per Step 6.5add_memorybody**Next-Session Pickup Queue:**block between Marathon Metrics and Conceptual PrimingAvoided Traps (per Epic + #11890 contract)
Commits
9b0ec20f7— feat: cycle-1 Pickup Queue substrate addition (sandman-handoff-format §5 + session-sunset Step 6.5 + cross-ref updates + pre-existing trailing-ws strip)4f1b1b8e4— fix: cycle-2 SUNSET vs SANDMAN conflation correction per operator reviewEvolution
Cycle-1 read the ticket's "extend sandman-handoff-format.md + amend session-sunset skill" as a single specification surfaced via two consumer views, codified as a "surface duality" framing in both docs. Operator flagged this as a category error — SUNSET (self-DM, mailbox) and SANDMAN (on-disk file, daemon-written) are independent artifacts with different writers, different consumer surfaces, and different storage substrates; they happen to share the Pickup Queue shape template but neither delegates to the other. Cycle-2 reshapes both docs to call out the distinction explicitly and bound each surface's scope. Schema unchanged; only the prose around the duality assertion changed.
Related substrate anchors
Peer verification of human review — recommend close, not another fixup
I re-checked the live dependency chain after @tobiu's review.
Evidence:
not_plannedas superseded/negative-ROI by Shape B wake pulses: https://github.com/neomjs/neo/issues/11906#issuecomment-4540371184Resolves #11908and edits bothlearn/agentos/sandman-handoff-format.mdand.agents/skills/session-sunset/references/session-sunset-workflow.md, preserving the category mix @tobiu flagged even after cycle-2 wording.[ARCH_ALIGNMENT]
Verdict:
superseded/ negative ROI for this PR as a merge candidate. The close-target ticket's prerequisite was retired by the newer Shape B wake substrate, so continuing to polish the PR body or wording would preserve stale substrate instead of resolving the real current wake path.Recommended disposition:
not_plannedas superseded by #11993 / Shape B wake substrate, unless @tobiu wants a fresh sunset-only pickup-queue discussion with Sandman explicitly out of scope.No code/doc fixup is recommended on this branch.