docs(plans): scope #102 channel-first missions — projection-first, 5 slices, D-1/D-2/D-3 settled - #143
Merged
oscarlehuu merged 3 commits intoAug 11, 2026
Conversation
Author
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
26 tasks
3 tasks
devin-ai-integration
Bot
force-pushed
the
devin/1786410238-plan-102-channel-first-missions
branch
from
August 11, 2026 09:30
dc61699 to
1a80236
Compare
oscarlehuu
force-pushed
the
devin/1786410238-plan-102-channel-first-missions
branch
from
August 11, 2026 13:06
888d436 to
834e7db
Compare
devin-ai-integration
Bot
force-pushed
the
devin/1786410238-plan-102-channel-first-missions
branch
from
August 11, 2026 14:18
834e7db to
91fdf83
Compare
…n, 5 slices, 3 escalated decisions Plan-only, docs-only. No implementation, no D-number taken. Core finding: every fact a Mission displays is already durable on the relay (thread root NIP-10 e/h tags, 46040/46041/46042 ACP questions, 46043 receipts, NIP-25 kind-7 acceptance, 30617/30621 Project context, 1630-1633 Git status) except the fact that a thread IS a Mission. So the design is a pure projection plus one durable promotion marker, and the stores a naive implementation would lean on (conversationOutcomeLedger 4h TTL, needsYouStore 30m TTL, activeAgentTurnsStore) are explicitly forbidden as Mission authority. Escalates three founder decisions rather than assuming them: what carries promotion intent, whether a thread-scoped mission tag falls under D-037(2)'s deferred board schema, and whether promotion is allowed outside Project channels given fail-closed worktree provisioning. Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
D-1 = tagged ordinary kind-9 marker (no new event kind), D-2 = the thread-scoped marker is not the deferred board schema, with the tripwire that any request for Mission priority or ordering returns to the founder, and D-3 = promote anywhere with the no-isolated-worktree limitation stated plainly in the UI. Promotion is a manual toggle: a Mission is never inferred from a worktree, receipt, or telemetry. Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
oscarlehuu
force-pushed
the
devin/1786410238-plan-102-channel-first-missions
branch
from
August 11, 2026 14:53
99ef7e8 to
80b68bd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Scope verdict for #102, plan only. Docs-only diff under
plans/20260811-channel-first-missions/. Nothing implemented, no D-number taken,nothing merged.
The finding that shapes the whole epic:
e+h+p(buzz-sdk/src/builders.rs:179-239)46040/46041/46042(buzz-acp/src/elicitation.rs:853-956)46043(buzz-acp/src/pool.rs:5544-5589)7(shipping; extended by #128)30617/30621,1630-1633So the design is not "add a mission store". It is a pure projection over events
that already exist, plus exactly one durable promotion marker:
Equally load-bearing: the plan forbids by name the stores a naive implementation
would reach for, because each would make a Mission silently un-complete itself —
conversationOutcomeLedger.ts:11-51(4h TTL),needsYouStore.ts:12,35-50(30m TTL),activeAgentTurnsStore.ts:83-106,projectThreadWorkspaceStore.ts(cap 256). ARED contract asserts a Mission reconstructs with all three empty.
Two things the issue assumes that the code contradicts, surfaced instead of faked:
channel — provisioning is fail-closed on trusted
buzz://project-workspace?metadata (
pool.rs:3019-3078,thread_workspace.rs:244-270,141-148). Settled byD-3 below: promotion is still allowed there, and the strip must say so plainly.
(
config.rs:1495) → spike Q3 before any UI work.Slices (spike → RED → implement → verify each):
00reality-check spike (4pre-declared PASS/FAIL questions) ·
01promote in place, gated on restartreconstructs the strip from the relay alone ·
02live state + inline decision ·03review from a durable receipt, reusing the existing ✅ accept path ·04cancel/reopen/retry. Slice 00 is runnable today and gates slice 01.
Founder decisions — now settled (this PR still takes no D-number)
The plan escalated three product decisions rather than guessing them; the founder has
since decided all three, and the plan records them as settled inputs:
h+NIP-10
etags, carrying["crew-mission","promote"]and["crew-mission-goal","<title>"]. No new event kind. Rejected alternatives andtheir trade-offs stay recorded.
thread-scoped with no lane, column, order or priority. The agreed tripwire is
now written into §3, the non-goals, slice 01's review checklist and its DoD: the
moment anyone wants priority or ordering on a Mission, the work stops and returns to
the founder as a fresh decision — an implementer may not settle it.
decisions but no isolated checkout, and slice 01 must state that limitation in
plain language in the strip rather than failing mysteriously — with a RED contract
(
ordinary_channel_mission_explains_no_worktree) so it cannot be skipped.Promotion is a manual human toggle, now a hard invariant: a Mission is never
inferred from a worktree, a receipt, ACP telemetry, or any other side effect. The
valid marker is the only Mission authority (red-team RT-11 moves from "rejected on the
plan's judgement" to "ruled out by the founder").
Composition (§3): Mission carries no assignee (that stays
@mention+ roles,#120), no accept button (that stays NIP-25 kind 7, #128), no readiness state
(#134), and the strip must live in new Crew-owned components —
MessageRow.tsxis 980/1000 against the ratchet and D-022 forbids raising
MAX_LINES.Respecting #140/D-037: board schema stays deferred and the work-overview lens
stays out of scope — both are explicit non-goals, and the lens is a future consumer
of
missionState(), not part of this epic.Red team: 12 findings — 9 applied, 3 rejected with reasons (new
30xxxkind;infer-instead-of-promote; ship the suggestion card in slice 01).
Still open, deliberately unwritten: the founder also wants a message inside a
thread to be promotable, not just a thread root. That changes the projection's
identity key (what a Mission is anchored to, and what happens when both a message and
its enclosing thread are promoted), so it is being worked out with him rather than
guessed — every statement in this diff keeps today's thread-root identity wording.
Related issue
#102. Related in-flight, none merged: #140 (D-037), #124 (STATE baseline used here),
#128 (#121 evidence/acceptance), #120 (#116 roles/routing), #134 (#119 readiness),
#129/#131 (Projects E2E). Duplicate search: no open issue or PR covers thread→Mission
promotion.
Testing
Docs-only; no code paths touched, no shipped state changed (so no
STATE.mdedit —this PR ships a plan, not behavior).
. ./bin/activate-hermitpnpm --filter buzz check— pass (Biome 2,195 files; file-size, px-text andpubkey-truncation checks pass)
git diff --check— cleanEvery
path:linein the plan was verified againstorigin/main@35af74019. Noscreenshots: no visual change.
Link to Devin session: https://app.devin.ai/sessions/fd898bfdc6044b479eff8cb4ff1b96a0
Requested by: @oscarlehuu