Decision artifact2026-08-15Session framework Β· πŸŽ©πŸ€– obot-prime

The session model after obot-prime

You said it yourself last night: the standing prime breaks the session model. Every bookend assumes a session that starts and ends β€” prime does neither, so init has nothing to open, the wrapup has nothing to fire on, and the concepts underneath them each need a verdict rather than a vibe. You also gave a provisional lean β€” a tight daily briefing with headlines and todos, maybe audio, plus a detailed weekly β€” and asked for honest suggestions. This page gives a verdict per concept (M1), a trigger model for the wrapup's orphaned duties (M2), a briefing designed from the measured reasons the openclaw one failed (M3), the weekly (M4), and the audio question researched properly (M5).

Calls M1–M5 Inventory 17 concepts: 9 keep Β· 6 re-home Β· 1 merge Β· 1 retire Trigger content-gated morning fold + event push Audio later, gated β€” and his own link changed the question Status decided 2026-08-16, closed 2026-08-17 Record Q&A discussion

Decisions

@jwildfire · 2026-08-16 · Operations Dashboard

All five calls adopted as recommended. He chose adopt-all in the dashboard and typed nothing alongside it, so there is no sentence of his to quote here β€” the choice is the record.

What that settles: the seventeen-concept disposition stands, nine surviving untouched and six with a new trigger, one merging and exactly one retiring (M1). The wrapup's duties are replaced by a content-gated morning fold at 07:00, with a phone push reserved for two urgent classes and hygiene moved to the moment work ships (M2). The daily briefing is the queue he is waking to rather than a report of the day he lived β€” at most ten lines, asks first, silent on a quiet night (M3). There is a weekly on top of it, whose job is to be the sink that keeps the daily short (M4). Audio waits until the text briefing has been running long enough for its usage to answer the question (M5).

Nothing was executed on it. Filed as requirements on 17 August, so an adopted decision stops being a page nobody acted on: the fold and the briefing together are #238, the weekly is #239, the retirement and the re-homing notes are #240, and the audio question is #242.

Of the five duties M2 re-homed, none has fully moved, and the honest accounting is worth more than a tidy one. Hygiene has half moved: the merge tool now refuses a merge whose issues carry no milestone, but board placement and stage moves were still being repaired nine at a time during the 16 August wrapup. Verification and hand-off both looked moved on a first pass and are not. The Navigator is genuinely live β€” a five-minute schedule since 16 August, roadmap-discipline checks across all seven repositories β€” but it has not taken the wrapup's verifying duty: that same wrapup still spawned its own verifier, which produced six corrections, and the wrapup's own instructions do not mention the Navigator at all. The standing sessions do have their own cold-start bundle, but the hand-off is still written by the wrapup into the scratchpad and still read from there. Record and capture sweep have not moved anywhere, because the thing they were to move into does not exist. That accounting is what #240 carries, so the re-homing is filed as work rather than assumed done.

Everything else on the page is still exactly as it was when he read it. There is no fold, at 07:00 or any other time β€” no script, no cron, and no scheduled job on the machine except the Navigator's own sweep. The briefing URL returns 404. There is no weekly machinery of any kind. There is no path from this program to his phone; the wake channel that exists was built on purpose to reach the Navigator and nothing else. No skill carries a deprecation or re-homing note, the diary is still written per session by the interactive wrapup, and the ideas backstop sweep has not run since 14 August because its trigger lived inside a kickoff lane nobody runs now.

Recorded on this page 2026-08-17. He answered at 21:34 UTC on 16 August and the sweep announced it ninety seconds later, but nothing applied it for nine hours β€” which is why the published index went on saying this page was waiting for him, and why the next morning he had to ask why it was not closed. The gap is filed as #241.

@jwildfire · 2026-08-17 · in chat

“I thought I asked for D2/7/14/15/16 to all be closed.”

Closed. This is the second entry rather than the only one because the two things are different: the evening before, he answered every question on this page, and the next morning he retired the page. Recording only the closure would delete a decision he actually made, and recording only the adoption would leave the page sitting in his queue after he had said he was done with it.

He was right to expect it closed, and the reason he had to ask is on the record above: his answer never reached this page. What he was reading when he wrote that sentence was a published index still listing this artifact as waiting for him.

His input on the audio question, given an hour before he closed the page, survives the closure rather than being buried by it. He supplied the mechanism he had in mind β€” Spotify's personal podcasts β€” and it is materially not what this page assumed. It is not a private-feed importer; Spotify generates the episode itself from a prompt and whatever files it is handed. So the page's finding that a private feed cannot reach Spotify still holds, and is no longer the interesting part. The interesting part is that the only road into the app he actually listens in puts another model between our words and his ears, in the one channel where he cannot see the source while listening. That is carried into #242 with the three options and the trade stated as fidelity against effort, and it is recorded in full on the Q&A thread.

The situation

Three sentences

The whole session scaffold β€” init, wrapup, todo, the scratchpad heartbeat, the diary, the reports β€” was built around a unit of work that has a beginning and an end, and πŸŽ©πŸ€– obot-prime is a session that has neither, so the two bookends have lost their trigger while everything they used to guarantee (clean roadmap, captured todos, a written record, a hand-off) still needs guaranteeing. You found the session wrapups useful and you explicitly like the dashboard's news feed, but the last time this program ran a daily summary β€” the openclaw era β€” you mostly ignored it, and nobody had diagnosed why before proposing its successor. This artifact does the diagnosis first, then makes five calls; nothing is retired or rebuilt tonight β€” every change below is a recommendation for you to answer in the Q&A thread.

"I really like the news feed on the dashboard page, and did find the session wrap-ups helpful, but not sure how/when to trigger them. We used 'daily summaries' back in open-claw era and i mostly ignored them, so not sure that is a good alternative… I guess if I had to pick right now, I'd go with a very tight daily briefing with just 'headlines' and 'todos' (maybe both text and audio?…) and then a more detailed weekly briefing." β€” @jwildfire, 2026-08-14

What already exists on this map β€” so we don't invent it twice

The evidence

Why the openclaw summaries died β€” measured, not remembered

The corpus survives: 32 entries, 2026-05-11 β†’ 06-11, in obot-claw.github.io/daily/ (mirrored into this hub's diary). 18,760 words total, ~570 per entry. The git log shows an unconditional cron committing at 23:31–23:35 ET every night, including zero-activity days, to a Pages site you had to navigate to, with no notification lane of any kind.

SpecimenWordsWhere the ask sat
2026-05-12136No ask anywhere β€” narrative recap, 2 bare URLs
2026-05-25559No ask β€” a self-described quiet day: 559 words to say nothing changed, re-listing 8 unchanged draft PRs
2026-06-088657 real decision asks β€” starting at line 38, after ~500 words of recap

The decision-asks section (πŸ™‹ ToDo) existed in only the last 7 of 32 entries; word count grew monotonically 136 β†’ 865 as template sections accreted. Three failure causes, each with a design consequence:

What the news feed you like does differently

The dashboard's "Roadmap activity" panel (session-hub/lib/render.mjs): one line per event, ~15–20 words, every line linked, verb bolded (12:02 AM Β· obot.agent Β· PR #91 … β€” merged); a 5-minute sweep TTL and 60-second refresh, so items appear minutes after they happen; a collapsed panel showing "N events" inside a tab you already have open β€” reading it is a glance, not an errand; and it never editorializes, because curation lives in the Priorities panel beside it. Every one of those properties is the inverse of a diagnosed failure above. M3 inherits all of them.

M1 β€” the inventory

Seventeen concepts, one verdict each

The test applied to each: what did the session boundary actually provide it, and does anything else now provide that? Prime replaces the interactive lead, but the --auto autonomous session (obot-auto today, A2/#122 when scheduled) still starts and ends β€” so "the bookends retire" would be wrong; they narrow to the lane that still has boundaries.

ConceptVerdictWhy
session-updatesurvives as-isMid-work capture has nothing to do with boundaries; prime and every sibling still need the door.
session-notesurvives as-isFeeds the record wherever the record is written; capture stays cheap.
session-ideasurvives as-isAlready session-independent β€” files to hub Ideas, triaged by the Action.
session-scaffoldsurvives as-isCapture-at-friction stands; only its sweep moves (to the weekly, M4).
session-spawnsurvives as-isMore central than ever β€” it is prime's only way of doing anything.
session-reviewssurvives as-isOn-demand by design; with the RC-only rule it is the review front door.
session-dashboardsurvives as-isThe pull channel you like. One change: the watch loop should become standing (launchd or prime-armed) instead of dying with the session that started it.
the scratchpadsurvives as-isPromoted, in fact: it is the program's event stream β€” heartbeats in, briefing and news feed out. Its midnight-boundary hazard already bit prime once and was fixed in oa#94; the fold inherits that two-day read.
live hub + news feedsurvives as-isThe exemplar everything else inherits from. Untouched.
session-init (+ --auto)survives re-homedInteractive init's job β€” "what should we work on?" β€” is now a question you ask prime. The skill narrows to the --auto selection lane (obot-auto, then A2/#122), where it is load-bearing and unchanged.
session-wrapupsurvives re-homedThe crux β€” see M2. Its five duties get four homes: hygiene β†’ event-time (the shipping sibling's definition of done), verification β†’ Navigator #157, record + capture sweep β†’ the morning fold, hand-off β†’ prime-state (continuous). The --auto variant survives verbatim for autonomous sessions.
session-inboxsurvives re-homedIts trigger lived inside init's recon sibling. The backstop sweep moves into the morning fold; on-demand invocation unchanged. (The ideas-triage Action stays the front line either way.)
handoff.shsurvives re-homedThe Tier-0 bundle only matters where a session cold-starts: the --auto lane and /s-init. Prime already has its own (prime-rehydrate).
the diary entrysurvives re-homedCadence moves from per-session (D2) to per-day-with-activity, written by the fold. The no-filler rule is the openclaw lesson β€” it stays absolute. The diary is also the R/Pharma keynote's raw material, which is a reason to keep its quality independent of whether you read it daily.
the timing ledgersurvives re-homedBookend rows end with interactive bookends; the schema stays for --auto runs and gains a fold bookend so the briefing SLA is checkable too.
the session reportmergesThe frozen per-session operational page becomes the fold's per-day record β€” same renderer, day-scoped window, linked from the diary entry as today.
session-todoretiresA render-only skill whose two outputs are now both covered: the dashboard renders the same sections live every 60s, and "what's left?" is a question prime answers. Retire only after the watch loop is standing (migration, below) β€” and retiring means a deprecation note in the skill file, never deletion.
M1 β€” Recommended

Adopt this disposition: 9 keep, 6 re-home, 1 merge, 1 retire.

Nothing is executed tonight. The one genuine retirement (session-todo) waits for its replacement to be standing, and every re-homed skill keeps its file with a note pointing at the new trigger β€” the cross-reference web (12 skills, the framework doc, obot-auto, the Stop hook) makes deletion the only actually destructive move here.

M2 β€” the trigger

What fires the wrapup's duties when nothing ends

The wrapup was never one thing β€” it bundled five duties (clean roadmap, everything captured, scaffold reviewed, summary posted, next session prepped), and the session boundary was merely a convenient moment to do all five at once. With the boundary gone, each duty needs its own trigger. The models on the table, and what each produces:

T1 β€” Wall-clock, unconditional (the openclaw model)

Proven failure

A cron fires nightly and publishes whatever exists. Produces a complete, evenly-spaced record β€” and the measured behavior above: 559 words on a quiet day, asks at line 38, a reader trained to skip. The record was fine; the reading died. Rejected as the sole model, kept only as the clock inside the recommendation.

T2 β€” Pure event-based

Fragments

Fold whenever a defined event lands: an RC files, a decision is answered, N delegates close out, a release ships. Produces maximally fresh, minimally batched output β€” and a day of drips: five small folds on a busy day is five interruptions, and the diary shatters into fragments no keynote can quote. Right for the two genuinely urgent event classes, wrong for the record.

T3 β€” Threshold-based

Unpredictable

Fold when unreported events accumulate past a bound (say, 15 scratchpad lines, or any RC unreported >12h). Produces output proportional to activity β€” at unpredictable times, which is exactly wrong for a habit: a briefing that arrives at 07:00 some days and 15:40 others never becomes "the thing I glance at over coffee". The gate is right; the clock is wrong.

T4 β€” On-demand only

No record

Nothing fires; you ask prime when you want the picture. Produces zero unread artifacts β€” and zero record: the diary (and the keynote diary with it) stops accruing, hygiene never runs, and the queue is only as visible as your memory to ask. This is what exists by default since prime launched, and it is why last night needed a milestone audit to reconstruct a release.

T5 β€” Composite: content-gated morning fold + event push + event-time hygiene

Recommended

Split the duties by their real latency needs:

07:00 fold
A cron-spawned πŸ‘―πŸ€– fold sibling (independent of prime, so the record survives prime's retirement) reads the scratchpads since the last fold + the gh sweep, then β€” only if there is content β€” writes the diary entry for a day with activity, renders the briefing (M3), runs the inbox backstop sweep, and checks off captured items. A zero-activity night produces nothing at all: no page, no push, no filler. It fires at 07:00, not 23:30 β€” the briefing describes the queue you're waking to, not the day you already lived.
Event push
Exactly two classes interrupt you, immediately, via a one-line phone push (the harness's PushNotification reaches desktop + phone over Remote Control, which prime and siblings hold; verify the bg-job path at build time): an RC goes ready with its demo, and every active goal is blocked at once (the escalation case rc-framework already names). Everything else waits for the fold.
Hygiene
Moves to event time, into the shipping sibling's definition of done β€” milestones at pickup (your rule, already live), Closes lines, stage moves, close-out heartbeat lines. Most of this migrated already; M2 just names it as the wrapup's successor instead of a nightly batch repair.
Verification
Navigator, #157 β€” decided last night, not re-decided here. Until it exists, the fold does a light verify (URLs 200, claimed PRs real) inherited from wrapup-verify.
Hand-off
Already continuous: prime-state.md + the scratchpad. No fold step needed.
M2 β€” Recommended

T5: a content-gated 07:00 fold for the record and the briefing, push for the two urgent event classes, hygiene at event time, Navigator for truth.

This is the wall-clock's predictability with the threshold's gate and the event model's urgency, each applied only where it wins. A standing prime (or any cron) can hold the clock and push β€” the thing no previous session could do β€” and the fold sibling is deliberately not prime, so the record never depends on one long-lived session staying alive.

M3 β€” the daily briefing

Headlines and todos β€” designed from the autopsy

Your lean, taken seriously. Five rules, each the inverse of a measured failure:

The example β€” this morning's briefing, composed from tonight's real queue

obot Β· 7:00 AM
1 RC Β· 3 decisions Β· 2 todos β€” briefing: jwildfire.github.io/obot.roadmap/reports/briefing/
β˜€οΈ obot briefing β€” Fri Aug 15
🚦 Release candidates (1)
  1. obot.agent v0.4.0 β€” prepped, blocked on your R1–R4 call (rec: R2) β†’ Q&A #155
🧭 Decisions (3)
  1. demo-301 site size S1–S3 β€” blocks #143 β†’ Q&A #150
  2. hub#140 reframe β€” 13 days open, now ≀3 calls β†’ #140
  3. sv#126 KDIGO staging β€” your v1.6.0 note, not blocking β†’ sv#126
πŸ™‹ Todos (2)
  • Allowlist line for scratchpad-log in workspace settings
  • A3/A4 app-plan follow-up when you're ready to discuss
Overnight

sv v1.6.0 released Β· oa#91 merged (prime durable state) Β· 4 non-RC PRs self-merged Β· diary

93 words, 9 lines, ~20 seconds to read. Every line is a link you can act on from the phone. That is the whole thing β€” anything longer is the openclaw failure restarting.

M3 β€” Recommended

Build this as the rc-framework's "nightly executive summary", replacing that spec's five-section page with the two-queue shape above.

Amend rc-framework.md on approval rather than shipping a competitor to an unbuilt spec. Build cost is small β€” the fold composes from surfaces that already exist (prime-state, gh-sweep, scratchpad, the cumulative headline rules) β€” roughly one evening increment, filed as a hub requirement (2026q3) through the normal lifecycle once you answer.

What you have to do to keep it alive β€” stated plainly

M4 β€” the weekly

The detailed weekly briefing

Recommended, with one job: be the sink that keeps the daily at 9 lines. A Sunday-evening fold (same machinery, weekly flavor) composes from the week's daily folds: goal-by-goal progress against the keynote plan, the scaffold-candidate sweep (re-homed from wrapup step 6), the cost/usage note, carried-item staleness ("hub#140 is now 20 days open"), and a short week narrative β€” which is, not incidentally, the R/Pharma diary's raw material. It publishes as a dated hub page and one push line. Unlike the daily it is not gated to nothing β€” a quiet week is itself a finding β€” but it skips sections rather than padding them; the 136β†’865-word template creep is the failure mode it must never repeat. If you read one artifact a week, this is the one; if you read neither, the keynote diary still accrues.

M4 β€” Recommended

Yes β€” weekly detail, Sunday evening, built by the same fold machinery; the daily stays headlines-and-todos only.

Ship it in the same requirement as M3 but a phase later: the weekly needs daily folds to fold, so it cannot come first.

M5 β€” audio

Audio, researched rather than hand-waved

Corrected 2026-08-16

The first bullet below is right about the wrong thing, and he is the one who showed it.

He supplied the mechanism he actually had in mind β€” Spotify's personal podcasts β€” an hour before he closed this page. It is not a feed importer at all: Spotify generates the episode itself, from a prompt and whatever files you hand it. So "a private feed cannot reach Spotify" stands and stops mattering, and the real question is the one it hid. The only road into the app he listens in is one that hands our briefing to another model and plays back that model's version of it, in the channel where he cannot see the source. Carried forward with the three options in #242; the full finding is on the Q&A thread. The bullet is left standing rather than rewritten, so the page shows what it got wrong.

The facts, web-verified 2026-08-15 (full research with source URLs: sources/audio-research.md):

M5 β€” Recommended

Later, gated: run the text briefing for 2–3 weeks first; build the podcast pipeline only if you're actually reading it and want it in your ears instead.

Every technical question resolves cleanly β€” the risk is purely audience. Audio is a renderer for a habit that does not exist yet, and a podcast queue of unplayed episodes is the ignored-summary problem with extra infrastructure. If you want to test audio now, take the 1-hour Shortcut, not the 5-hour pipeline; its usage decides whether the pipeline is ever worth building. And since your listening life may be Spotify-centric: that is an argument for the Shortcut/HomePod lane, because a private feed can never reach Spotify.

Migration

What changes first, what waits, what breaks

PhaseWhenWhat lands
0 β€” unblockon your answerFile the fold/briefing requirement (2026q3); amend rc-framework's nightly-summary section to the M3 shape. (The prime-rehydrate midnight defect that would have bitten the fold is already fixed β€” oa#94, last night.)
1 β€” the foldfirst incrementFold script + briefing page + push + diary-entry composition; cron at 07:00; light verify inherited from wrapup-verify. Interactive wrapup stays available throughout β€” nothing retires while the fold is unproven.
2 β€” re-homesfold proven (~2 wks)Inbox sweep moves into the fold; dashboard watch loop becomes standing; weekly fold ships; deprecation notes into session-init and session-wrapup (interactive paths) pointing at prime + the fold; session-todo retires.
3 β€” audio?~3 wks of read briefingsYour call per M5 β€” Shortcut, pipeline, or neither.

Named breakage if a skill retires while things still reference it