Grove Roadmap · computed 2026-09-11 · launch day

Then → Now → Next

Three sources of truth, no vibes: the original spec is MASTER-MASTER-PROMPT.m4a (the voice memo that started the grove) plus the pristine upstream import recorded in PROVENANCE.md. The now is what ships and runs, with build-log evidence. The next is the live bead tracker (bd) — 8 closed, 7 tracked, counted tonight.

33
build-log entries
16 / 19
beads closed
4 + 1
user plugins + shared lib
0.1.0
on PATH · uvx-proven
live + durable
voice · ACP · resume
I

Then — the spec we started from

Upstream baseline: mpfaffenberger/code_puppy (MIT), synced 0-behind at merge d819ae4e, imported pristine as commit #1, then audited rebrand passes. The memo asked for five things:

1 · The harness, wearing our grove

“Take all of the core mechanics and internals and the harness that is CodePuppy … make me a classy, elegant, badass Spruce Grove OS.”

Granlund Grove design system; the bootloader is the design system.

2 · The default local instance

“When I do UVX, it needs to be UVX spruce grove … boot to the new ethos … indicate that it is backed by the Leather Apron Club, AKA Junto.”

One command from anywhere; the club in the boot banner.

3 · Voice-first

“This voice, this ability to transcribe and talk through situations and articulate what you need.”

Speak the need; the harness iterates.

4 · The cohort is the point

“Bentonville Barber Company, use case one … the creatives … the squiggle cutters … the drone pilot.”

NWA small businesses as plugin-shaped problems.

5 · Trained on the town

“Train that model, that core, against the things that these small businesses are going to need.”

Process, traceability, accountability — blame the cog, not the person.

II

Now — what exists tonight evidence-linked

Ladder state, each rung with its proof. Percentages match phases.html, the official ladder board.

L0 · rebrand + boot

Grove identity, ethos boot, Junto backing

done

Full namespace rebrand (spruce_grove modules, spruce-grove/grove CLI, Cedar the guide, ~/.spruce_grove data dir) with a compatibility shim so upstream contracts keep working. The TUI boots the figlet banner and literally renders “Backed by the Leather Apron Club (Junto)” — memo ask #2, verbatim.

100% · PROVENANCE.md rename map
L1 · plugin tier

Three-tier plugin architecture + trust gate

done

Builtin (code_puppy_core_plugins 0.0.48) → user (~/.spruce_grove/plugins) → project (.spruce_grove/plugins, SHA-256 trust ceremony), 30+ hooks, golden rule: plugins over core. Tonight's /rec feature shipped with zero core edits.

100% · AGENTS.md contract
L2 · cohort bricks

Five shipped, shared core, all versioned

done

/junto credo plaque · barber scaffold (5al.3) · /backoffice sourced checklist (5al.4) · /creative-scaffold FPV + artisans over grove_site_core (5al.5) — and as of tonight all of them live in-repo as the canonical copy (user-plugins/, build-log 28).

bricks shipped · reuse contract holding
memo pillar · voice-first

Mockingbird /rec — spoken prompt → agent run

done · tonight

The memo's ask #3, realized: mic → whisper-cli (local, Metal) → review/edit/re-record → sent as the prompt. Dogfooded live in the TUI tonight: whisper heard “Thank you.”, Cedar answered on GLM-5.3-Flash, tokens counting. Model auth is keyring-backed (service code-puppy) — the 401 era is over.

validated live · build-log 27 + 29
L4 · namespace

Zero-tolerance merge discipline

done

Last four grandfathered legacy imports rerouted; the guard ratchet's list is empty and prints green (5al.8 closed, twelfth-pass verified).

ratchet empty · build-log 23/24
L5 · desktop

Dictation, ACP streaming, look-in, steering, resume -- shipped

one smoke click

The whole chain landed: dictation (mic → local whisper → editable prompt), ACP structured streaming (message deltas, thinking blocks, tool cards with status chips, per-turn token usage), the Live Look-in panel (browser screenshots stream in as the agent works), mid-run steering by text or voice (cancel + redirect in the same session, race-hardened), and relaunch durability (session/load proven across process death -- marker recalled verbatim). Remaining: one human smoke click in the packaged app closes 5al.6.

95% · isu 55a 8xz qz6 gck b15 v5p tx3 all closed
infra · release train

Standalone fork, publish pipeline wired

one secret away

uvx spruce-grove boots standalone (memo ask #2's mechanism), installed to PATH. publish.yml publishes on push-to-main; wheel + sdist pass twine check; PyPI names still 404 — claim runbook in docs/PYPI-CLAIM.md, gated only on Tyler's PyPI account.

90% · blocked on PYPI_API_TOKEN secret
III

Next — the live queue from bd, tonight

8 of 15 lifetime beads closed. What remains, cheapest-first:

01 · THE LAST CLICK · human
Two clicks in the packaged app

Open the rebuilt app: pill flips to ACP · syn:large:text, send a streamed prompt, click record and speak a steer. Closes 5al.6 and with it the whole execution ladder minus the parked north star.

02 · DONE · trusted publishing
spruce-grove is live on PyPI

1.0.1 and 1.0.2 published via OIDC trusted publishing (zero tokens, nothing to rotate). uv tool install spruce-grove proven from the public index — 111 packages, executables on PATH. The pipeline releases on every main push.

03 · DONE · $28.12
sprucegrove.io is ours -- and it serves

Bought at Porkbun; DNS driven in end to end (4x Pages A-records + www CNAME, parking records evicted). Announcement page is the site root; hub at /hub.html. HTTPS cert provisioning, then enforced.

04 · then · L3 frontier
More cohort plugins + vision model entry

Keep feeding real NWA people into plugin-shaped problems. Also queued: add syn:small:vision (Qwen3.8-27B, 262k) to extra_models so screenshot-reading work is priced right.

05 · parked · 5al.7
Bootable OS spin (north star)

Stays parked until the desktop app has real users asking for it.

Stays parked until the desktop app has real users asking for it. The name made literal, later.

“The harness is borrowed. The grove is ours. Leave it better than we found it.”

then: MASTER-MASTER-PROMPT.m4a · now: build-log 32 · next: bd live · together we are better, always