Spruce Grove OS · end-to-end state of the grove

Six programs. One grove.
The whole picture, verbosely.

Every program in flight, every phase in it, every open decision, every receipt. Statuses are mirrored from the in-repo boards — SOVEREIGNTY-EXECUTION.md, SOVEREIGNTY.md, DEPENDENCY-EXIT.md, VALIDATION-LADDER.md — and this page is regenerated as work lands. Counts are computed, never claimed.

census date 2026-09-16 · pyproject 1.0.52 · PyPI 1.0.53 · repo t-granlund/SPRUCE-GROVE-OS
vitals

The grove's numbers, this week

Each figure traces to a command run against the repo or a live API — the same “counts are computed” rule the whole project runs on.

1.0.53
PyPI latest
self-heals on next launch
7,873
tests passing
41 skipped · full run 2026-09-16
34 / 47
harness call sites migrated
92 pydantic-ai imports remain (was 114)
54
tags · 10 noted releases
notes pipeline now automatic
145
locked packages
0 known CVEs (pip-audit clean)
0
npm / node in the build
verified by find + workflow audit
the map

Six programs, end to end

The grove is one organism with six circulatory systems. Two are essentially done, three are mid-march, one is adopted-and-parked by design. Every section below is the verbose version of its program.

programwhat it isstate
A · The harness exitreplace the inherited agent framework with grove-owned code, behind a seamin-flight · phase 2 of 4 landed
B · The rails migrationoff-GitHub: steward identity, domains, Forgejo, the approval wallin-flight · 7 of 19 board items done
C · The council & the wallgovernance: stewards, decisions waiting on the founderopen · 4 decisions + onboarding
D · The dependency exitown or formally adopt every borrowed thingdoing · 6 rungs done with receipts · harness in-flight (34 files on the seam, 92 imports left) · 2 parked for council
E · The validation ladderdesktop onboarding, traceability matrices, the living directorydesign · specs written
F · The wedgessmall-business portfolio + family-lab (private, local-only)in-flight · 2 studies complete
program A · the sovereignty core

The harness exit — pydantic-ai, honestly

58 modules under spruce_grove/ import pydantic-ai directly (76 reference it). It owns the agent loop, streaming, tool calling, model resolution, and the retry/refresh seams. A big-bang removal is a rewrite masquerading as a cleanup — so the exit is a staged seam, one call site per landing, tests green each time. Source of truth: SOVEREIGNTY.md.

stagewhat happensstatus
1 · Inventory & freezeevery touchpoint mapped: pydantic_patches, model_factory, base_agent, event_stream_handler, round_robin_model, CLI bootstrap, MCP bridgesdone
2 · The seamspruce_grove/harness/ live: grove-owned Harness protocol (zero external imports, structurally tested), delegating adapter (parity proven), soft-failing selector (SPRUCE_GROVE_HARNESS). First two call sites migrated: subagent_invocation, private_inference.landed 2026-09-15
3 · Call-site migrationsIn order: settings surface (load_config/make_model_settings) → the ToolContext tool vocabulary → the agent loop + streaming. Settings and the vocabulary are landed; 34 files now import the seam and 92 pydantic-ai imports remain (was 114). One landing at a time, parity tests each.next: agent loop + streaming
4 · The replacementthe grove's own loop behind the protocol: stdlib + httpx streaming, the tolerant OpenAI client we already carry, our own retry/token logic (http_retry.py, claude_oauth_transport.py, tolerant_openai.py exist as seeds). Gate: tried & true in production before the flag flips — the seam runs both side by side.queued · seeds exist
5 · The flip & the pruneflip per-model/per-agent behind config, then delete. Ends with pydantic-ai gone from pyproject and PROVENANCE.md updated.awaits 3–4

Honesty note: the boot banner no longer advertises the framework (that was branding); the dependency itself is still real and still counts itself honestly here.

program B · off-github, on purpose

The rails migration — 19 board items, 7 done

The project must survive its hosting. Every task has exactly one owner: AUTO (a script, verified) or KEEPER (identity, payment, ceremony, approval — things scripts must never do). Source of truth: docs/SOVEREIGNTY-EXECUTION.md.

phaseitemsdetailstatus
A · Steward identityA1–A5steward name, email, vault, hardware keys ×2, sealed recovery kit — nothing automatableopen · steward
B · DomainsB1–B4inventory done privacy ON, expires 2027 · steward registrar · transfer · DNSSEC1 of 4 done
C · Source & release railsC1–C7GitHub inventory done · backup bundle done · site parity harness done · Forgejo stack done · stand-up + parity proof · clean-history export · push + GitHub freeze4 of 7 done
D · Deps & toolingD1–D4node removed from CI done · pip-audit done · wheel index on the new rails · quarterly allowlist review2 of 4 done
W · The approval wallW1–W5wall scripts done · train stewards · provision accounts · required reviewers on release · arm with --enforce-reviews 21 of 5 done · this week per council
program C · governance

The council & the wall — what's waiting on the founder

Three stewards, 2/3 and 3/3 thresholds, an emergency lane, and a rule for public pages: never persons, never companies — only the ethos. The wall is not armed yet; branch protection on main is still off (by choice, until the stewards exist to enforce it with).

decision / taskwhat it decidesstatus
Onboard the two incoming stewardstrain on desktop + CLI (hands-on entrance exam), provision pseudonymous accounts, hardware keys, CODEOWNERS entries, release-environment reviewers, arm the wallsteward · by end of week
Approve/reject the compat-exit ledgerall eight inherited compatibility contracts have recreation plans — dual-load, exit on evidence. Nothing executes without sign-off.awaiting approval
Approve/reject the off-GitHub runbookthe infrastructure migration runbook: steward identity → domain transfer → dual-home proof → tooling policyawaiting approval
Manifesto namingthe founding document carries the founder's name (written before the anonymity pivot): keep the named original or publish the authorless variantcouncil decision
Personal domain posturekeep personal (never project infrastructure) or drop — it cannot be made anonymouscouncil decision
program D · the borrowed-things ledger

The dependency exit — the ladder, rung by rung

Full census in docs/DEPENDENCY-EXIT.md (six tiers, verdicts computed by import scans). The ladder in execution order — a rung flips to done only with its receipt: tests green, hash proof, or a diff.

#rungreceipt requiredstatus
1Pin CI actions by SHA — 5 tag-pinned actions (checkout, setup-python, pages artifacts, pypi-publish) → immutable refsworkflows green on SHA refsqueued · one sweep
2Drop typer — computed unused by grove source AND the plugin package (0 imports both)full suite green without itqueued · verdict computed
3Self-host the site fonts — 10 pages load Fraunces/Inter/JetBrains Mono from a CDNbyte-parity build with local fontsqueued
4Dedupe requests onto httpx — 3 call sites share a client that already existsdiff + testsqueued
5Replace pyfiglet with the baked splash constants — 2 call sites; constants already exist in splash.pybanner renders from constantsqueued
6Extra-gate boto3 / azure-identity — plugin-consumed; move behind extras once lazy imports allowinstall without extras worksparked
7Adopt or vendor code-puppy-core-plugins — council decision after the compat contracts landcouncil minuteparked · council
8The harness itself — the largest dependency of all; tracked as Program A abovephases 3–5 receiptsin-flight · see program A

Already computed and documented: httpx2 is load-bearing (codex/claude transports), termflow-md renders tool output, ripgrep powers the grep tool, agent-client-protocol backs the ACP agent surface, Docker images are the exit rails (pin digests at stand-up). npm/axios: absent everywhere.

program E · the three validations

The validation ladder — what proves the grove next

Spec written 2026-09-16 in docs/VALIDATION-LADDER.md. These are the product-shaped proofs that turn a tool into a home.

validationwhat it meansfoundation already landedstatus
Desktop OS onboardingpersona-driven first run that configures agents, plugins, voice, telemetry, and model tier to the user's use case; the download → subscription → first successful run path in under five minutes; token economy and context utilization tuned from minute oneonboarding wizard skeleton, /add_model, keyring credentials, cohort plugins, desktop shell v0.1.0 (Tauri, separate repo)design · ladder: persona survey → tuned defaults → subscription flow → time-to-first-success metric
Traceability programmatrices mapping every feature, button, command, flag, and history-view behavior to the test that proves it, the build-log entry that birthed it, and the observatory narrative that explains it — generated from the registries, never hand-kept7,873-test suite, pexpect TUI harness, build-log 32 entries, observatory pipelinedesign · computed-from-registries approach agreed
The living directoryopening a folder loads it as an organism: pulses (what's hot, what changed), hooks (discovered extension points), telemetry + audit (what happened, how, why — observatory treatment), all voice-driven via mockingbird; the view small-business users will live inbrowser tool suite, observability module, audit logging, mockingbird plugin, /rec voice loopdesign · concept captured
program F · the proof grounds

The wedges — where the grove meets real users

The grove's thesis is that voice-first agentic tools should serve the people the industry forgot: the trades, the small gyms, the family. These programs are run from a private, local-only lab — the public repo carries the product ideas, never the people or the businesses.

wedgestatenext
Small-business portfoliotwo local-business studies complete using the proven playbook (brand, mission, ownership, franchising constraints, systems audit, digital presence, opportunity notes). Findings: one books jobs by mailto: with zero online booking; one runs a commercial gym portal with no public schedule and an expansion coming — both are exactly the gap the grove's small-business kit fills.pick one → depth interview → systems audit → proposal
Family labvoice-first computing for the smallest builders: a wiped-and-optimized Linux rig, a kid-safe voice loop, a school-communications portal that turns newsletters and portals into a weekly digest, and extracurricular micro-projects. Planned locally; private by design.rig build this week · portal scaffold next
Cohort pluginsJunto, barber, backoffice, creative scaffold — the persona-shaped plugin seeds are versioned in-repo (user-plugins/)shipped · grows with each wedge
how we got here

The trail so far — computed from the commit log

Thirteen days from fork to this page. Every date below is a real commit date.

2026-09-03

The fork

First commit: Code Puppy imported from upstream (Michael Pfaffenberger's MIT project), synced and renamed — the seedling transplanted into the grove.

2026-09-11

v1.0.1 goes public

First PyPI release. The voice-first wedge is already the reason the fork exists.

2026-09-15 · morning

The great relicense & the rebrand

MIT → Apache-2.0 with the upstream notice preserved verbatim; logos/ brand kit (Core Disc, Grove Marks, Ghost, Lockups); sprucegrove.io relaunched per-audience; the bootloader speaks only grove.

2026-09-15 · midday

The self-healing loop + the harness seam

Auto-update closes the loop from version check to actuation. The sovereignty seam lands: grove-owned Harness protocol, delegating adapter, soft-failing selector — first two call sites migrated.

2026-09-15 · evening

Governance, observatory, the board

Council + approval wall + compat-exit ledger; the release observatory with provenance chips; the execution board + automation kit (wall, backups, parity, Forgejo stack); session handoff written; the dashboard and dependency census go public.

2026-09-16 · today

The validation ladder + the wedges

Three validations spec'd (desktop onboarding, traceability, living directory); two business studies complete; the release-notes pipeline automated; this page.

the receipts

Release rail — every version since the rebrand

Published to PyPI by trusted publishing on every green merge. As of today the publish workflow creates the GitHub release with generated notes automatically — the rail can never go noteless again. The full narrative per landing lives in the Observatory.

versiondatewhat landedlinks
1.0.532026-09-16The validation ladder spec + the wedges; observatory regenerated with the ledger entries.PyPI
1.0.522026-09-16Observatory refresh from the living ledger.PyPI · notes
1.0.512026-09-16The rebrand completes: last dog-era copy leaves the CLI + all three locales; favicon consolidation; AGENTS.md back under cap.PyPI · notes
1.0.502026-09-15Session handoff; observatory provenance on every entry + live upstream connector; parity build sealed.PyPI · notes
1.0.492026-09-15Sovereignty execution: task board, automation kit, first supply-chain audits.PyPI · notes
1.0.482026-09-15Governance: the council, the approval wall, the compatibility-exit ledger.PyPI · notes
1.0.472026-09-15Harness seam Phase 2: grove-owned protocol, delegating adapter, first call sites migrated.PyPI · notes
1.0.462026-09-15Manifesto, the Leather Apron Gate, bootloader rebrand.PyPI · notes
1.0.452026-09-15Design system: Logo Pack complete; observatory nav QA.PyPI · notes
1.0.442026-09-15The logo pack: Core Disc, Grove Marks, Ghost, Lockups.PyPI · notes

Full history: PyPI · 54 tags on GitHub.

adopted · parked on purpose

The north star — grove on metal

When the core is grove-owned end to end and stdlib-lean, the long-horizon track opens: a runtime small enough to wake on real hardware, agnostic across Linux/macOS/Windows first, bare-metal eventually (tracked on the board, bead 5al.7). It is the destination, not the next step — and it inherits every gate and every test the seam lands along the way. Privacy-first telemetry (the r2j bead) rides the same ladder.

“The harness is borrowed. The grove is ours.
Leave it better than we found it.”
together we are better, always