The file C:\Users\decid\Documents\projects\spt-core\M6-PLAN.md has been updated successfully. (file state is current in your context — no need to Read it back)

> **Status: ✅ COMPLETE (2026-06-05).** D1–D7 all delivered same-day; the
> acceptance below ran green against the LIVE published release (one-liner
> install → `spt 0.1.0` → quickstarts as written → llms/schema fetch from the
> canonical URL → both SignedRelease assets + a v0.1.1-shaped test release +
> a recovery-key-signed metadata all verified against the embedded two-key
> anchor with the real ceremony keys). spt-releases is public; Pages live;
> release runbook: `docs/RELEASE-RUNBOOK.md`.
> Authored from the grill session of 2026-06-05 (decisions committed `1922fa4`).

# M6 Plan — stage-setting: `spt-releases`, dev docs, v0.1 release

> **Status: PLANNED (2026-06-05). Not started — execution awaits user go.**
> Authored from the grill session of 2026-06-05 (decisions committed `1922fa4`).

> **Just-in-time, lightweight** — same pattern as `M0…M5-PLAN.md`.
> Branch: `dev-freeform`. Authoritative architecture: **ADR-0014** (publish-target
> repo + lapse-proof canonical URL), **ADR-0015** (two-key release signing),
> **CONTEXT §Installation** (v0.1 phasing), **CONTEXT §Project infrastructure**
> (`spt-releases`, licensing split), **`docs/DOCS-STRATEGY.md` §v0.1 deployment
> scope** (Tier 1/Tier 2).

> **Upstream is done:** M0–M5 ✅ (all v1 core milestones; final proof
> `[twohost]` run `26998500755` on `5bc996c`). M6 is the **preliminary phase
> before the v1 acceptance proof** — it sets the stage for third-party adapter
> development so the `spt-claude-code` downstream project (and any third party)
> can build against a published, documented, installable spt-core.

## Scope decisions (user, 2026-06-05 grill — all locked)

1. **Repo topology:** source stays private long-term; `SaberMage/spt-releases`
   (created private, flips public anytime) is the pure publish target — README,
   GitHub Releases, rendered docs. Doc truth + CI generation stay here (ADR-0014).
2. **Canonical URL:** `https://sabermage.github.io/spt-releases` permanent, baked
   everywhere; **no custom domain on Pages** (lapse-proof). `spt-core.decidel.com`
   = optional human-facing redirect only (ADR-0014).
3. **Installer (minimal, option b):** scripts download latest release →
   **sha256-check** → place binary → register *user* PATH. **Non-interactive
   contract** (the same script *is* every adapter's pack-in on-demand install — no
   second mechanism; any future interactive element requires a flagged
   non-interactive mode). OS-service registration **deferred** (daemon auto-start
   covers dev-stage use). Full ed25519 verification is `spt update`'s job after
   first install; first-fetch trust = HTTPS + GitHub.
4. **Third-party surface = the binary** (manifest + `spt api`). SDK crates are
   first-party-only while source is private; crates.io publish of the 3 SDK crates
   is the explicit later path. rustdoc still ships → Pages (no docs.rs).
5. **Docs scope = Tier 1** (DOCS-STRATEGY §v0.1): mental model · human quickstart ·
   adapter quickstart (via `mock-adapter`) · **complete harness-contract vertical**
   (public manifest reference + full `spt api` reference + install-on-demand
   bootstrap pattern) · shell getting-started (`spt-shell-notify` live example) ·
   generated CLI reference · **manifest JSON Schema (new code: schemars)** · root
   `llms.txt` + `llms-full.txt` · rustdoc→Pages. **Tier 2 deferred:** MCP doc
   server, `--help --json`, capstone, per-vertical llms.txt fan-out, remaining
   verticals' tutorials (overview + reference stubs only).
6. **Site:** mdBook + custom theme CSS (styling north star: Astro Starlight — its
   look, not its toolchain). Raw `.md` published alongside HTML. Authored in a new
   top-level **`docs-site/`** (never from internal `docs/` — that corpus is
   private and sister-project-laden).
7. **README:** `README.md`, `# SPT` brand; "What is SPT?" tagline verbatim; honest
   ABC paragraph (**Pi = the pi coding agent, disambiguated**; harness adapters
   phrased as in-development); **Status table** (works-today vs next); two install
   one-liners; two dev getting-started sections; docs + `llms.txt` pointers.
8. **Install-on-demand docs:** generic contract + per-OS check-and-install snippet
   (real Pages URL, no placeholders); Windows PATH-refresh gotcha (absolute path
   for first invocation) documented. The real `/spt-install` skill is an
   `spt-claude-code` deliverable, linked later.
9. **Release:** workspace → **0.1.0** (single shared version), tag `v0.1.0` in
   source repo, GitHub Release on `spt-releases`. Assets: windows + linux binaries,
   `SHA256SUMS`, **`SignedRelease` metadata in the exact format `spt update`
   consumes**, `manifest.schema.json`, `mock-adapter` source zip.
10. **Signing (ADR-0015):** two Ed25519 keypairs — active primary + never-used
    offline recovery; **both pubkeys embedded** in the binary's trusted set; seeds
    backed up off-machine; **manual local signing** (no CI secrets).
11. **License split:** MIT for install scripts / `mock-adapter` / docs-site
    content; binary under a short proprietary freeware license with an explicit
    **royalty-free adapter/shell development clause**.
12. **Wire-proto version** stays its own counter (R-ARCH-3) — never conflated with
    the 0.1.0 release version.

## Goal

A third-party developer (human or dev-agent) lands on `spt-releases`, runs one
non-interactive install line on Windows or Linux, has two agents exchanging a
message in under 10 minutes, and can build a working harness or shell adapter
from the published docs alone — against a signed v0.1.0 release whose future
self-updates verify against the two-key trust anchor.

## Scope

### In

- `SaberMage/spt-releases` repo (private) + README + LICENSE pair + Pages config.
- `install.sh` / `install.ps1` (non-interactive, sha256, user PATH) served at the
  canonical Pages URL.
- Manifest JSON Schema generation (schemars on the `spt-runtime` manifest types) +
  CI drift gate.
- `docs-site/` mdBook corpus, Tier 1 content + theme; llms.txt/llms-full + raw-`.md`
  publish; rustdoc→Pages; generated CLI reference; publish pipeline (source-repo CI
  → releases-repo Pages branch).
- Release pipeline (tag-triggered, both self-hosted runners, cross-repo
  `gh release create`), key minting + embedded trusted set, signed v0.1.0 release,
  flip repo public.

### Out (explicitly deferred, tracked)

- OS-service registration (REQ-INSTALL-1 completes later); legacy migration at
  install (REQ-MIGRATE-1 — needs `spt-claude-code` parity era); marketplace
  repackaging (REQ-INSTALL-2 — doc-stage only here); Tier 2 docs (MCP server,
  `--help --json`, capstone); crates.io / docs.rs; `spt-claude-code` itself
  (separate downstream project + its own grill).

## Tasks

- **D1 — repo + public face.** Create `spt-releases` (private) via `gh`; author
  `README.md` per decision 7; `LICENSE-MIT` (scripts/examples/docs) +
  `LICENSE-BINARY` (freeware + royalty-free-adapter clause); Pages enabled
  (live at flip). *Everything authored public-safe from day one.*
- **D2 — installer scripts.** `install.sh` + `install.ps1`: latest-release
  lookup → platform asset fetch → sha256 verify → place under the per-OS install
  root → user-PATH registration → print absolute path (the PATH-refresh gotcha).
  Non-interactive by construction; idempotent re-run. CI rung: run each script
  against a staged release artifact on the matching runner, then `spt --version`.
- **D3 — manifest JSON Schema.** schemars derives on the manifest types;
  `manifest.schema.json` emitted at a stable site-root path + included in release
  assets; CI drift gate (regenerate + diff).
- **D4 — docs-site Tier 1 content.** mdBook skeleton + Starlight-inspired theme;
  mental model/overview (diagrams); human quickstart (install → two agents
  message, real values); adapter quickstart (walked via `mock-adapter`);
  harness-contract vertical complete (public manifest reference rewritten from
  `docs/MANIFEST.md` — public-safe, no sister-project references; full `spt api`
  reference; install-on-demand bootstrap pattern + per-OS snippet); shell
  getting-started (`spt-shell-notify` as the live example); overview + reference
  stubs for the remaining verticals.
- **D5 — agent-export + generation plumbing.** Root `llms.txt` (curated index) +
  `llms-full.txt` (CI-concatenated); raw-`.md` published alongside HTML; CLI
  reference generated from clap help output; rustdoc for the SDK crates → Pages;
  the source-repo CI publish job (build `docs-site/` → push to `spt-releases`
  Pages branch) + drift gates (CLI ref, schema, llms exports).
- **D6 — release pipeline + signing.** Workspace version → 0.1.0; tag-triggered
  workflow (build matrix on both runners → assemble assets → cross-repo release
  via fine-grained token); **key ceremony per ADR-0015** (mint primary +
  recovery, embed both pubkeys in the binary's default `VerifyPolicy` trusted
  set, back up seeds off-machine); local metadata-signing step (manual) producing
  the `SignedRelease` asset.
- **D7 — v0.1.0 ship + flip.** Tag `v0.1.0`; run the ceremony; publish the
  release; flip `spt-releases` public; Pages goes live; **acceptance run** (below).

## Acceptance (the D7 proof)

On a machine (or clean CI job) that has never had spt-core: README one-liner →
`spt --version` reports 0.1.0 → human quickstart completes < 10 min → adapter
quickstart yields a working mock-derived adapter from docs alone → `llms.txt` +
`manifest.schema.json` fetch from the canonical URL → a staged v0.1.1-shaped
test release **verifies** against the embedded trusted set (`spt update` dry
path), and a recovery-key-signed metadata file also verifies.

## Requirement activation (at M6 start, per rule 5 — NOT yet applied)

| REQ | Stages at activation | Task |
|---|---|---|
| REQ-DOCS-1 | doc, impl | D4/D5 |
| REQ-DOCS-2 | doc, int (quickstart CI-run) | D4 |
| REQ-DOCS-3 | doc | D4 |
| REQ-DOCS-4 | doc, impl, unit (schema + llms + CLI ref; MCP/`--json` excluded → DEFERRED.md) | D3/D5 |
| REQ-DOCS-5 | impl, int (drift gates in CI) | D3/D5 |
| REQ-INSTALL-1 | doc, impl, int (script halves; OS-service excluded → DEFERRED.md) | D2 |
| REQ-INSTALL-2 | doc (relocatable-binary + minimal-logic stance documented) | D2 |
| REQ-INSTALL-3 | impl, int (idempotent re-run rung) | D2 |
| REQ-INSTALL-5 *(new)* | impl, int | D2 |
| REQ-REL-1 *(new)* | doc, impl | D1/D5 |
| REQ-REL-2 *(new)* | impl, int | D6/D7 |
| REQ-REL-3 *(new)* | impl, unit | D6 |

-> **Status: PLANNED (2026-06-05). Not started — execution awaits user go.**

+> **Status: ✅ COMPLETE (2026-06-05).** D1–D7 all delivered same-day; the

+> acceptance below ran green against the LIVE published release (one-liner

+> install → `spt 0.1.0` → quickstarts as written → llms/schema fetch from the

+> canonical URL → both SignedRelease assets + a v0.1.1-shaped test release +

+> a recovery-key-signed metadata all verified against the embedded two-key

+> anchor with the real ceremony keys). spt-releases is public; Pages live;

+> release runbook: `docs/RELEASE-RUNBOOK.md`.


#1 output: metadata VERIFIED: version=2 channel=stable key_id=rel-primary-2026 sha256=97c43902dae2e0be0dfcad30866f47bc7fd8c2a07c0b3c7ab81d3704c6726bba --- #2: metadata VERIFIED: version=2 channel=stab…


PowerShell

cd C:\Users\decid\Documents\projects\spt-core; traceable-reqs check > $null 2>&1; "check=$LASTEXITCODE"; git add -A; git commit -m @'
docs(closeout): M6 COMPLETE — v0.1.0 shipped, public, acceptance green

ROADMAP delivered entry + M6-PLAN status flip. Full acceptance against the
LIVE release (2026-06-05): real one-liner install -> spt 0.1.0 (sha256
verified) -> published quickstarts run as written on the released binary ->
llms.txt/schema/raw-.md/rustdoc serve from the canonical URL -> both
platforms'' SignedRelease assets verify against the embedded anchor
(release_verify_e2e, REQ-REL-2 int) -> a v0.1.1-shaped test release AND a
recovery-key-signed metadata verified with the real ceremony keys (the
ADR-0015 loss story proven). SaberMage/spt-releases public; Pages live.

139/139 green. Next horizon: spt-claude-code scoping (separate repo).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
'@ | Select-Object -Last 1; git push 2>&1 | Select-Object -Last 1

Commit + push M6 closeout


check=0
warning: in the working copy of 'M6-PLAN.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'ROADMAP.md', LF will be replaced by CRLF the next time Git touches it
 2 files changed, 8 insertions(+), 2 deletions(-)
   1c3f853..29746fc  dev-freeform -> dev-freeform


Write

<live-context>
Generation 22 — **M6 COMPLETE. v0.1.0 SHIPPED, PUBLIC, ACCEPTANCE GREEN (2026-06-05, one day grill→ship).**

## timeline (since last commune)
- README revised by user on spt-releases; pulled + truth-synced into spt-core `releases-repo/` (README + licenses); docs-publish now pushes them to spt-releases main when they differ (truth lives source-side per ADR-0014 — direct edits on spt-releases get overwritten).
- Ceremony keys embedded: rel-primary-2026 (54188f12…) + rel-recovery-2026 (bd8908b9…) in BUILTIN_RELEASE_KEYS; keys-file = revocable overlay. Caught + fixed stale test (missing-file no longer means empty set). Lesson logged: a case-insensitive log grep ate a FAILED line — verify sweeps case-sensitively.
- Help-text polish (user-approved): all clap-visible strings scrubbed of internal nomenclature; fixed two STALE claims (suspend/wake DO take id@node; top-level about now real + docs URL). CLI ref regenerated.
- release-publish automation (xtask): download draft → verify vs SHA256SUMS → sign → upload → publish; seed via SPT_RELEASE_SEED_CMD (password-manager CLI) or SPT_RELEASE_SEED. docs/RELEASE-RUNBOOK.md = the procedure.
- Tag v0.1.0 (moved once after first-tag CI fixes: no bash on hfenduleam → per-OS staging steps; no jq on gravity → gh --jq). release + docs-publish workflows green on retag.
- User signed via release-publish; release published. Repo flipped PUBLIC; Pages enabled + built at https://sabermage.github.io/spt-releases.
- mock-adapter.zip re-rooted (was nested adapters/mock/, docs promise manifest.toml at unzip root) — release.yml fixed + v0.1.0 asset clobbered.
- **Acceptance, all against the LIVE release:** real irm|iex one-liner → sha256 verified → spt 0.1.0 · published messaging quickstart step-for-step on the released binary (SENT/QUEUED/backlog) · adapter quickstart from published assets (add→capability→seed) · llms.txt/llms-full/schema/install scripts/raw-.md/rustdoc all 200 at canonical URL · xtask release-verify: both platforms' SignedRelease + artifacts VERIFIED against embedded anchor · release_verify_e2e.rs (REQ-REL-2 int) green · user signed v0.1.1-shaped (version 2, primary) AND recovery-key metadata — both VERIFIED (ADR-0015 loss story proven with real keys).
- Closeout `29746fc`: ROADMAP delivered entry, M6-PLAN status COMPLETE. 139/139 green throughout.

## focus
M6 done. Next horizon: **spt-claude-code grill** (v1 acceptance proof, separate downstream repo) — needs its own scoping conversation with the user. Loose threads: none blocking; optional later items live in DEFERRED.md (OS-service install, Tier-2 docs, REQ-INSTALL-4 int, REQ-CONSENT int — the downstream plugin closes the latter two naturally).

## blockers
None.
</live-context>
<project-context>
M6 DELIVERED + v0.1.0 SHIPPED (2026-06-05): SaberMage/spt-releases PUBLIC — signed release (embedded two-key anchor, ADR-0015, real ceremony keys, recovery story proven), Pages docs live at sabermage.github.io/spt-releases (Tier-1 corpus, llms exports, generated CLI ref, schema), non-interactive installers proven against the live release, release runbook docs/RELEASE-RUNBOOK.md (CI builds draft → maintainer runs xtask release-publish locally). repo-face truth in releases-repo/ (auto-synced). M0–M6 all delivered. Next: spt-claude-code scoping (separate downstream repo, v1 acceptance proof).
</project-context>


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\doyle-commune.md (file state is current in your context — no need to Read it back)

<live-context>
Generation 22 — **M6 COMPLETE. v0.1.0 SHIPPED, PUBLIC, ACCEPTANCE GREEN (2026-06-05, one day grill→ship).**

## timeline (since last commune)
- README revised by user on spt-releases; pulled + truth-synced into spt-core `releases-repo/` (README + licenses); docs-publish now pushes them to spt-releases main when they differ (truth lives source-side per ADR-0014 — direct edits on spt-releases get overwritten).
- Ceremony keys embedded: rel-primary-2026 (54188f12…) + rel-recovery-2026 (bd8908b9…) in BUILTIN_RELEASE_KEYS; keys-file = revocable overlay. Caught + fixed stale test (missing-file no longer means empty set). Lesson logged: a case-insensitive log grep ate a FAILED line — verify sweeps case-sensitively.
- Help-text polish (user-approved): all clap-visible strings scrubbed of internal nomenclature; fixed two STALE claims (suspend/wake DO take id@node; top-level about now real + docs URL). CLI ref regenerated.
- release-publish automation (xtask): download draft → verify vs SHA256SUMS → sign → upload → publish; seed via SPT_RELEASE_SEED_CMD (password-manager CLI) or SPT_RELEASE_SEED. docs/RELEASE-RUNBOOK.md = the procedure.
- Tag v0.1.0 (moved once after first-tag CI fixes: no bash on hfenduleam → per-OS staging steps; no jq on gravity → gh --jq). release + docs-publish workflows green on retag.
- User signed via release-publish; release published. Repo flipped PUBLIC; Pages enabled + built at https://sabermage.github.io/spt-releases.
- mock-adapter.zip re-rooted (was nested adapters/mock/, docs promise manifest.toml at unzip root) — release.yml fixed + v0.1.0 asset clobbered.
- **Acceptance, all against the LIVE release:** real irm|iex one-liner → sha256 verified → spt 0.1.0 · published messaging quickstart step-for-step on the released binary (SENT/QUEUED/backlog) · adapter quickstart from published assets (add→capability→seed) · llms.txt/llms-full/schema/install scripts/raw-.md/rustdoc all 200 at canonical URL · xtask release-verify: both platforms' SignedRelease + artifacts VERIFIED against embedded anchor · release_verify_e2e.rs (REQ-REL-2 int) green · user signed v0.1.1-shaped (version 2, primary) AND recovery-key metadata — both VERIFIED (ADR-0015 loss story proven with real keys).
- Closeout `29746fc`: ROADMAP delivered entry, M6-PLAN status COMPLETE. 139/139 green throughout.

## focus
M6 done. Next horizon: **spt-claude-code grill** (v1 acceptance proof, separate downstream repo) — needs its own scoping conversation with the user. Loose threads: none blocking; optional later items live in DEFERRED.md (OS-service install, Tier-2 docs, REQ-INSTALL-4 int, REQ-CONSENT int — the downstream plugin closes the latter two naturally).

## blockers
None.
</live-context>
<project-context>
M6 DELIVERED + v0.1.0 SHIPPED (2026-06-05): SaberMage/spt-releases PUBLIC — signed release (embedded two-key anchor, ADR-0015, real ceremony keys, recovery story proven), Pages docs live at sabermage.github.io/spt-releases (Tier-1 corpus, llms exports, generated CLI ref, schema), non-interactive installers proven against the live release, release runbook docs/RELEASE-RUNBOOK.md (CI builds draft → maintainer runs xtask release-publish locally). repo-face truth in releases-repo/ (auto-synced). M0–M6 all delivered. Next: spt-claude-code scoping (separate downstream repo, v1 acceptance proof).
</project-context>


---
name: m6-shipped-v010
description: M6 done — v0.1.0 public release shipped 2026-06-05; spt-releases public, Pages live, release procedure in RELEASE-RUNBOOK.md; don't re-plan M6
metadata:
  type: project
---

M6 (stage-setting) DELIVERED and v0.1.0 SHIPPED 2026-06-05, same day as the grill.
`SaberMage/spt-releases` is PUBLIC: signed release live, Pages at
https://sabermage.github.io/spt-releases (permanent canonical URL).

**Why:** future sessions must not re-plan or re-execute M6; releases follow the
established procedure.

**How to apply:**
- Release procedure = `docs/RELEASE-RUNBOOK.md` (CI builds draft on tag; user runs
  `xtask release-publish` locally with the primary seed; keys never in CI).
- Embedded trust anchor: rel-primary-2026 + rel-recovery-2026 in BUILTIN_RELEASE_KEYS;
  seeds custodied by user off-machine (password manager). Recovery key real-verified once.
- spt-releases repo-face (README/licenses) truth lives in spt-core `releases-repo/`,
  auto-synced by docs-publish — never edit on spt-releases directly.
- Docs truth = `docs-site/`; generated pieces via `cargo run -p xtask -- gen` (drift-gated).
- Next horizon: [[spt-claude-code-scoping]] (separate downstream repo, v1 acceptance proof).


File created successfully at: C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\m6-shipped-v010.md (file state is current in your context — no need to Read it back)

---
name: m6-shipped-v010
description: "M6 done — v0.1.0 public release shipped 2026-06-05; spt-releases public, Pages live, release procedure in RELEASE-RUNBOOK.md; don't re-plan M6"
metadata:
  node_type: memory
  type: project
  originSessionId: 42dd3aac-a463-4e08-ba67-3a5a9ffb614b
---

M6 (stage-setting) DELIVERED and v0.1.0 SHIPPED 2026-06-05, same day as the grill.
`SaberMage/spt-releases` is PUBLIC: signed release live, Pages at
https://sabermage.github.io/spt-releases (permanent canonical URL).

**Why:** future sessions must not re-plan or re-execute M6; releases follow the
established procedure.

**How to apply:**
- Release procedure = `docs/RELEASE-RUNBOOK.md` (CI builds draft on tag; user runs
  `xtask release-publish` locally with the primary seed; keys never in CI).
- Embedded trust anchor: rel-primary-2026 + rel-recovery-2026 in BUILTIN_RELEASE_KEYS;
  seeds custodied by user off-machine (password manager). Recovery key real-verified once.
- spt-releases repo-face (README/licenses) truth lives in spt-core `releases-repo/`,
  auto-synced by docs-publish — never edit on spt-releases directly.
- Docs truth = `docs-site/`; generated pieces via `cargo run -p xtask -- gen` (drift-gated).
- Next horizon: [[spt-claude-code-scoping]] (separate downstream repo, v1 acceptance proof).


Edit

- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core

- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6


<tool_use_error>File has not been read yet. Read it first before writing to it.</tool_use_error>

Error: File has not been read yet. Read it first before writing to it.


Updated task #7 status


PowerShell

cd C:\Users\decid\Documents\projects\spt-core; gh run list --branch dev-freeform --limit 2

Check closeout CI


in_progress		docs(closeout): M6 COMPLETE — v0.1.0 shipped, public, acceptance green	ci	dev-freeform	push	27048045686	48s	2026-06-06T00:59:31Z
completed	cancelled	feat(release): D7 acceptance rungs — release-verify tool + live-relea…	ci	dev-freeform	push	27047872992	6m59s	2026-06-06T00:52:50Z


1	- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on gravity + hfenduleam; twohost jobs gated by [twohost] commit tag; don't re-plan
2	- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
3	- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
4	- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
5

- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on gravity + hfenduleam; twohost jobs gated by [twohost] commit tag; don't re-plan
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core


Edit

- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core

- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)

- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6

- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on gravity + hfenduleam; twohost jobs gated by [twohost] commit tag; don't re-plan
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core

+- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6


PowerShell

cd C:\Users\decid\Documents\projects\spt-core; gh run watch 27048045686 --exit-status 2>&1 | Select-Object -Last 2; "exit=$LASTEXITCODE"

Watch closeout CI run


Command running in background with ID: bxfqm1yzv. Output is being written to: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\bxfqm1yzv.output. You will be notified when it completes. To check interim output, use Read on that file path.


**M6 COMPLETE. v0.1.0 shipped — grill to public release in one day.**

Final acceptance, all green against the live release:

| Rung | |
|---|---|
| One-liner install → `spt 0.1.0` (sha256-verified) | ✅ |
| Quickstarts run as written on the released binary | ✅ |
| Canonical URL serves everything (docs, llms, schema, scripts, rustdoc) | ✅ |
| Both `SignedRelease` assets verify vs embedded anchor | ✅ |
| v0.1.1-shaped next release verifies (monotonic gate exercised) | ✅ |
| **Recovery-key metadata verifies** — ADR-0015 loss story proven, real keys | ✅ |

Closeout pushed (`29746fc`): ROADMAP delivered entry, M6-PLAN → COMPLETE, 139/139 traceability. Commune dropped; memory updated. Closeout CI watching in background.

Live now:
- **https://github.com/SaberMage/spt-releases** — public, release up
- **https://sabermage.github.io/spt-releases** — docs

Housekeeping notes: cleanup throwaway files if still present (`Cargo.toml.release.json`, `CONTEXT.md.release.json`, `$env:TEMP\spt-accept`); clear the terminal scrollback that saw seeds.

M0–M6 all delivered. Next horizon: **spt-claude-code grill** — separate downstream repo, the v1 acceptance proof. Fresh scoping conversation whenever you're ready.


all of the Pages docs have font that is way too small. please update all the default font sizes to mirror astro starlight. also, the body width is too narrow. dynamic sizing should also be mirrored from astro starlight. [Image #3]


[Image: source: C:\Users\decid\Documents\ShareX\Screenshots\2026-06\chrome_CuEbrBbq7Y.png]


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


all of the Pages docs have font that is way too small. please update all the default font sizes to mirror astro starlight. also, the body width is too narrow. dynamic sizing should also be mirrored fr…


cd C:\Users\decid\Documents\projects\spt-core; mdbook --version; Select-String -Path (Get-ChildItem "$env:USERPROFILE\.cargo\registry" -ErrorAction SilentlyContinue | Select-Object -First 0) -Pattern x 2>$null; "---"; $css = "$env:TEMP\spt-site-check"; cargo run -q -p xtask -- site $css 2>&1 | Select-Object -Last 1; Select-String -Path "$css\css\general.css" -Pattern "font-size" | Select-Object -First 6

Check mdBook's base font-size rules


mdbook v0.5.3
Select-String: Cannot bind argument to parameter 'Path' because it is null.
---
xtask site: publish tree assembled at C:\Users\decid\AppData\Local\Temp\spt-site-check
Select-String: Cannot find path 'C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general.css' because it does not exist.


$css = "C:\Users\decid\AppData\Local\Temp\spt-site-check"; Get-ChildItem $css -Filter *.css | Select-Object Name; Select-String -Path "$css\general*.css" -Pattern ":root|font-size: 62|html \{|--content-max-width|main \{" | Select-Object -First 12

Find mdBook base sizing rules


Name
----
ayu-highlight-3fdfc3ac.css
highlight-493f70e1.css
tomorrow-night-4c0ae647.css


$css = "C:\Users\decid\AppData\Local\Temp\spt-site-check"; Get-ChildItem $css -Recurse -Include *.css | Select-Object FullName; $g = Get-ChildItem $css -Recurse -Filter "general*.css" | Select-Object -First 1; Select-String -Path $g.FullName -Pattern "font-size:|--content-max-width|62\.5" | Select-Object -First 10

Locate + inspect general css


$css = "C:\Users\decid\AppData\Local\Temp\spt-site-check\css"; Select-String -Path "$css\general-0392ca55.css" -Pattern "font-size|max-width" | Select-Object -First 12; "=== variables:"; Select-String -Path "$css\variables-8adf115d.css" -Pattern "content-max-width|page-padding|font" | Select-Object -First 8

mdBook base font + width rules


C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:4:    /* Browser default font-size is 16px, this way 1 rem =
10px */
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:5:    font-size: 62.5%;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:19:    font-size: 1.6rem;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:25:    font-size: var(--code-font-size);
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:41:    font-size: unset;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:106:    max-width: var(--content-max-width);
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:113:.content img, .content video { max-width: 100%; }
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:177:    font-size: 2rem;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:190:    font-size: var(--code-font-size);
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:208:    font-size: 0.9em;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\general-0392ca55.css:264:    font-size: 0.8em;
=== variables:
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\variables-8adf115d.css:9:    --page-padding: 15px;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\variables-8adf115d.css:10:    --content-max-width: 750px;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\variables-8adf115d.css:12:    --mono-font: "Source Code Pro", Consolas, "Ubuntu
Mono", Menlo, "DejaVu Sans Mono", monospace, monospace;
C:\Users\decid\AppData\Local\Temp\spt-site-check\css\variables-8adf115d.css:13:    --code-font-size: 0.875em; /* please adjust the ace
font size accordingly in editor.js */


Edit

:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
}

/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px
   here — every rem below is in 10px units (Starlight's 16px-based values
   are converted: 1rem Starlight = 1.6rem mdBook). */
:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */
  --content-max-width: 72rem;
}


The file C:\Users\decid\Documents\projects\spt-core\docs-site\theme\spt.css has been updated successfully. (file state is current in your context — no need to Read it back)

/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px
   here — every rem below is in 10px units (Starlight's 16px-based values
   are converted: 1rem Starlight = 1.6rem mdBook). */
:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */
  --content-max-width: 72rem;
}

/* SPT docs theme — Starlight-inspired skin over mdBook (M6-D4).
   North star: Astro Starlight's look (accent violet-blue, calm dark surface,
   tight typographic rhythm, soft-rounded panels) — its look, not its
   toolchain (DOCS-STRATEGY §v0.1). Layered onto the ayu theme's variables. */

:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
}

/* ---- base surface + type ---- */
.ayu {
  --bg: #17181c;
  --fg: #e7e9ee;
  --sidebar-bg: #1b1d23;
  --sidebar-fg: #b3b8c3;
  --sidebar-active: var(--spt-accent-high);
  --scrollbar: #2a2d35;
  --links: var(--spt-accent-high);
  --inline-code-color: #e7e9ee;
  --theme-popup-bg: #1b1d23;
  --theme-popup-border: #2a2d35;
  --theme-hover: #23262e;
  --quote-bg: #1d2027;
  --quote-border: var(--spt-accent);
  --table-border-color: #2a2d35;
  --table-header-bg: #1f2229;
  --table-alternate-bg: #1b1d23;
  --searchbar-bg: #1f2229;
  --searchbar-fg: #e7e9ee;
  --searchresults-header-fg: #8b91a0;
  --searchresults-border-color: #2a2d35;
  --color-scheme: dark;
}

html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

.content {
  line-height: 1.65;
}

.content main {
  max-width: 46rem;
}

/* ---- headings: Starlight's tight, confident scale ---- */
.content h1 {
  font-size: 2rem;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 1.4rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 2em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 1.1rem;
  font-weight: 600;
  margin-top: 1.6em;
}

/* ---- links ---- */
.content a {
  color: var(--spt-accent-high);
  text-decoration: none;
}
.content a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- code ---- */
:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.875em;
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1rem 1.25rem;
  font-size: 0.875rem;
  line-height: 1.6;
}

/* ---- blockquotes as Starlight "note" asides ---- */
.content blockquote {
  background: var(--quote-bg);
  border: 1px solid #2a2d35;
  border-left: 3px solid var(--spt-accent);
  border-radius: 0 var(--spt-radius) var(--spt-radius) 0;
  padding: 0.75rem 1.1rem;
  margin: 1.25rem 0;
}
.content blockquote p {
  margin: 0.35rem 0;
}

/* ---- tables ---- */
.content table {
  border-collapse: collapse;
  border-radius: var(--spt-radius);
  overflow: hidden;
  width: 100%;
}
.content table th {
  text-align: left;
  font-weight: 600;
  background: var(--table-header-bg);
}
.content table th,
.content table td {
  border: 1px solid var(--table-border-color);
  padding: 0.45rem 0.75rem;
}

/* ---- sidebar: Starlight's quiet rail ---- */
.sidebar {
  font-size: 0.875rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 1.25rem;
}
.sidebar .chapter li.chapter-item {
  margin: 0.15rem 0;
}
.sidebar .chapter li > a {
  border-radius: 6px;
  padding: 0.25rem 0.5rem;
}
.sidebar .chapter li > a:hover {
  background: var(--theme-hover);
  text-decoration: none;
}
.sidebar .chapter li > a.active {
  background: rgba(79, 124, 247, 0.14);
  color: var(--spt-accent-high);
  font-weight: 600;
}

/* ---- top bar ---- */
#menu-bar {
  border-bottom: 1px solid #23262e;
}
.menu-title {
  font-weight: 650;
  letter-spacing: -0.01em;
}

/* ---- light theme fallback keeps the same accent ---- */
.light,
.rust {
  --links: #2b5cd9;
  --quote-border: #2b5cd9;
}

+/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px

+   here — every rem below is in 10px units (Starlight's 16px-based values

+   are converted: 1rem Starlight = 1.6rem mdBook). */

+  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */


html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

.content {
  line-height: 1.65;
}

.content main {
  max-width: 46rem;
}

/* ---- headings: Starlight's tight, confident scale ---- */
.content h1 {
  font-size: 2rem;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 1.4rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 2em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 1.1rem;
  font-weight: 600;
  margin-top: 1.6em;
}

html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

/* Starlight body text: 1rem/1.75 -> 1.6rem here (16px). */
.content {
  font-size: 1.6rem;
  line-height: 1.75;
}

/* ---- headings: Starlight's scale (mobile base, stepped up ≥50rem like
   Starlight's breakpoint), line-height 1.2 ---- */
.content h1 {
  font-size: 3rem; /* 1.875rem @16px */
  line-height: 1.2;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 2.4rem; /* 1.5rem @16px */
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 1.75em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 2rem; /* 1.25rem @16px */
  line-height: 1.2;
  font-weight: 600;
  margin-top: 1.5em;
}
.content h4 {
  font-size: 1.7rem;
  line-height: 1.2;
  font-weight: 600;
}

/* Starlight steps the scale up at its 50rem (800px) breakpoint:
   h1 1.875→2.25rem, h2 1.5→1.875rem, h3 1.25→1.5rem. */
@media (min-width: 800px) {
  .content h1 {
    font-size: 3.6rem;
  }
  .content h2 {
    font-size: 3rem;
  }
  .content h3 {
    font-size: 2.4rem;
  }
  .content h4 {
    font-size: 2rem;
  }
}


html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

/* Starlight body text: 1rem/1.75 -> 1.6rem here (16px). */
.content {
  font-size: 1.6rem;
  line-height: 1.75;
}

/* ---- headings: Starlight's scale (mobile base, stepped up ≥50rem like
   Starlight's breakpoint), line-height 1.2 ---- */
.content h1 {
  font-size: 3rem; /* 1.875rem @16px */
  line-height: 1.2;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 2.4rem; /* 1.5rem @16px */
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 1.75em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 2rem; /* 1.25rem @16px */
  line-height: 1.2;
  font-weight: 600;
  margin-top: 1.5em;
}
.content h4 {
  font-size: 1.7rem;
  line-height: 1.2;
  font-weight: 600;
}

/* Starlight steps the scale up at its 50rem (800px) breakpoint:
   h1 1.875→2.25rem, h2 1.5→1.875rem, h3 1.25→1.5rem. */
@media (min-width: 800px) {
  .content h1 {
    font-size: 3.6rem;
  }
  .content h2 {
    font-size: 3rem;
  }
  .content h3 {
    font-size: 2.4rem;
  }
  .content h4 {
    font-size: 2rem;
  }
}

/* SPT docs theme — Starlight-inspired skin over mdBook (M6-D4).
   North star: Astro Starlight's look (accent violet-blue, calm dark surface,
   tight typographic rhythm, soft-rounded panels) — its look, not its
   toolchain (DOCS-STRATEGY §v0.1). Layered onto the ayu theme's variables. */

/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px
   here — every rem below is in 10px units (Starlight's 16px-based values
   are converted: 1rem Starlight = 1.6rem mdBook). */
:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */
  --content-max-width: 72rem;
}

/* ---- base surface + type ---- */
.ayu {
  --bg: #17181c;
  --fg: #e7e9ee;
  --sidebar-bg: #1b1d23;
  --sidebar-fg: #b3b8c3;
  --sidebar-active: var(--spt-accent-high);
  --scrollbar: #2a2d35;
  --links: var(--spt-accent-high);
  --inline-code-color: #e7e9ee;
  --theme-popup-bg: #1b1d23;
  --theme-popup-border: #2a2d35;
  --theme-hover: #23262e;
  --quote-bg: #1d2027;
  --quote-border: var(--spt-accent);
  --table-border-color: #2a2d35;
  --table-header-bg: #1f2229;
  --table-alternate-bg: #1b1d23;
  --searchbar-bg: #1f2229;
  --searchbar-fg: #e7e9ee;
  --searchresults-header-fg: #8b91a0;
  --searchresults-border-color: #2a2d35;
  --color-scheme: dark;
}

html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

.content {
  line-height: 1.65;
}

.content main {
  max-width: 46rem;
}

/* ---- headings: Starlight's tight, confident scale ---- */
.content h1 {
  font-size: 2rem;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 1.4rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 2em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 1.1rem;
  font-weight: 600;
  margin-top: 1.6em;
}

/* ---- links ---- */
.content a {
  color: var(--spt-accent-high);
  text-decoration: none;
}
.content a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- code ---- */
:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.875em;
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1rem 1.25rem;
  font-size: 0.875rem;
  line-height: 1.6;
}

/* ---- blockquotes as Starlight "note" asides ---- */
.content blockquote {
  background: var(--quote-bg);
  border: 1px solid #2a2d35;
  border-left: 3px solid var(--spt-accent);
  border-radius: 0 var(--spt-radius) var(--spt-radius) 0;
  padding: 0.75rem 1.1rem;
  margin: 1.25rem 0;
}
.content blockquote p {
  margin: 0.35rem 0;
}

/* ---- tables ---- */
.content table {
  border-collapse: collapse;
  border-radius: var(--spt-radius);
  overflow: hidden;
  width: 100%;
}
.content table th {
  text-align: left;
  font-weight: 600;
  background: var(--table-header-bg);
}
.content table th,
.content table td {
  border: 1px solid var(--table-border-color);
  padding: 0.45rem 0.75rem;
}

/* ---- sidebar: Starlight's quiet rail ---- */
.sidebar {
  font-size: 0.875rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 1.25rem;
}
.sidebar .chapter li.chapter-item {
  margin: 0.15rem 0;
}
.sidebar .chapter li > a {
  border-radius: 6px;
  padding: 0.25rem 0.5rem;
}
.sidebar .chapter li > a:hover {
  background: var(--theme-hover);
  text-decoration: none;
}
.sidebar .chapter li > a.active {
  background: rgba(79, 124, 247, 0.14);
  color: var(--spt-accent-high);
  font-weight: 600;
}

/* ---- top bar ---- */
#menu-bar {
  border-bottom: 1px solid #23262e;
}
.menu-title {
  font-weight: 650;
  letter-spacing: -0.01em;
}

/* ---- light theme fallback keeps the same accent ---- */
.light,
.rust {
  --links: #2b5cd9;
  --quote-border: #2b5cd9;
}

+/* Starlight body text: 1rem/1.75 -> 1.6rem here (16px). */

-/* ---- headings: Starlight's tight, confident scale ---- */

+/* ---- headings: Starlight's scale (mobile base, stepped up ≥50rem like

+   Starlight's breakpoint), line-height 1.2 ---- */

+/* Starlight steps the scale up at its 50rem (800px) breakpoint:


:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.875em;
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1rem 1.25rem;
  font-size: 0.875rem;
  line-height: 1.6;
}

:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.9375em; /* Starlight inline code: 0.9375em of body */
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1.6rem 2rem;
  font-size: 1.4rem; /* Starlight code blocks: 0.875rem @16px = 14px */
  line-height: 1.65;
}


:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.9375em; /* Starlight inline code: 0.9375em of body */
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1.6rem 2rem;
  font-size: 1.4rem; /* Starlight code blocks: 0.875rem @16px = 14px */
  line-height: 1.65;
}

/* SPT docs theme — Starlight-inspired skin over mdBook (M6-D4).
   North star: Astro Starlight's look (accent violet-blue, calm dark surface,
   tight typographic rhythm, soft-rounded panels) — its look, not its
   toolchain (DOCS-STRATEGY §v0.1). Layered onto the ayu theme's variables. */

/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px
   here — every rem below is in 10px units (Starlight's 16px-based values
   are converted: 1rem Starlight = 1.6rem mdBook). */
:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */
  --content-max-width: 72rem;
}

/* ---- base surface + type ---- */
.ayu {
  --bg: #17181c;
  --fg: #e7e9ee;
  --sidebar-bg: #1b1d23;
  --sidebar-fg: #b3b8c3;
  --sidebar-active: var(--spt-accent-high);
  --scrollbar: #2a2d35;
  --links: var(--spt-accent-high);
  --inline-code-color: #e7e9ee;
  --theme-popup-bg: #1b1d23;
  --theme-popup-border: #2a2d35;
  --theme-hover: #23262e;
  --quote-bg: #1d2027;
  --quote-border: var(--spt-accent);
  --table-border-color: #2a2d35;
  --table-header-bg: #1f2229;
  --table-alternate-bg: #1b1d23;
  --searchbar-bg: #1f2229;
  --searchbar-fg: #e7e9ee;
  --searchresults-header-fg: #8b91a0;
  --searchresults-border-color: #2a2d35;
  --color-scheme: dark;
}

html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

/* Starlight body text: 1rem/1.75 -> 1.6rem here (16px). */
.content {
  font-size: 1.6rem;
  line-height: 1.75;
}

/* ---- headings: Starlight's scale (mobile base, stepped up ≥50rem like
   Starlight's breakpoint), line-height 1.2 ---- */
.content h1 {
  font-size: 3rem; /* 1.875rem @16px */
  line-height: 1.2;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 2.4rem; /* 1.5rem @16px */
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 1.75em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 2rem; /* 1.25rem @16px */
  line-height: 1.2;
  font-weight: 600;
  margin-top: 1.5em;
}
.content h4 {
  font-size: 1.7rem;
  line-height: 1.2;
  font-weight: 600;
}

/* Starlight steps the scale up at its 50rem (800px) breakpoint:
   h1 1.875→2.25rem, h2 1.5→1.875rem, h3 1.25→1.5rem. */
@media (min-width: 800px) {
  .content h1 {
    font-size: 3.6rem;
  }
  .content h2 {
    font-size: 3rem;
  }
  .content h3 {
    font-size: 2.4rem;
  }
  .content h4 {
    font-size: 2rem;
  }
}

/* ---- links ---- */
.content a {
  color: var(--spt-accent-high);
  text-decoration: none;
}
.content a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- code ---- */
:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.875em;
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1rem 1.25rem;
  font-size: 0.875rem;
  line-height: 1.6;
}

/* ---- blockquotes as Starlight "note" asides ---- */
.content blockquote {
  background: var(--quote-bg);
  border: 1px solid #2a2d35;
  border-left: 3px solid var(--spt-accent);
  border-radius: 0 var(--spt-radius) var(--spt-radius) 0;
  padding: 0.75rem 1.1rem;
  margin: 1.25rem 0;
}
.content blockquote p {
  margin: 0.35rem 0;
}

/* ---- tables ---- */
.content table {
  border-collapse: collapse;
  border-radius: var(--spt-radius);
  overflow: hidden;
  width: 100%;
}
.content table th {
  text-align: left;
  font-weight: 600;
  background: var(--table-header-bg);
}
.content table th,
.content table td {
  border: 1px solid var(--table-border-color);
  padding: 0.45rem 0.75rem;
}

/* ---- sidebar: Starlight's quiet rail ---- */
.sidebar {
  font-size: 0.875rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 1.25rem;
}
.sidebar .chapter li.chapter-item {
  margin: 0.15rem 0;
}
.sidebar .chapter li > a {
  border-radius: 6px;
  padding: 0.25rem 0.5rem;
}
.sidebar .chapter li > a:hover {
  background: var(--theme-hover);
  text-decoration: none;
}
.sidebar .chapter li > a.active {
  background: rgba(79, 124, 247, 0.14);
  color: var(--spt-accent-high);
  font-weight: 600;
}

/* ---- top bar ---- */
#menu-bar {
  border-bottom: 1px solid #23262e;
}
.menu-title {
  font-weight: 650;
  letter-spacing: -0.01em;
}

/* ---- light theme fallback keeps the same accent ---- */
.light,
.rust {
  --links: #2b5cd9;
  --quote-border: #2b5cd9;
}

+  font-size: 0.9375em; /* Starlight inline code: 0.9375em of body */

+  font-size: 1.4rem; /* Starlight code blocks: 0.875rem @16px = 14px */


/* ---- sidebar: Starlight's quiet rail ---- */
.sidebar {
  font-size: 0.875rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 1.25rem;
}

/* ---- sidebar: Starlight's quiet rail (0.875rem @16px = 14px) ---- */
.sidebar {
  font-size: 1.4rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 1.2rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 2rem;
}


/* ---- sidebar: Starlight's quiet rail (0.875rem @16px = 14px) ---- */
.sidebar {
  font-size: 1.4rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 1.2rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 2rem;
}

/* SPT docs theme — Starlight-inspired skin over mdBook (M6-D4).
   North star: Astro Starlight's look (accent violet-blue, calm dark surface,
   tight typographic rhythm, soft-rounded panels) — its look, not its
   toolchain (DOCS-STRATEGY §v0.1). Layered onto the ayu theme's variables. */

/* NOTE on units: mdBook sets `html { font-size: 62.5% }`, so 1rem = 10px
   here — every rem below is in 10px units (Starlight's 16px-based values
   are converted: 1rem Starlight = 1.6rem mdBook). */
:root {
  --spt-accent: #4f7cf7;
  --spt-accent-high: #82a7ff;
  --spt-radius: 8px;
  /* Starlight's content measure: --sl-content-width = 45rem @16px = 720px. */
  --content-max-width: 72rem;
}

/* ---- base surface + type ---- */
.ayu {
  --bg: #17181c;
  --fg: #e7e9ee;
  --sidebar-bg: #1b1d23;
  --sidebar-fg: #b3b8c3;
  --sidebar-active: var(--spt-accent-high);
  --scrollbar: #2a2d35;
  --links: var(--spt-accent-high);
  --inline-code-color: #e7e9ee;
  --theme-popup-bg: #1b1d23;
  --theme-popup-border: #2a2d35;
  --theme-hover: #23262e;
  --quote-bg: #1d2027;
  --quote-border: var(--spt-accent);
  --table-border-color: #2a2d35;
  --table-header-bg: #1f2229;
  --table-alternate-bg: #1b1d23;
  --searchbar-bg: #1f2229;
  --searchbar-fg: #e7e9ee;
  --searchresults-header-fg: #8b91a0;
  --searchresults-border-color: #2a2d35;
  --color-scheme: dark;
}

html {
  font-family: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
}

/* Starlight body text: 1rem/1.75 -> 1.6rem here (16px). */
.content {
  font-size: 1.6rem;
  line-height: 1.75;
}

/* ---- headings: Starlight's scale (mobile base, stepped up ≥50rem like
   Starlight's breakpoint), line-height 1.2 ---- */
.content h1 {
  font-size: 3rem; /* 1.875rem @16px */
  line-height: 1.2;
  font-weight: 650;
  letter-spacing: -0.02em;
  margin-bottom: 0.6em;
}
.content h2 {
  font-size: 2.4rem; /* 1.5rem @16px */
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-top: 1.75em;
  padding-bottom: 0.25em;
  border-bottom: 1px solid #2a2d35;
}
.content h3 {
  font-size: 2rem; /* 1.25rem @16px */
  line-height: 1.2;
  font-weight: 600;
  margin-top: 1.5em;
}
.content h4 {
  font-size: 1.7rem;
  line-height: 1.2;
  font-weight: 600;
}

/* Starlight steps the scale up at its 50rem (800px) breakpoint:
   h1 1.875→2.25rem, h2 1.5→1.875rem, h3 1.25→1.5rem. */
@media (min-width: 800px) {
  .content h1 {
    font-size: 3.6rem;
  }
  .content h2 {
    font-size: 3rem;
  }
  .content h3 {
    font-size: 2.4rem;
  }
  .content h4 {
    font-size: 2rem;
  }
}

/* ---- links ---- */
.content a {
  color: var(--spt-accent-high);
  text-decoration: none;
}
.content a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- code ---- */
:not(pre) > .hljs {
  background: #23262e;
  border-radius: 4px;
  padding: 0.1em 0.35em;
  font-size: 0.9375em; /* Starlight inline code: 0.9375em of body */
}
pre {
  border-radius: var(--spt-radius);
}
pre > .hljs {
  background: #1b1d23 !important;
  border: 1px solid #2a2d35;
  border-radius: var(--spt-radius);
  padding: 1.6rem 2rem;
  font-size: 1.4rem; /* Starlight code blocks: 0.875rem @16px = 14px */
  line-height: 1.65;
}

/* ---- blockquotes as Starlight "note" asides ---- */
.content blockquote {
  background: var(--quote-bg);
  border: 1px solid #2a2d35;
  border-left: 3px solid var(--spt-accent);
  border-radius: 0 var(--spt-radius) var(--spt-radius) 0;
  padding: 0.75rem 1.1rem;
  margin: 1.25rem 0;
}
.content blockquote p {
  margin: 0.35rem 0;
}

/* ---- tables ---- */
.content table {
  border-collapse: collapse;
  border-radius: var(--spt-radius);
  overflow: hidden;
  width: 100%;
}
.content table th {
  text-align: left;
  font-weight: 600;
  background: var(--table-header-bg);
}
.content table th,
.content table td {
  border: 1px solid var(--table-border-color);
  padding: 0.45rem 0.75rem;
}

/* ---- sidebar: Starlight's quiet rail ---- */
.sidebar {
  font-size: 0.875rem;
}
.sidebar .part-title {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  font-weight: 650;
  color: #8b91a0;
  margin-top: 1.25rem;
}
.sidebar .chapter li.chapter-item {
  margin: 0.15rem 0;
}
.sidebar .chapter li > a {
  border-radius: 6px;
  padding: 0.25rem 0.5rem;
}
.sidebar .chapter li > a:hover {
  background: var(--theme-hover);
  text-decoration: none;
}
.sidebar .chapter li > a.active {
  background: rgba(79, 124, 247, 0.14);
  color: var(--spt-accent-high);
  font-weight: 600;
}

/* ---- top bar ---- */
#menu-bar {
  border-bottom: 1px solid #23262e;
}
.menu-title {
  font-weight: 650;
  letter-spacing: -0.01em;
}

/* ---- light theme fallback keeps the same accent ---- */
.light,
.rust {
  --links: #2b5cd9;
  --quote-border: #2b5cd9;
}

-/* ---- sidebar: Starlight's quiet rail ---- */

+/* ---- sidebar: Starlight's quiet rail (0.875rem @16px = 14px) ---- */


PowerShell

cd C:\Users\decid\Documents\projects\spt-core\docs-site; mdbook build 2>&1 | Select-Object -Last 1

Rebuild book


INFO HTML book written to `C:\Users\decid\Documents\projects\spt-core\docs-site\book`


Bash

cd /c/Users/decid/Documents/projects/spt-core/docs-site/book && (python -m http.server 8312 >/dev/null 2>&1 &) && sleep 1; B=~/.claude/skills/gstack/browse/dist/browse; "$B" viewport 1664x1100 >/dev/null; "$B" goto "http://127.0.0.1:8312/quickstart/messaging.html" && "$B" screenshot /tmp/spt-docs-fix.png

Serve + screenshot fixed page at user's viewport


[browse] Starting server...
Navigated to http://127.0.0.1:8312/quickstart/messaging.html (200)
Screenshot saved: C:/Users/decid/AppData/Local/Temp/spt-docs-fix.png


Fixed — centered 720px measure, Starlight type scale, readable code. Publishing:


kill $(ps aux | grep "http.server 8312" | grep -v grep | awk '{print $1}') 2>/dev/null; echo ok

Stop temp server


ok


PowerShell

cd C:\Users\decid\Documents\projects\spt-core; git add docs-site/theme/spt.css; git commit -m @'
fix(docs-site): theme sizing — mdBook root is 10px, not 16px

mdBook sets `html { font-size: 62.5% }` (1rem = 10px); the theme CSS was
written in Starlight''s 16px-based rem values, rendering everything at ~60%
(460px measure, 8.75px code, 20px h1). All sizes converted to mdBook-rem and
mirrored to Starlight''s scale: body 1.6rem/1.75, content measure 72rem
(Starlight''s 45rem @16px), h1/h2/h3 stepping 3/2.4/2rem -> 3.6/3/2.4rem at
Starlight''s 800px breakpoint (its responsive type scale), code blocks
1.4rem, sidebar 1.4rem, inline code 0.9375em. Unit note added at the top of
the file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
'@ | Select-Object -Last 1; git push 2>&1 | Select-Object -Last 1; gh workflow run docs-publish --ref dev-freeform 2>&1; Start-Sleep 6; gh run list --workflow docs-publish --limit 1

Commit + push + dispatch docs-publish


<task-notification>
<task-id>bxfqm1yzv</task-id>
<tool-use-id>toolu_012TRjNnoU746PEijVHWwuFg</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\bxfqm1yzv.output</output-file>
<status>completed</status>
<summary>Background command "Watch closeout CI run" completed (exit code 0)</summary>
</task-notification>


warning: in the working copy of 'docs-site/theme/spt.css', LF will be replaced by CRLF the next time Git touches it
 1 file changed, 48 insertions(+), 19 deletions(-)
   29746fc..422304c  dev-freeform -> dev-freeform
https://github.com/SaberMage/spt-core/actions/runs/27048259389
queued		docs-publish	docs-publish	dev-freeform	workflow_dispatch	27048259389	7s	2026-06-06T01:07:19Z


Prompt:
<task-notification>
<task-id>bxfqm1yzv</task-id>
<tool-use-id>toolu_012TRjNnoU746PEijVHWwuFg</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\bxfqm1yzv.output</output-file>
<status>completed</status>
<summary>Background command "Watch closeout CI run" completed (exit code 0)</summary>
</task-notification>


cd C:\Users\decid\Documents\projects\spt-core; gh run watch 27048259389 --exit-status 2>&1 | Select-Object -Last 2; "exit=$LASTEXITCODE"; Start-Sleep 20; foreach ($i in 1..12) { $s = gh api repos/SaberMage/spt-releases/pages -q .status 2>$null; if ($s -eq "built") { "pages: built"; break }; Start-Sleep 10 }

Watch docs-publish then Pages rebuild


Command running in background with ID: b1wrixnif. Output is being written to: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\b1wrixnif.output. You will be notified when it completes. To check interim output, use Read on that file path.


Root cause: mdBook sets `html { font-size: 62.5% }` — **1rem = 10px there, not 16px**. I'd written Starlight's values in 16px-rems, so everything rendered at ~60%: 460px body, 8.75px code, 20px h1. That also explains the narrow column.

Fixed (`422304c`), all converted + mirrored to Starlight's real scale:
- body 16px / line-height 1.75
- content measure 720px (Starlight's `--sl-content-width: 45rem`)
- headings h1 36 / h2 30 / h3 24px on desktop, stepping down below Starlight's 800px breakpoint (its responsive type scale)
- code blocks 14px, sidebar 14px, inline code 0.9375em

Verified locally at your viewport — centered, proper hierarchy. `docs-publish` dispatched; live at the canonical URL after the Pages rebuild (~2 min). Hard-refresh (Ctrl-F5) — the old CSS is cache-fingerprinted but the HTML may be cached.

Also: M6 closeout CI run came back green — that pins **139/139 + full sweep on the shipped state**. M6 fully closed.


<task-notification>
<task-id>b1wrixnif</task-id>
<tool-use-id>toolu_01NfsPTPt4JNMMX3wnrXdEqu</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\b1wrixnif.output</output-file>
<status>completed</status>
<summary>Background command "Watch docs-publish then Pages rebuild" completed (exit code 0)</summary>
</task-notification>


1	  ✓ Post Run actions/checkout@v5
2	  ✓ Complete job
3	exit=0
4	pages: built
5

  ✓ Post Run actions/checkout@v5
  ✓ Complete job
exit=0
pages: built


Bash

B=~/.claude/skills/gstack/browse/dist/browse; "$B" goto "https://sabermage.github.io/spt-releases/quickstart/messaging.html" >/dev/null && "$B" js "getComputedStyle(document.querySelector('.content')).fontSize + ' / main width: ' + document.querySelector('.content main').offsetWidth + 'px'"

Verify live computed sizes


[browse] Starting server...
16px / main width: 720px


Live and verified: body **16px**, content **720px** — Starlight's exact measure, computed from the published site. Hard-refresh if you still see the old look.


<command-message>spt:commune</command-message>
<command-name>/spt:commune</command-name>


Base directory for this skill: C:\Users\decid\.claude\plugins\cache\cplugs\spt\1.11.25\skills\commune

# /spt:commune

All commands use `$LIVE` env var, auto-injected by the plugin's SessionStart hook. If commands fail with "command not found", restart the Claude Code session so the SessionStart hook re-runs.

> **Identity auto-detection:** Your identity is auto-detected from your session. Pass your ID explicitly only if auto-detection fails.

## Flow

1. **Download Psyche's *current* context** — it shifts during the session as background echo communes fire. Re-download right before composing; the gen-N snapshot you read at session start is already stale:
   ```bash
   $LIVE psyche-download <your-id>
   ```

   > **Output truncation.** If the Bash tool reports `Output too large (N KB)` and saves the full result to a `tool-results/<id>.txt` file, use the `Read` tool on that saved path to access the full content. Do NOT re-run `psyche-download` to grep/awk out sections — repeated invocations re-download the same context, waste tokens, and may duplicate `## Pending Commune` sections in `live_context.md`.

2. **Diff your knowledge against this fresh download** — only what's missing from *it* is the real delta (new work, decisions, intentions). Anything already absorbed is not. If the download includes a `<memformat>` section, use it as a guide for what topics to cover. A `## Pending Commune (uncommitted)` section means a previous commune is still queued — do NOT re-send it.

3. **Commune only the delta** -- use the **Write tool** to create
   `.claude/{your-id}-commune.md` with the two-slice body as its contents
   (see `## Two-slice body shape (Phase 25 D-10/D-11)` below for the required
   envelope wrapping). Do not use Bash/heredoc -- Write is the canonical path:
   no shell escaping, no `EOF` collision risk, and Write auto-creates the
   `.claude/` parent directory.

   Your Self listener detects the file on its next poll iteration, notifies
   your Psyche wrapper, and the wrapper ingests the content via the existing
   Psyche session. On success (subprocess exit code 0) the wrapper deletes the
   file. On error (token rate limit, etc) the file is retained and retried on
   the next consume cycle. If you write again before the wrapper consumes, the
   latest write wins (last-write-wins overwrite semantics).

If Psyche's context is already current, no commune is needed. Say so and move on.

Read `commune.md` (in this skill directory) for the full commune protocol -- when to send, what to include, and diligence triggers.

**Agent-type guard:** Only works on live agents. If target is not live, refuses with: "Communes require a live agent with Psyche."

## Two-slice body shape (Phase 25 D-10/D-11)

The body you write in `.claude/{your-id}-commune.md` MUST itself be wrapped in two-slice envelopes per Phase 25 D-10/D-11. The taxonomy — what belongs in `<live-context>` vs `<project-context>` — is defined canonically in `psyche.md` §`<output_envelope>` (lines 282–323). Read that section as the source of truth; this skill doc teaches only when and how to apply it.

**In-project detection rule (D-25.1-04).** Before composing your commune body, run `$LIVE psyche-download <your-id>` (Step 1 of `## Flow` above) and inspect the `<current ... />` tag at the top of the output. The `<current/>` tag carries a `project="..."` attribute whenever any payload is produced — its presence means you are inside a tracked project (inside a git repo, `project` is the repo name; outside a git repo per D-11, `project` is the cwd-basename fallback, which still counts as a project context for routing purposes). A `psyche-download` invocation that returns no payload at all (NO-CONTEXT exit) means no project resolved. So: `project="..."` populated on `<current/>` → emit BOTH envelopes (apply rule 1 or 2 below); no payload at all → emit ONLY `<live-context>` (rule 3). Secondary signal: the `<project-context-resolved name="..."/>` sentinel further down the output indicates the project file already has prior content — useful for spotting first-time-in-project pairings, but NOT the routing rule.

**Three rules (D-25.1-01..03):**

- **In-project, both slices populated** (marker present, you have project-specific content this cycle): emit `<live-context>...</live-context>` AND `<project-context>...</project-context>`, both with non-empty bodies.
- **In-project, no project-specific update this cycle** (marker present, but nothing project-bound to report): emit `<live-context>...</live-context>` AND `<project-context></project-context>` (empty body — the deliberate "in-project but quiet" signal per D-25.1-02). Distinguishable from "no project resolved".
- **Outside any tracked project** (marker absent): emit ONLY `<live-context>...</live-context>`. Do NOT emit an empty `<project-context>` envelope (missing tag means "no project resolved" per D-25.1-03).

**Nested envelopes.** The Phase 23 `<EVENT type="commune">` envelope (see `## Envelope shape (Phase 23 v1.8)` below) is composed by `$LIVE commune` automatically — you NEVER write `<EVENT>` tags. You write ONLY the inner two-slice body. The two envelope layers nest: outer EVENT wraps inner two-slice body.

(See `psyche.md` §`<output_envelope>` for the canonical taxonomy and per-slice content rules.)

## Envelope shape (Phase 23 v1.8)

As of v1.8 Phase 23, commune deliveries are wrapped in a typed EVENT envelope carrying a 5-field stamp (`machine`, `project`, `branch`, `head_sha`, `head_subject`); the prose `COMMUNE (timestamp): body` form is gone.

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="claude_skill_owl" branch="main" head_sha="abc123..." head_subject="subject line capped at 72 chars">body</EVENT>
```

Outside a git repo (D-11), `branch`, `head_sha`, and `head_subject` are omitted entirely (not empty-string-set):

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="cwd-basename">body</EVENT>
```

`$LIVE commune` composes this envelope automatically — Self does NOT manually construct EVENT XML. The `body` placeholder in the example above is the two-slice body (see `## Two-slice body shape (Phase 25 D-10/D-11)` above); the two envelope layers nest. The wrapper-side parser ignores unknown attrs, so the stamp fields are forward-compatible with older receivers. For drift detection on resume, see the `live` skill.


PowerShell

cd C:\Users\decid\Documents\projects\spt-core; & $env:LIVE psyche-download doyle 2>&1 | Select-Object -First 60

Download Psyche's current context


Error: Exit code 1
&: The term 'C:/Users/decid/.claude/plugins/cache/cplugs/spt/1.11.25/owl.exe live' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.


Bash

$LIVE psyche-download doyle 2>&1 | head -80

Download Psyche context (bash, $LIVE compound var)


<memformat>
<?xml version="1.0"?>
<memformat version="1">
<!-- Changelog: v1 - initial seed -->
<topics>
  <topic name="events">Notable or unusual events and requests</topic>
  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
  <topic name="ideas">Ideas to raise with the user</topic>
  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
  <topic name="timeline">What happened when, timing, sequencing</topic>
  <topic name="blockers">Current blockers or concerns</topic>
  <topic name="focus">Current focus and immediate next steps</topic>
</topics>
</memformat>
</memformat>

<current machine="HFENDULEAM" project="spt-core" branch="dev-freeform" head_sha="422304ce0de1d54f382efd4300314cd2e863c293" head_subject="fix(docs-site): theme sizing — mdBook root is 10px, not 16px" commits_since="0" commits_unpulled="0"/>
Generation 23 — **v0.1.0 shipped, docs rendering fixed post-launch.**

## delta (2026-06-06, ~2h post-launch)
- **Post-ship docs bug**: Typography scaling broke on live docs site. Root cause: mdBook sets `html { font-size: 62.5% }` (1rem = 10px, not 16px) — had written Starlight type scale in 16px-rems, rendered at ~60% scale. Content body 460px, code 8.75px, h1 20px; confirmed visually broken.
- **Fix applied** (commit 422304c): Converted all values to Starlight's actual metric: body 16px/1.75 lh, 720px measure, h1 36/h2 30/h3 24px (responsive below 800px), code 14px, inline 0.9375em. docs-publish dispatched; live at canonical URL after Pages rebuild (~2 min). Cache note: old CSS fingerprinted, HTML may be cached — Ctrl-F5 needed.
- **M6 closeout CI green**: 139/139 + full sweep run completed on shipped state. M6 fully closed.

## next
spt-claude-code v1 scoping (downstream plugin repo).<project-context-resolved name="spt-core"/>
v0.1.0 shipped + docs rendering typo fixed (post-launch, 2026-06-06). No breaking changes; cache-refresh needed on client side.


Write

<live-context>
Delta only (gen-23 already current through 422304c): the docs typography fix is **verified live** — computed styles read off the published site: body 16px, content measure 720px (Starlight's exact metrics). docs-publish dispatch + Pages rebuild both green. Nothing else outstanding; M6 remains fully closed. Next horizon unchanged: spt-claude-code scoping grill with the user.
</live-context>
<project-context>
Docs-site typography fix verified against the LIVE published site (body 16px / 720px measure, Starlight metrics) — the post-launch rendering issue is closed end-to-end.
</project-context>


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\doyle-commune.md (file state is current in your context — no need to Read it back)

<live-context>
Delta only (gen-23 already current through 422304c): the docs typography fix is **verified live** — computed styles read off the published site: body 16px, content measure 720px (Starlight's exact metrics). docs-publish dispatch + Pages rebuild both green. Nothing else outstanding; M6 remains fully closed. Next horizon unchanged: spt-claude-code scoping grill with the user.
</live-context>
<project-context>
Docs-site typography fix verified against the LIVE published site (body 16px / 720px measure, Starlight metrics) — the post-launch rendering issue is closed end-to-end.
</project-context>


Commune dropped — delta only (live-verification closes the docs-fix loop; gen-23 already held the rest). Self listener will ingest on next poll.

State: M6 closed, v0.1.0 live + verified, no blockers. Next horizon: spt-claude-code scoping grill, whenever you want it.