Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/crew/AGENT-WORKING-AGREEMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ Before a multi-step plan, confirm:
- [ ] Docs updated only if user-visible behavior or durable rules change
- [ ] Shipped state changed (release published, slice merged, gate changed)
→ update [`STATE.md`](STATE.md) in the same PR
- [ ] Every entry in STATE.md's "Open decisions" carries a closure address:
`decided-with: <track>`, a revisit trigger, or immediate resolution /
conversion to a task. No anonymous parking.
- [ ] New sticky choice → append [`DECISIONS.md`](DECISIONS.md)

## When stuck with the founder
Expand Down
56 changes: 40 additions & 16 deletions docs/crew/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -468,22 +468,6 @@ mis-assignment when roles exist, and treat shared thread reports as the human
record. Spikes are not automatic law. Full text of MUST/MUST NOT lives in the
working agreement doc.

## D-039 — Mission inbox snapshots memoize on inputs, not on the wall clock

- **Status:** Accepted
- **Date:** 2026-08-11
- **Issue:** [#135](https://github.com/Nuncio-hq/crew/issues/135)

`deriveMissionInboxSections` memoizes on a key built from its inputs. An
explicitly supplied `now` is part of that key; the implicit `Date.now()`
fallback is not. Identical inputs therefore always return the identical
snapshot object, which is what a `getSnapshot`-shaped selector must do.

The accepted consequence: without an explicit clock input, row `age` values
stay fixed until another input changes. The desktop caller passes no clock and
the home surface has no ticker, so ages already only refresh when a store
changes. A caller that wants clock-driven recomputation passes `now`.

## D-031 — Keep shipped state in sync with STATE.md

- **Status:** Accepted
Expand All @@ -507,3 +491,43 @@ fixing a test. Over the last 10 `main` runs, shard 1 failed `8/8`, shard 4
cancelled at the 30-minute timeout `8/8`, shard 3 failed `2/8`, shard 2 passed
`8/8`, and the Gate was green `10/10`. Revisit making the shards required once
#109 and #110 are closed.

## D-037 — Channel-first stands; board deferred; work overview is future direction

- **Status:** Accepted
- **Date:** 2026-08-10
- **Product doc:** [`FOUNDER-PRODUCT.md`](FOUNDER-PRODUCT.md)

1. **Channel-first stands.** Channels and threads are the main surface and
where work happens. Board-as-home — columns as authoritative state, slot
caps, and card-move-as-transition — is not current direction. This
supersedes VISION.md § "Board as orchestrator" as a product commitment.
[`FOUNDER-PRODUCT.md`](FOUNDER-PRODUCT.md) remains the locked north star.
2. **Board schema stays deferred.** No board event kind or board tag schema is
defined until a board-like surface is actually prioritized. This closes
STATE.md's open decision "final board event kind and tag schema".
3. **The future direction is a work overview lens.** It is a read-only
aggregation over signals that already exist as relay events: active turns,
thread-workspace branch telemetry, Needs You, evidence and acceptance
reactions from #121, and agent readiness from #119. It answers what each
agent is doing, on which branch, what needs the founder, and what is done.
It is a lens over existing events with no new authoritative state,
consistent with D-003, D-010, and VISION.md's "board state = signed relay
events". It is recorded as a future candidate track and is not in scope of
this change.

## D-039 — Mission inbox snapshots memoize on inputs, not on the wall clock

- **Status:** Accepted
- **Date:** 2026-08-11
- **Issue:** [#135](https://github.com/Nuncio-hq/crew/issues/135)

`deriveMissionInboxSections` memoizes on a key built from its inputs. An
explicitly supplied `now` is part of that key; the implicit `Date.now()`
fallback is not. Identical inputs therefore always return the identical
snapshot object, which is what a `getSnapshot`-shaped selector must do.

The accepted consequence: without an explicit clock input, row `age` values
stay fixed until another input changes. The desktop caller passes no clock and
the home surface has no ticker, so ages already only refresh when a store
changes. A caller that wants clock-driven recomputation passes `now`.
24 changes: 16 additions & 8 deletions docs/crew/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,14 +237,22 @@ and in flight.

## Open decisions

- Whether a future non-local relay must hard-block local-path publication or
use a different privacy mechanism.
- Final board event kind and tag schema.
- Whether exact local snapshots should additionally refresh on app focus.
- Whether symlink-selected workspaces should remain unsupported or get a
separately reviewed canonical-path flow.
- When to publish or link a real Project on the manager relay for the final
native exact-reader smoke.
- **Resolved by D-037(2):** Final board event kind and tag schema is deferred;
no board event kind or tag schema is defined until a board-like surface is
prioritized.
- **Decided: yes; task:** Exact local snapshots refresh on app focus with a
debounced point-in-time re-read. File-watcher liveness is a future upgrade
tied to the work overview lens in D-037(3). The small implementation task is
filed as #139.
- **Decided: stay unsupported:** Symlink-selected workspaces fail closed as
shipped. GitHub identity and the real project path are the source of truth;
revisit only on a concrete user need.
- **Deferred; decided-with: mobile epic:** Non-local relay local-path privacy
is a mandatory spike question for the future mobile-continuity epic (D-026).
- **Converted to task:** Publishing or linking a real Project on the manager
relay for the native exact-reader smoke belongs in the next
release-verification Definition of Done, alongside the outstanding signed
updater install/relaunch verification. It is not an open decision.

## Hermes runtime track (feature 0001)

Expand Down
18 changes: 17 additions & 1 deletion docs/crew/VISION.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Crew Vision

> **Status: historical vision (2026-08-10).** This document pre-dates
> [`FOUNDER-PRODUCT.md`](FOUNDER-PRODUCT.md) and is kept as history; it is not
> rewritten. The section [Board as orchestrator](#board-as-orchestrator-superseded)
> is **superseded** as a product commitment by **D-037** in
> [`DECISIONS.md`](DECISIONS.md): channels and threads are the surface where
> work happens, and board-as-home is not current direction. Every other section
> — manager–agent relationship, mention-as-assignment, thin-fork constraints,
> board state as signed relay events — remains aligned and in force.

## Product statement

Crew is mission control for a team of agents.
Expand All @@ -16,6 +25,8 @@ room:
6. The manager returns only for decisions, review, or completion.

Chat is the detail view of work. The board is the control surface.
(**Superseded by D-037**: channel-first stands; the channel/thread is the
surface, not a board.)

## Manager and agent relationship

Expand All @@ -32,7 +43,12 @@ An agent has its own keypair and is treated as a participant. Mentioning an
agent assigns work. A future mention syntax may also select model, reasoning,
speed, or other execution attributes.

## Board as orchestrator
## Board as orchestrator (superseded)

> **Superseded by D-037** ([`DECISIONS.md`](DECISIONS.md)). Board-as-home —
> columns as authoritative state, a `Working` cap, card-move-as-transition —
> is not current direction and no board event kind or tag schema is planned.
> Kept here for history only.

The primary workflow is:

Expand Down