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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .claude/skills/dev-onboard/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions .claude/skills/dev-review-changes/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions .claude/skills/spec-implement/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 6 additions & 4 deletions .claude/skills/spec-new-iteration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 - <Short Title>.md` following the shape of the existing specs
(open `009 - Read-Only Discovery.md` as the reference):
4. **Draft** `docs/specs/drafts/00N - <Short Title>.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:** <today> · **Base:** \`main\` after spec 00N-1`, then a status line.
Use `**Status: planned.**` while the work is open; the implementing PR flips it to
Expand Down
17 changes: 10 additions & 7 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 - <Iteration>.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 —
<https://docs.docker.com/ai/sandboxes/>. Architecture.md lists the specific
`customize/` pages (templates & kits). Verify against these before changing any CLI assumption.
Expand Down Expand Up @@ -137,17 +139,18 @@ 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/<slug>` branch off `main`, code
per the module map, cite FR ids, update `Features.md`/`Architecture.md` per the
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
Expand Down
6 changes: 4 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 - <Iteration>.md` spec describing what/why, and update
`docs/specs/drafts/00N - <Iteration>.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`
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion docs/Architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
Original file line number Diff line number Diff line change
@@ -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`
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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)

Expand Down
Original file line number Diff line number Diff line change
@@ -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`

Expand Down
Original file line number Diff line number Diff line change
@@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
>
Expand Down