METIS · DESIGN MOCKUP · 2026-06-17

Session → Board Trail

One routine, three triggers, one trail. Replaces hardcoded board lists and the unreliable session-end write with an agent-authored work-state trail that the next session — or another constellation — can actually orient from.
The spine
~20% context hook
UserPromptSubmit estimates tokens-used ÷ window; crosses ~20% → injects a flush directive. Fires once (debounced).
deterministic trigger
/board-sync skill
Operator-invoked, on demand. "Update all tasks, create new ones, flip status."
you control timing
/end
Devlog ↔ board parity. The same session summary written to the devlog mirrors onto the board.
parity enforced
reconcile-session-to-board
agent authors all content (judgment) · hook only forces it to run
comment on touched issues
flip status (Backlog→In Progress→Done)
close completed work
file new for unfinished
GH Projects
the live work-state trail — issues, comments, status changes ARE the marks
/project-grep · /start read it live
"My boards" derived from agent:<self> items — no hardcoded list. metis resolves to #8 Themis-PM.
The mechanism — how the ~20% hook fires
# UserPromptSubmit hook — runs each turn
ctx  = last_assistant.usage.input_tokens
win  = 1_000_000   # opus-4-8[1m]; 200k default

if ctx / win >= 0.20 and not fired(session):
    inject("Context ~20%. Run /board-sync to "
           "flush this session to GH Projects.")
    mark_fired(session)        # debounce: once

# next fire VERIFIES a board write landed;
# if not → re-inject harder (inject + verify)

Why this, not the alternatives

trigger guaranteed Fires on context fill — no dependence on /end running or the agent remembering.

content agent-authored The hook injects a directive; the LLM makes the real gh call with judgment. A useful trail, not a mechanical mark.

⚠ Honest gap: a hook injects a directive — it can't force a tool call. Inject + verify narrows it; it doesn't close it to 100%.
What dies — replaced by the trail above
PreCompact trigger
Never fires — operator rarely exceeds ~30% context, so compaction almost never happens. Dead trigger. → the ~20% checkpoint replaces it.
skill discipline
"Remember to update the board." Theater — 43 sessions, board writes on only 12 days. Neither trigger nor action guaranteed.
BOARDS=("3|Moirai" "7|Arsenal")
Hardcoded in /start Step 2.7 — omits #8 Themis-PM (metis's real board). → derived live from agent:<self> items.
/project-grep default 3 7 9 14 22
Also omits #8 → dedup greps return false-negatives. → same live derivation; env/flag override preserved.
Open — your call before the plan
A · untracked + completed-this-session

Work that was both started and finished this session with no prior issue — file a closed issue for the record, or skip it? (Spec leaves it as an open choice.)

B · cross-constellation "potentially relevant" boards

The registry for other constellations' boards routes to fleet_projects (Hephaistos/Athena-owned, not yet live), with a generated gh project list cache as interim. Keep that dependency, or make the generated cache the permanent source?