From 140c596404060124a18df783bfe4de513f51add4 Mon Sep 17 00:00:00 2001 From: Dmitrij Zykovic Date: Wed, 5 Aug 2026 00:16:42 +0100 Subject: [PATCH] Moved the shipped iteration specs into docs/specs/completed and made the drafts to completed layout part of the rules, skills and doc links --- .claude/skills/dev-onboard/SKILL.md | 3 ++- .claude/skills/dev-review-changes/SKILL.md | 5 +++-- .claude/skills/spec-implement/SKILL.md | 6 ++++-- .claude/skills/spec-new-iteration/SKILL.md | 10 ++++++---- CLAUDE.md | 17 ++++++++++------- CONTRIBUTING.md | 6 ++++-- README.md | 2 +- docs/Architecture.md | 2 +- .../{ => completed}/001 - Walking Skeleton.md | 4 ++-- .../{ => completed}/002 - Managed Sandbox UI.md | 4 ++-- .../003 - Open-Source Readiness.md | 4 ++-- .../004 - Default Sandbox Picker.md | 4 ++-- .../005 - Dockerfile Base And Reuse.md | 4 ++-- .../006 - Per-Project Secret Cache.md | 4 ++-- .../007 - Generated Project CLI.md | 4 ++-- .../008 - Lifecycle Progress Feedback.md | 4 ++-- .../009 - Read-Only Discovery.md | 4 ++-- .../010 - Marketplace Release.md | 4 ++-- .../011 - Fresh Image Rebuild.md | 4 ++-- .../012 - Create Before Attach.md | 4 ++-- .../013 - Visible And Cancellable Operations.md | 4 ++-- 21 files changed, 57 insertions(+), 46 deletions(-) rename docs/specs/{ => completed}/001 - Walking Skeleton.md (92%) rename docs/specs/{ => completed}/002 - Managed Sandbox UI.md (94%) rename docs/specs/{ => completed}/003 - Open-Source Readiness.md (95%) rename docs/specs/{ => completed}/004 - Default Sandbox Picker.md (91%) rename docs/specs/{ => completed}/005 - Dockerfile Base And Reuse.md (94%) rename docs/specs/{ => completed}/006 - Per-Project Secret Cache.md (95%) rename docs/specs/{ => completed}/007 - Generated Project CLI.md (96%) rename docs/specs/{ => completed}/008 - Lifecycle Progress Feedback.md (94%) rename docs/specs/{ => completed}/009 - Read-Only Discovery.md (96%) rename docs/specs/{ => completed}/010 - Marketplace Release.md (97%) rename docs/specs/{ => completed}/011 - Fresh Image Rebuild.md (94%) rename docs/specs/{ => completed}/012 - Create Before Attach.md (94%) rename docs/specs/{ => completed}/013 - Visible And Cancellable Operations.md (98%) diff --git a/.claude/skills/dev-onboard/SKILL.md b/.claude/skills/dev-onboard/SKILL.md index 7273233..d8c2def 100644 --- a/.claude/skills/dev-onboard/SKILL.md +++ b/.claude/skills/dev-onboard/SKILL.md @@ -26,7 +26,8 @@ finish by printing the punchlist of whatever remains for the human. repo without sandboxes. 6. **Where truth lives** (read in this order): CLAUDE.md (rules, module map, git workflow) · `docs/Features.md` (functional truth, FR ids) · `docs/Architecture.md` (technical truth) · - `docs/specs/` (immutable history). Working skills: `spec-new-iteration`, `spec-implement`, + `docs/specs/completed/` (immutable history; `docs/specs/drafts/` holds work in flight). + Working skills: `spec-new-iteration`, `spec-implement`, `ext-run-local`, `dev-review-changes`, `git-commit-push`, `git-open-pr`. ## Exit diff --git a/.claude/skills/dev-review-changes/SKILL.md b/.claude/skills/dev-review-changes/SKILL.md index 6d68ca9..2e13f94 100644 --- a/.claude/skills/dev-review-changes/SKILL.md +++ b/.claude/skills/dev-review-changes/SKILL.md @@ -26,8 +26,9 @@ finding as `file:line - what and why`; no findings is a valid result and is said sandbox exists; no implicit default sandbox appears; terminal-first holds (no chat panels); startup stays quiet and writes nothing into `.sandbox/`. 5. **Docs drift**: if the diff changes behaviour, the same diff updates `docs/Features.md` / - `docs/Architecture.md` and carries its `docs/specs/00N` spec (status flipped to shipped). - FR ids cited in the code match real entries. + `docs/Architecture.md` and carries its `00N` spec with the status flipped to shipped and + the file moved from `docs/specs/drafts/` to `docs/specs/completed/`. FR ids cited in the + code match real entries. 6. **Gate**: `npm run verify` exits 0 on the reviewed tree. ## Escalation diff --git a/.claude/skills/spec-implement/SKILL.md b/.claude/skills/spec-implement/SKILL.md index e1614d2..5dfb857 100644 --- a/.claude/skills/spec-implement/SKILL.md +++ b/.claude/skills/spec-implement/SKILL.md @@ -31,8 +31,10 @@ CLAUDE.md is the rule surface - this skill sequences it, it does not replace it. exists; no implicit default sandbox; terminal-first (no chat panels); secrets only over stdin, never argv/env/image; argv allowlist and path containment stay intact. 6. **Sync the docs in the same change**: update `docs/Features.md` and `docs/Architecture.md` - per the spec's docs-sync checklist, and flip the spec status to shipped. Cite `FR-0xx` in - code comments where the code carries the requirement. + per the spec's docs-sync checklist, flip the spec status to shipped, and `git mv` the spec + from `docs/specs/drafts/` to `docs/specs/completed/` (fix its `../../` doc links if the + move changes their depth). Cite `FR-0xx` in code comments where the code carries the + requirement. 7. **Verify**: `npm run verify` must exit 0. ## Hand-off diff --git a/.claude/skills/spec-new-iteration/SKILL.md b/.claude/skills/spec-new-iteration/SKILL.md index 4dbcecf..7d1b324 100644 --- a/.claude/skills/spec-new-iteration/SKILL.md +++ b/.claude/skills/spec-new-iteration/SKILL.md @@ -13,13 +13,15 @@ canonical-doc updates. This skill only drafts the spec; it never edits `docs/Fea 1. Read CLAUDE.md "Documentation model", then the sections of `docs/Features.md` and `docs/Architecture.md` the work item touches. -2. **Number**: list `docs/specs/` and take the next `00N`. Specs are append-only and immutable - once merged - never renumber or edit an existing one. +2. **Number**: list `docs/specs/drafts/` and `docs/specs/completed/` and take the next `00N` + (numbering is continuous across both). Specs are append-only and immutable once merged - + never renumber or edit an existing one. 3. **FR id**: if the item adds or changes behaviour, find the highest `FR-0xx` in `docs/Features.md` and reserve the next id for the implementation to use. Never renumber existing ids. -4. **Draft** `docs/specs/00N - .md` following the shape of the existing specs - (open `009 - Read-Only Discovery.md` as the reference): +4. **Draft** `docs/specs/drafts/00N - .md` following the shape of the existing + specs (open `docs/specs/completed/009 - Read-Only Discovery.md` as the reference); the + implementing PR moves it to `docs/specs/completed/` when it flips to shipped: - Header blockquote: the "Iteration spec - immutable history" note, then `**Period:** · **Base:** \`main\` after spec 00N-1`, then a status line. Use `**Status: planned.**` while the work is open; the implementing PR flips it to diff --git a/CLAUDE.md b/CLAUDE.md index ce33e13..5fe5fd9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,9 +17,11 @@ Two canonical docs are **always current**; history lives in append-only specs: - `docs/Architecture.md` — the **technical truth** — read it before changing backend behaviour. - `docs/specs/00N - .md` — one numbered spec per substantial change: what - changed and why. Specs are immutable once written. **Workflow for any substantial - change: add the next `00N` spec, then update Features.md/Architecture.md to match in - the same change** — the canonical docs must never drift from shipped code. + changed and why. Specs live in `docs/specs/drafts/` while the work is open + (`Status: planned`) and move to `docs/specs/completed/` once shipped; numbering is + continuous across both folders. Specs are immutable once written. **Workflow for any + substantial change: add the next `00N` spec, then update Features.md/Architecture.md + to match in the same change** — the canonical docs must never drift from shipped code. - Upstream `sbx` behaviour (**authoritative**): Docker Sandboxes docs — . Architecture.md lists the specific `customize/` pages (templates & kits). Verify against these before changing any CLI assumption. @@ -137,7 +139,7 @@ How a work item travels from idea to `main`; each step is a skill above. 1. **Start.** A work item arrives — an issue, an observed defect, an idea. If it is substantial (new FR, behaviour change, architectural shift), `spec-new-iteration` - drafts the next `docs/specs/00N` with `Status: planned` and the docs-sync checklist; + drafts the next `docs/specs/drafts/00N` with `Status: planned` and the docs-sync checklist; the spec's "What & why" / "What changed" ARE the plan, and open questions are settled there before any code. A trivial fix (typo, comment, doc wording) skips the spec. 2. **Implement.** `spec-implement`: work on a `feature/` branch off `main`, code @@ -145,9 +147,10 @@ How a work item travels from idea to `main`; each step is a skill above. checklist in the same change, and end with `npm run verify` exit 0. 3. **Review.** `dev-review-changes` on the diff — module boundaries, CLI containment, security and UX invariants, docs drift. -4. **Finish.** Flip the spec to `Status: shipped with this iteration`; behaviour changes - also get manual acceptance via `ext-run-local` (the steps go into the PR's - "How to Verify"). Then `git-commit-push`. +4. **Finish.** Flip the spec to `Status: shipped with this iteration` and `git mv` it from + `docs/specs/drafts/` to `docs/specs/completed/` in the same change — a shipped spec never + stays in `drafts/`; behaviour changes also get manual acceptance via `ext-run-local` (the + steps go into the PR's "How to Verify"). Then `git-commit-push`. 5. **Merge.** `git-open-pr` opens the PR to `main` with the template filled; CI runs the same `npm run verify`; the maintainer reviews and approves; `git-merge-pr` runs the readiness gates, squash-merges, and cleans up the branches. After merge the spec is diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9356c52..1b56dc9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,9 +35,11 @@ and pull requests targeting `main`. `sbx` CLI assumption against the upstream [Docker Sandboxes docs](https://docs.docker.com/ai/sandboxes/). - Substantial changes follow the documentation model (see `CLAUDE.md`): add the next - `docs/specs/00N - .md` spec describing what/why, and update + `docs/specs/drafts/00N - .md` spec describing what/why, and update `Features.md`/`Architecture.md` to match in the same PR — the canonical docs must - never drift from shipped code. Specs are immutable once merged. + never drift from shipped code. When the change ships, the spec's status flips to + shipped and the file moves to `docs/specs/completed/`; numbering runs continuously + across both folders. Specs are immutable once merged. - Keep `sbx` CLI strings in `src/sbx.ts` (all child-process invocations) and `src/terminal.ts` (the interactive `sbx run`/`exec` shellArgs) — those two modules only. One deliberate carve-out: the bash template in `src/script.ts` diff --git a/README.md b/README.md index 64f2ceb..b3f763c 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ Security policy and vulnerability reporting: - [Features](https://github.com/ainova-systems/code-sandbox-console/blob/main/docs/Features.md) and [Architecture](https://github.com/ainova-systems/code-sandbox-console/blob/main/docs/Architecture.md) -- [Iteration specs](https://github.com/ainova-systems/code-sandbox-console/tree/main/docs/specs) +- [Iteration specs](https://github.com/ainova-systems/code-sandbox-console/tree/main/docs/specs/completed) - [Contributing](https://github.com/ainova-systems/code-sandbox-console/blob/main/CONTRIBUTING.md) — build, debug, and PR conventions - [Issues & support](https://github.com/ainova-systems/code-sandbox-console/issues) diff --git a/docs/Architecture.md b/docs/Architecture.md index 236d0ee..dd6c5b3 100644 --- a/docs/Architecture.md +++ b/docs/Architecture.md @@ -31,7 +31,7 @@ the wrong altitude: it gave only container-level isolation (shared host kernel) forced us to reimplement persistence, network/filesystem policies, agent launching, and credential handling — all of which `sbx` already provides natively, and more strongly (microVM isolation). The raw-Docker backend was removed (see -[specs/001](specs/001%20-%20Walking%20Skeleton.md)). +[specs/001](specs/completed/001%20-%20Walking%20Skeleton.md)). `sbx` (verified `v0.31.3`) gives us, out of the box: diff --git a/docs/specs/001 - Walking Skeleton.md b/docs/specs/completed/001 - Walking Skeleton.md similarity index 92% rename from docs/specs/001 - Walking Skeleton.md rename to docs/specs/completed/001 - Walking Skeleton.md index fcda164..09554a2 100644 --- a/docs/specs/001 - Walking Skeleton.md +++ b/docs/specs/completed/001 - Walking Skeleton.md @@ -1,8 +1,8 @@ # 001 — Walking Skeleton (v0.1) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-08 … 2026-06-09 · > **Commits:** `6a8ce18` (FRD), `3000351`, `e65eb54` diff --git a/docs/specs/002 - Managed Sandbox UI.md b/docs/specs/completed/002 - Managed Sandbox UI.md similarity index 94% rename from docs/specs/002 - Managed Sandbox UI.md rename to docs/specs/completed/002 - Managed Sandbox UI.md index 487ea93..a82ab11 100644 --- a/docs/specs/002 - Managed Sandbox UI.md +++ b/docs/specs/completed/002 - Managed Sandbox UI.md @@ -1,8 +1,8 @@ # 002 — Managed Sandbox UI (v0.2) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-09 · > **Commits:** `f996c19` (POC → managed UI), `c1ffec8` (rebrand, pre-release) diff --git a/docs/specs/003 - Open-Source Readiness.md b/docs/specs/completed/003 - Open-Source Readiness.md similarity index 95% rename from docs/specs/003 - Open-Source Readiness.md rename to docs/specs/completed/003 - Open-Source Readiness.md index baeeab7..858e85c 100644 --- a/docs/specs/003 - Open-Source Readiness.md +++ b/docs/specs/completed/003 - Open-Source Readiness.md @@ -1,8 +1,8 @@ # 003 — Open-Source Readiness > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-09 … 2026-06-10 · **Base:** `c1ffec8` (working tree) diff --git a/docs/specs/004 - Default Sandbox Picker.md b/docs/specs/completed/004 - Default Sandbox Picker.md similarity index 91% rename from docs/specs/004 - Default Sandbox Picker.md rename to docs/specs/completed/004 - Default Sandbox Picker.md index 0e6c3cc..06314c9 100644 --- a/docs/specs/004 - Default Sandbox Picker.md +++ b/docs/specs/completed/004 - Default Sandbox Picker.md @@ -1,8 +1,8 @@ # 004 — Default Sandbox Picker (FR-050) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-10 · **Base:** branch `feature/open-source-readiness` diff --git a/docs/specs/005 - Dockerfile Base And Reuse.md b/docs/specs/completed/005 - Dockerfile Base And Reuse.md similarity index 94% rename from docs/specs/005 - Dockerfile Base And Reuse.md rename to docs/specs/completed/005 - Dockerfile Base And Reuse.md index 70fa336..c250c85 100644 --- a/docs/specs/005 - Dockerfile Base And Reuse.md +++ b/docs/specs/completed/005 - Dockerfile Base And Reuse.md @@ -1,8 +1,8 @@ # 005 — Dockerfile Base & Reuse (FR-008) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-10 · **Base:** `main` after spec 004 diff --git a/docs/specs/006 - Per-Project Secret Cache.md b/docs/specs/completed/006 - Per-Project Secret Cache.md similarity index 95% rename from docs/specs/006 - Per-Project Secret Cache.md rename to docs/specs/completed/006 - Per-Project Secret Cache.md index 9a87c9c..f0fd797 100644 --- a/docs/specs/006 - Per-Project Secret Cache.md +++ b/docs/specs/completed/006 - Per-Project Secret Cache.md @@ -1,8 +1,8 @@ # 006 — Per-Project Secret Cache (FR-051) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-10 · **Base:** `main` after spec 005 > diff --git a/docs/specs/007 - Generated Project CLI.md b/docs/specs/completed/007 - Generated Project CLI.md similarity index 96% rename from docs/specs/007 - Generated Project CLI.md rename to docs/specs/completed/007 - Generated Project CLI.md index 77fc629..427a6a4 100644 --- a/docs/specs/007 - Generated Project CLI.md +++ b/docs/specs/completed/007 - Generated Project CLI.md @@ -1,8 +1,8 @@ # 007 — Generated Project CLI (FR-052) > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-10 · **Base:** `main` after spec 005 · designed alongside spec 006 > diff --git a/docs/specs/008 - Lifecycle Progress Feedback.md b/docs/specs/completed/008 - Lifecycle Progress Feedback.md similarity index 94% rename from docs/specs/008 - Lifecycle Progress Feedback.md rename to docs/specs/completed/008 - Lifecycle Progress Feedback.md index ffa9115..5f7dd09 100644 --- a/docs/specs/008 - Lifecycle Progress Feedback.md +++ b/docs/specs/completed/008 - Lifecycle Progress Feedback.md @@ -1,8 +1,8 @@ # 008 — Lifecycle Progress Feedback > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-11 · **Base:** `main` after spec 007 > diff --git a/docs/specs/009 - Read-Only Discovery.md b/docs/specs/completed/009 - Read-Only Discovery.md similarity index 96% rename from docs/specs/009 - Read-Only Discovery.md rename to docs/specs/completed/009 - Read-Only Discovery.md index 8599567..e07e3ef 100644 --- a/docs/specs/009 - Read-Only Discovery.md +++ b/docs/specs/completed/009 - Read-Only Discovery.md @@ -1,8 +1,8 @@ # 009 — Read-Only Discovery > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-06-12 · **Base:** `main` after spec 008 > diff --git a/docs/specs/010 - Marketplace Release.md b/docs/specs/completed/010 - Marketplace Release.md similarity index 97% rename from docs/specs/010 - Marketplace Release.md rename to docs/specs/completed/010 - Marketplace Release.md index 6189cc6..3d76ba3 100644 --- a/docs/specs/010 - Marketplace Release.md +++ b/docs/specs/completed/010 - Marketplace Release.md @@ -1,8 +1,8 @@ # 010 — Marketplace Release > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-07-28 · **Base:** `main` after spec 009 > diff --git a/docs/specs/011 - Fresh Image Rebuild.md b/docs/specs/completed/011 - Fresh Image Rebuild.md similarity index 94% rename from docs/specs/011 - Fresh Image Rebuild.md rename to docs/specs/completed/011 - Fresh Image Rebuild.md index 592a48c..7ff15f1 100644 --- a/docs/specs/011 - Fresh Image Rebuild.md +++ b/docs/specs/completed/011 - Fresh Image Rebuild.md @@ -1,8 +1,8 @@ # 011 — Fresh Image Rebuild > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-07-28 · **Base:** `main` after spec 010 > diff --git a/docs/specs/012 - Create Before Attach.md b/docs/specs/completed/012 - Create Before Attach.md similarity index 94% rename from docs/specs/012 - Create Before Attach.md rename to docs/specs/completed/012 - Create Before Attach.md index 3aa4a60..48bfd87 100644 --- a/docs/specs/012 - Create Before Attach.md +++ b/docs/specs/completed/012 - Create Before Attach.md @@ -1,8 +1,8 @@ # 012 — Create Before Attach > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-07-28 · **Base:** `main` after spec 011 > diff --git a/docs/specs/013 - Visible And Cancellable Operations.md b/docs/specs/completed/013 - Visible And Cancellable Operations.md similarity index 98% rename from docs/specs/013 - Visible And Cancellable Operations.md rename to docs/specs/completed/013 - Visible And Cancellable Operations.md index 4dfb80b..048d38e 100644 --- a/docs/specs/013 - Visible And Cancellable Operations.md +++ b/docs/specs/completed/013 - Visible And Cancellable Operations.md @@ -1,8 +1,8 @@ # 013 — Visible And Cancellable Operations > **Iteration spec — immutable history.** Describes what changed in this iteration and -> why. The current truth lives in [`../Architecture.md`](../Architecture.md) and -> [`../Features.md`](../Features.md); where this spec disagrees with them, they win. +> why. The current truth lives in [`../../Architecture.md`](../../Architecture.md) and +> [`../../Features.md`](../../Features.md); where this spec disagrees with them, they win. > > **Period:** 2026-07-29 · **Base:** `main` after spec 012 >