Daily Agenda + Context-Entry Optimization, Rollout Plan โ
Date: 2026-08-19 Status: DRAFT / living (operator co-edits). Scoped via the planning skill. Design: ../specs/2026-08-19-daily-agenda-and-context-entry-design.mdOwner: the PM session. This is PM-domain work, so it ships as the PM session's own PR (project-manager skill).
Part 1 is the operator's daily agenda. Part 2 turns AGENTS.md into an overview plus router and moves procedural bodies into skills. They ship in one PR because both edit the same .agents/ surface.
Phase 0: SHIPPED 2026-08-19 โ
Landed before the rest, because both were unplugged infrastructure rather than new work.
- Personal context now loads every session.
tooling/scripts/context-load.mjsruns as a SessionStart hook and injectsmy-voice.mdandpeople.md. Degrades to silence when absent, caps at 16KB, never writes (the session-start path runs concurrently on a fleet boot). Measured injection: about 1,085 tokens. Takes effect on the next session start, not the one that built it. - The voice rule is rebalanced, rewritten around status mode versus explanation mode, with warmth given three checkable tests. Rendered to all four surfaces and verified.
- The context home is audited and cleaned. Four files retired with operator approval. Writeup at
~/.agents/context/lantern_app/audits/2026-08-19-context-home-audit.md. my-voice.mdrewritten in two parts (operator request): how to talk to her, and how she talks so an agent reads her correctly. The second half is what would have prevented that morning's misread.
Sequencing rule โ
Part 1 lands first and completely, then Part 2 starts. Part 1 is small, is used the same day it ships, and its value does not depend on Part 2. Part 2 touches every rule an agent loads, so it wants the whole runway and a careful diff.
Phase 1: The agenda format, proven by use โ
Delivers: today's agenda file, written in the new format, at ~/.agents/context/lantern_app/agenda/2026-08-19.md.
- Create
agenda/in the context home. Moveboards/pm/board.htmltoagenda/board.htmland republish to the SAME artifact URL so the operator's bookmark survives. - Write today's file with the five sections. Freeze
boards/pm/with its two historical files in place. - Add a template at
.agents/skills/day-plan/templates/agenda.mdso the format is copyable, not remembered. - Commit and push the context home.
Why it is first: the format is a guess until a real day runs through it. Using it today is the test.
Done when: today's agenda exists, syncs, and the artifact URL still resolves.
Phase 2: Teach the skills the new artifact โ
Delivers: day-plan and project-manager reference the agenda instead of the board.
day-plan: step 5 (Record) writes the agenda, notboards/pm/<date>.md. Add the handoff-prompt requirement to step 4 (Dispatch): the prompt is written INTO the agenda's task detail and then sent, so the sent message and the record cannot diverge.project-manager: Session start reads the most recentagenda/file. Evening durability sweep checks that section 5 (Report) is written before EOD, alongside the existing per-worktree checks.- Add carry-forward: the morning ritual opens yesterday's file and reads sections 4 and 5 first.
npm run sync:agentsandnpm run validate -- --scope lintto confirm the skill fan-out is clean.
Done when: a fresh PM session, following only the skills, produces a correctly-shaped agenda without being told the format.
Phase 3: The compiler gains a router mode โ
Delivers: one rule source can emit a short router line into AGENTS.md and its body into a skill.
- Extend the rule frontmatter schema in
.agents/meta/frontmatter.mdwithagentsMd: full | router | noneandskill: <name>. - Teach
sync:agentsto render a router line foragentsMd: routerand to write the body into.agents/skills/<skill>/. - Keep
sync:agents --checkbidirectional so a hand-edited generated file still fails CI. - Ship
fullandrouteronly.noneis deferred until something actually needs it (operator decision, 2026-08-19).skill:is deferred on the same reasoning: nothing needs it until Phase 4, and an unexercised code path is a claim nobody has checked. - Pilot on
communication-voice, notlinter-organization(operator decision, 2026-08-19). It is the largest duplicate and its live copy is the output style, which already works, so converting it removes weight without removing reach.
Done when: the pilot rule renders as a router line in AGENTS.md, its body is reachable as a skill, and validate is green.
Phase 3b: The gated-permission question rule โ
Delivers: an always-on rule that turns an inferred yes into an asked one.
Add to .agents/rules/project/ as full (tier 1, never a skill: this is exactly the rule an agent breaks without noticing it is in that territory):
An action behind a gate gets an explicit question, never an inference. When the next step needs permission (branch operations, marking a PR ready, merging, prod, rules changes, migrations, or executing a plan), ask with the tappable question tool, name the specific object, and wait. A statement about priority, a forward-looking plan sentence, or approval of an adjacent thing is not a yes.
Why it exists: on 2026-08-19 "You can open the branch" plus "let's focus on the agenda stuff first" was read as approval to build. The branch approval was real; it did not extend to the work the branch was for.
Done when: the rule renders to all four agent surfaces and a session facing a gate reaches for the question tool rather than a judgment call.
Phase 3c: The frustration counter โ
Delivers: a frustration-signal skill carrying the rating methodology, plus a line in the agenda's close-of-day report.
Calibrated against real data, 2026-08-19. A naive detector over 1,093 operator turns scored 804 per 100 turns and was almost entirely noise:
- The top "shouting" tokens were
CLAUDE(510),URL(160),API(104),MCP(103),JSON(81). Acronyms, not emphasis. - 533 operator turns run past 150 words, which are pasted logs, specs, and review output rather than typing.
- Only
NOT(203),AND(60),THE(41) read as genuine emphasis. - Curses were real but small: 59 total,
fucking32, concentrated on 2026-08-18.
So the methodology, not the regex, is the deliverable:
- Strip before counting. Drop fenced code, quoted tool output, and any turn past a length threshold. Measure what she typed, not what she pasted.
- Whitelist acronyms. Count an all-caps token only when its lowercase form is ordinary English.
NOTcounts;APInever does. - Weight correction-steering highest. "I never said", "that's not", "why did you" map directly to an agent getting it wrong, which is the thing worth improving. Curses and caps are intensity, not information.
- Normalize per turn, and report the trend rather than the absolute. The number is only meaningful against its own history.
- Report it to the agent, not as a scoreboard. It belongs in the close-of-day report next to what caused it, so the next day's session can act on the cause.
Done when: the skill exists, the counter runs over a day's transcripts, and the EOD report carries the score plus the top correction moments that drove it.
Phase 4: Migrate, measured, section by section โ
Delivers: AGENTS.md as overview plus router, roughly 19.5k tokens down to about 5k.
Order chosen so that the safest and largest wins land first:
- Communication Style (1,350 words). Pure duplicate removal: the body already ships as the Operator Voice output style and as its own Copilot and Cursor files. Replace with one router line.
- The three authorization sections (1,206 words: relayed decisions, relay by quotation, permission is real/current/scoped) into one new
authorizationskill. - Reference sections (1,729 words: Architecture, Local Dev Ports, Common Commands) into a new
repo-mapskill. Architecture leaves a roughly 10-line map behind in AGENTS.md (operator decision). - Testing, Linter Organization, Helping a New Contributor (1,616 words) into skills.
designalready owns the admin UI conventions, so that one is a router line only. - Non-Negotiable Rules (1,987 words) and Operator Preferences (949 words) compressed IN PLACE to rule text, both staying
full(operator decision). Nothing moves out; the incident narratives move to the linked skills and issues. This is last because it is the most delicate.
Every step applies the spec's deciding test, and every step records before-and-after token counts in this plan's live status.
Done when: no rule body is lost, validate passes, and the router lines actually route. The original 3,000-word target was NOT met and the phase was ticked anyway: it finished at 4,283 words. Corrected after /code-review max caught the tick, 2026-08-19. Getting under 3,000 would need Non-Negotiable Rules to move, and that section fails the deciding test.
Phase 5: Surface it in the terminal โ
Delivers: the agenda is readable without opening a file.
Closes or advances lantern board, print the PM board + today's live PR ledger in the terminal (#856) and feeds lantern next, ranked next-task list from board + registered live plans + scored issues (#859). lantern agenda prints sections 1 and 4 plus today's open PRs.
Deferred by default. Only start it if Phases 1 through 4 land with runway left.
Explicitly out of scope (all operator decisions, 2026-08-19) โ
- Graduating memory to durable homes (#927). 58 notes, 31,634 words, every one Claude-only. Separate work, separate PR.
- Restructuring planning into per-project folders (#928). Archive
docs/planning/, README links to the new project folders. Separate work, separate PR. This is whereprojects.yamlfinally gets wired. - Context layer: flip Claude memory subtree to context-canonical (#654). Memories still do not cross machines. The agenda syncs without it, and flipping live memory deserves its own day.
- Compressing the MEMORY.md index (3,715 tokens every turn, 57 entries). Named as an open question in the spec; folded into #927's scope to decide.
Live status โ
- [x] Phase 0: personal context loads every session; voice rule rebalanced; context home audited and cleaned (2026-08-19)
- [x] Phase 1: agenda format, proven by use (2026-08-19). Dated file, five sections, template, page on its standing URL.
- [x] Phase 2: skills teach the new artifact (2026-08-19). day-plan writes the agenda and writes each handoff prompt into it before sending; project-manager reads yesterday's Parked and Report first; the evening sweep gates on the 9pm report.
- [x] Phase 3: compiler router mode (2026-08-19).
agentsMd: full | routerplus a requiredrouter:line, both refusals proven against clean controls, 7 tests. Piloted oncommunication-voice: AGENTS.md 20,133 to 17,885 tokens, 2,248 back on every turn, body still full length for Claude, Copilot and Cursor. - [x] Phase 3b: gated-permission question rule (2026-08-19).
.agents/rules/project/gated-permission.md,agentsMd: full, live on all four surfaces. Carries the three shapes that have actually cost something here. - [x] Phase 3c: frustration counter (2026-08-19).
frustration-signalskill +npm run frustration:signal+ 10 tests, wired into the close-of-day report. Reports its own coverage and names two blind spots that both under-count, so a quiet reading is weak evidence. - [x] Phase 4: migration (2026-08-19). AGENTS.md 20,133 to 7,416 tokens, 12,717 back on every turn. Reference cluster to a
repo-mapskill, authorization narratives to anauthorizationskill, four task-scoped rules to router lines, and Non-Negotiable Rules plus Operator Preferences compressed in place with all 21 rules verified present, and all 7 preferences carried into 6 bullets (two were merged because they were the same preference). - [x] Phase 5:
lantern agenda(2026-08-19). Prints Need-from-you, open tasks, parked count, and the live PR ledger with per-PR check state. Reads the dated markdown rather than keeping its own state. 6 tests. Advances #856 and gives #859 a parsed source.
Shipped alongside, not originally scoped: the two guards AGENTS.md claimed and did not have (guard-em-dash.sh, guard-inline-secrets.sh), 20 tests. Found by the same audit that found the personal context layer unplugged.
Measured baseline, 2026-08-19 morning: AGENTS.md 11,383 words / approx 19,548 tokens. Total always-on context approx 26,454 tokens.
Measured result, same day: AGENTS.md 4,283 words / 7,416 tokens. Total always-on context roughly 13,700, including the personal context layer that now loads and did not before. Nothing was deleted: every moved body is in a skill or still in its rule source feeding Copilot and Cursor, and the compression was verified rule by rule rather than by word count.