diff --git a/.claude/skills/spec-sync/SKILL.md b/.claude/skills/spec-sync/SKILL.md index 4832c7b3..348e2fdf 100644 --- a/.claude/skills/spec-sync/SKILL.md +++ b/.claude/skills/spec-sync/SKILL.md @@ -1,39 +1,64 @@ --- name: spec-sync -description: Keep markdown module specs in specs// synchronized with source code using spec-sync. Use this whenever creating, editing, or reviewing code in a module that has (or should have) a spec, or whenever the user mentions specs, spec-sync, companion files (tasks.md/requirements.md/context.md/testing.md/design.md), or asks to add/update a module's documentation. +description: Keep markdown module specs in specs// synchronized with source code using specsync check (the product). Use this whenever creating, editing, or reviewing a spec or its source, or when the user mentions spec-sync, SDD, change adopt, companion files, or the 6.0 change lifecycle (approve, check --commit, review, ship). --- # Spec-Sync Workflow This project uses [spec-sync](https://github.com/CorvidLabs/spec-sync) for bidirectional spec-to-code validation. Specs live in `specs//.spec.md`. -## Companion files +`specsync check` is the product. Bidirectional spec-to-code validation does not require an +active change. SDD (`specsync change`) is opt-in: `specsync init` writes it off; +`specsync change adopt` turns it on. -## Verified SDD change lifecycle (5.0) +## Verified change lifecycle (6.0) -For every meaningful source, test, public documentation, schema, or configuration change: +Happy path verbs: `change new` -> `answer` -> `approve --actor` -> implement -> +`check --commit` -> `review --reviewer` -> `ship`/`finalize`. `start` / `verify` / +`accept` / `archive` are v1 recovery, not the happy path. Change ids are slugs, not +`CHG-NNNN`. + +When SDD is adopted and the work is a meaningful source, test, public documentation, +schema, or configuration change: 1. Run `specsync change new "" --json` and conduct the returned interview with the user. 2. Use `specsync change answer "" --json` until no questions remain. 3. Complete the adaptively selected artifacts and semantic deltas. Requirements use stable `REQ--` IDs, a normative SHALL statement, and acceptance criteria. -4. Ask the user for the definition approval, then run `specsync change approve `. -5. Run `specsync change start ` before editing implementation code. -6. Keep tasks and artifacts current, then run `specsync change verify `. -7. Present verification evidence and ask for closing approval. Only after explicit approval, - run `specsync change accept `; archive separately with `specsync change archive `. - -Never invent or self-grant either human approval. If an approved definition changes, its digest -becomes stale and must be approved again. `specsync check` validates canonical specs plus approved -active deltas, requirement-to-test evidence, change coverage, and CI gates. +4. Ask the user for the single scope approval, then run `specsync change approve --actor ""`. +5. Implement code, canonical specs, and tests on the same branch. Run `specsync change check [] --commit` + for **scoped** verification of this change only (materialize deltas + spec↔code sync). Do **not** + treat check as a full archive integrity walk. Use `specsync change audit` when you need project + health over **active** workspaces and living specs. Archives are history. +6. Complete ordinary pull-request review. For agent-authored work, have a human inspect the + change package, implementation diff, canonical spec delta, and targeted evidence once, then + record it with `specsync change review --reviewer ""`. The reviewer MAY be the + same person who approved the definition. Do not invent a second identity for solo work. +7. Run `specsync change ship ` (or `finalize`) for the same-PR archive tip. Do not commit + between review and ship. Merge on GitHub. SpecSync does not merge the pull request. + +## Lifecycle verbs + +- `specsync check` - validate all specs against source. Default daily path. No change required. +- `specsync change check [id]` - verify **this** change (materialize + spec↔code sync). Add `--commit` for ship-ready product-tip evidence. +- `specsync change audit` - project health over **active** workspaces and living specs. Not archive history. +- Archives are history; do not re-validate terminal evidence for every archived change on each check. +- Slash commands after `specsync agents install`: Claude and Gemini use `/specsync:create-spec`, `/specsync:create-change`, `/specsync:check`, `/specsync:audit`. Cursor uses the flat names `/specsync-create-spec`, `/specsync-create-change`, `/specsync-check`, `/specsync-audit`. + +Never invent or self-grant the scope approval. If an approved definition +changes, its digest becomes stale and must be approved again. `specsync change status` always +prints one explicit next action and one `Handoff:` line. Clear context (or hand the change to a +fresh session) only when `Handoff:` says `safe`; otherwise do what `Before clearing:` names first. +Resume with `specsync change status `. Historical repair commands remain available for older +evidence, but new changes use this single workflow. Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: -- **`tasks.md`** — Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. -- **`requirements.md`** — Acceptance criteria and user stories. These are permanent invariants, not tasks — do not check them off. Update if requirements change. -- **`context.md`** — Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. -- **`testing.md`** — Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. -- **`design.md`** *(opt-in)* — Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. +- **`tasks.md`** - Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. +- **`requirements.md`** - Acceptance criteria and user stories. These are permanent invariants, not tasks: do not check them off. Update if requirements change. +- **`context.md`** - Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. When `.3md` exists beside the spec, that file is the lesson source: the first plane is context and later planes are lessons. Record a new lesson on a later plane. `context.md` stays, and briefings do not read it while the 3md file parses. +- **`testing.md`** - Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. +- **`design.md`** *(opt-in)* - Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. ## Before modifying any module @@ -43,33 +68,54 @@ Each canonical spec may have policy-selected companion files. Read and update th ## After completing work -1. Mark completed items in `tasks.md` — check off finished tasks, add new ones discovered -2. Update `context.md` — record decisions made, update current status +1. Mark completed items in `tasks.md`: check off finished tasks, add new ones discovered +2. If `.3md` exists beside the spec, record the lesson on a later plane of that file. Otherwise update `context.md`: record decisions made, update current status 3. If requirements changed, update `requirements.md` acceptance criteria 4. If test coverage changed, update `testing.md` with new test files or edge cases 5. If UI/layout changed, update `design.md` with revised layout, components, or tokens ## Before creating a PR -Run `specsync check --strict` — all specs must pass with zero warnings. +Run `specsync check --strict`: all specs must pass with zero warnings. If SDD is adopted, push +the product tip from `change check --commit` with the PR. Record `change review` and +`change ship`/`finalize` only after that tip is on the PR and required checks have run. Do not +record review or ship before the PR exists. ## When adding new modules Run `specsync scaffold ` to create a spec, companion files, a registry -entry, and auto-detected source files — or `specsync new ` for a +entry, and auto-detected source files, or `specsync new ` for a minimal spec-only draft. Complete the spec before writing code. The `/specsync:create-spec` command (or tool-equivalent) runs this for you, and accepts either a bare module name or a natural-language feature description (e.g. `/specsync:create-spec "I want a feature that lets users export their -data as CSV"`) — pass a description and it will pick a module name and use +data as CSV"`): pass a description and it will pick a module name and use the description to draft the spec's Purpose and Requirements. ## Key commands -- `specsync check` — validate all specs against source code -- `specsync check --json` — machine-readable validation output -- `specsync coverage` — show which modules lack specs -- `specsync score` — quality score for each spec (0-100) -- `specsync scaffold ` — full scaffold: spec + companions + registry entry + source detection -- `specsync new ` — quick-create a minimal spec (add `--full` for companions) -- `specsync resolve --remote` — verify cross-project dependencies +- `specsync check` - validate all specs against source code +- `specsync check --json` - machine-readable validation output +- `specsync change adopt` - turn on the opt-in verified change workflow +- `specsync change new ""` / `change answer` - open a change and finish the interview +- `specsync change approve --actor ""` - record the single scope approval +- `specsync change check [id]` - scoped verification for one SDD change (`--commit` for ship evidence) +- `specsync change review --reviewer ""` - record scoped implementation review +- `specsync change ship ` / `change finalize` - same-PR archive tip; do not commit between review and ship +- `specsync change status [id]` - one next action and a `Handoff:` line +- `specsync change audit` - active workspaces + living specs (not archive history) +- `specsync coverage` - show which modules lack specs +- `specsync score` - quality score for each spec (0-100) +- `specsync scaffold ` - full scaffold: spec + companions + registry entry + source detection +- `specsync new ` - quick-create a minimal spec (add `--full` for companions) +- `specsync resolve --remote` - verify cross-project dependencies + +## Repository delivery policy (SpecSync 6.1.1) + +This repository requires SDD for meaningful work, including Godot and Sculpt. Use the exact +6.1.1 writer. Definition approval is separate from actual human implementation review. +Keep canonical validation, product tests, scoped verification and global strict active audit +separate. Run the lifecycle guard before readiness; inherited debt is not exempt. Read prior +lessons, record the observed problem, smallest correction, evidence and applicability limits. +Finalize/archive on the same PR only after genuine current review. Preserve stronger Trust, +provenance, signer and reviewer policies. Never invent approvals or repair unrelated history. diff --git a/.codex/skills/spec-sync/SKILL.md b/.codex/skills/spec-sync/SKILL.md index e597cd04..348e2fdf 100644 --- a/.codex/skills/spec-sync/SKILL.md +++ b/.codex/skills/spec-sync/SKILL.md @@ -1,39 +1,64 @@ --- name: spec-sync -description: Keep markdown module specs in specs// synchronized with source code using spec-sync. Use this whenever creating, editing, or reviewing code in a module that has (or should have) a spec, or whenever the user mentions specs, spec-sync, companion files (tasks.md/requirements.md/context.md/testing.md/design.md), or asks to add/update a module's documentation. +description: Keep markdown module specs in specs// synchronized with source code using specsync check (the product). Use this whenever creating, editing, or reviewing a spec or its source, or when the user mentions spec-sync, SDD, change adopt, companion files, or the 6.0 change lifecycle (approve, check --commit, review, ship). --- # Spec-Sync Workflow This project uses [spec-sync](https://github.com/CorvidLabs/spec-sync) for bidirectional spec-to-code validation. Specs live in `specs//.spec.md`. -## Companion files +`specsync check` is the product. Bidirectional spec-to-code validation does not require an +active change. SDD (`specsync change`) is opt-in: `specsync init` writes it off; +`specsync change adopt` turns it on. -Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: - -- **`tasks.md`** — Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. -- **`requirements.md`** — Acceptance criteria and user stories. These are permanent invariants, not tasks — do not check them off. Update if requirements change. -- **`context.md`** — Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. -- **`testing.md`** — Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. -- **`design.md`** *(opt-in)* — Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. +## Verified change lifecycle (6.0) -## Verified SDD change lifecycle (5.0) +Happy path verbs: `change new` -> `answer` -> `approve --actor` -> implement -> +`check --commit` -> `review --reviewer` -> `ship`/`finalize`. `start` / `verify` / +`accept` / `archive` are v1 recovery, not the happy path. Change ids are slugs, not +`CHG-NNNN`. -For every meaningful source, test, public documentation, schema, or configuration change: +When SDD is adopted and the work is a meaningful source, test, public documentation, +schema, or configuration change: 1. Run `specsync change new "" --json` and conduct the returned interview with the user. 2. Use `specsync change answer "" --json` until no questions remain. 3. Complete the adaptively selected artifacts and semantic deltas. Requirements use stable `REQ--` IDs, a normative SHALL statement, and acceptance criteria. -4. Ask the user for the definition approval, then run `specsync change approve `. -5. Run `specsync change start ` before editing implementation code. -6. Keep tasks and artifacts current, then run `specsync change verify `. -7. Present verification evidence and ask for closing approval. Only after explicit approval, - run `specsync change accept `; archive separately with `specsync change archive `. +4. Ask the user for the single scope approval, then run `specsync change approve --actor ""`. +5. Implement code, canonical specs, and tests on the same branch. Run `specsync change check [] --commit` + for **scoped** verification of this change only (materialize deltas + spec↔code sync). Do **not** + treat check as a full archive integrity walk. Use `specsync change audit` when you need project + health over **active** workspaces and living specs. Archives are history. +6. Complete ordinary pull-request review. For agent-authored work, have a human inspect the + change package, implementation diff, canonical spec delta, and targeted evidence once, then + record it with `specsync change review --reviewer ""`. The reviewer MAY be the + same person who approved the definition. Do not invent a second identity for solo work. +7. Run `specsync change ship ` (or `finalize`) for the same-PR archive tip. Do not commit + between review and ship. Merge on GitHub. SpecSync does not merge the pull request. + +## Lifecycle verbs + +- `specsync check` - validate all specs against source. Default daily path. No change required. +- `specsync change check [id]` - verify **this** change (materialize + spec↔code sync). Add `--commit` for ship-ready product-tip evidence. +- `specsync change audit` - project health over **active** workspaces and living specs. Not archive history. +- Archives are history; do not re-validate terminal evidence for every archived change on each check. +- Slash commands after `specsync agents install`: Claude and Gemini use `/specsync:create-spec`, `/specsync:create-change`, `/specsync:check`, `/specsync:audit`. Cursor uses the flat names `/specsync-create-spec`, `/specsync-create-change`, `/specsync-check`, `/specsync-audit`. + +Never invent or self-grant the scope approval. If an approved definition +changes, its digest becomes stale and must be approved again. `specsync change status` always +prints one explicit next action and one `Handoff:` line. Clear context (or hand the change to a +fresh session) only when `Handoff:` says `safe`; otherwise do what `Before clearing:` names first. +Resume with `specsync change status `. Historical repair commands remain available for older +evidence, but new changes use this single workflow. + +Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: -Never invent or self-grant either human approval. If an approved definition changes, its digest -becomes stale and must be approved again. `specsync check` validates canonical specs plus approved -active deltas, requirement-to-test evidence, change coverage, and CI gates. +- **`tasks.md`** - Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. +- **`requirements.md`** - Acceptance criteria and user stories. These are permanent invariants, not tasks: do not check them off. Update if requirements change. +- **`context.md`** - Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. When `.3md` exists beside the spec, that file is the lesson source: the first plane is context and later planes are lessons. Record a new lesson on a later plane. `context.md` stays, and briefings do not read it while the 3md file parses. +- **`testing.md`** - Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. +- **`design.md`** *(opt-in)* - Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. ## Before modifying any module @@ -43,33 +68,54 @@ active deltas, requirement-to-test evidence, change coverage, and CI gates. ## After completing work -1. Mark completed items in `tasks.md` — check off finished tasks, add new ones discovered -2. Update `context.md` — record decisions made, update current status +1. Mark completed items in `tasks.md`: check off finished tasks, add new ones discovered +2. If `.3md` exists beside the spec, record the lesson on a later plane of that file. Otherwise update `context.md`: record decisions made, update current status 3. If requirements changed, update `requirements.md` acceptance criteria 4. If test coverage changed, update `testing.md` with new test files or edge cases 5. If UI/layout changed, update `design.md` with revised layout, components, or tokens ## Before creating a PR -Run `specsync check --strict` — all specs must pass with zero warnings. +Run `specsync check --strict`: all specs must pass with zero warnings. If SDD is adopted, push +the product tip from `change check --commit` with the PR. Record `change review` and +`change ship`/`finalize` only after that tip is on the PR and required checks have run. Do not +record review or ship before the PR exists. ## When adding new modules Run `specsync scaffold ` to create a spec, companion files, a registry -entry, and auto-detected source files — or `specsync new ` for a +entry, and auto-detected source files, or `specsync new ` for a minimal spec-only draft. Complete the spec before writing code. The `/specsync:create-spec` command (or tool-equivalent) runs this for you, and accepts either a bare module name or a natural-language feature description (e.g. `/specsync:create-spec "I want a feature that lets users export their -data as CSV"`) — pass a description and it will pick a module name and use +data as CSV"`): pass a description and it will pick a module name and use the description to draft the spec's Purpose and Requirements. ## Key commands -- `specsync check` — validate all specs against source code -- `specsync check --json` — machine-readable validation output -- `specsync coverage` — show which modules lack specs -- `specsync score` — quality score for each spec (0-100) -- `specsync scaffold ` — full scaffold: spec + companions + registry entry + source detection -- `specsync new ` — quick-create a minimal spec (add `--full` for companions) -- `specsync resolve --remote` — verify cross-project dependencies +- `specsync check` - validate all specs against source code +- `specsync check --json` - machine-readable validation output +- `specsync change adopt` - turn on the opt-in verified change workflow +- `specsync change new ""` / `change answer` - open a change and finish the interview +- `specsync change approve --actor ""` - record the single scope approval +- `specsync change check [id]` - scoped verification for one SDD change (`--commit` for ship evidence) +- `specsync change review --reviewer ""` - record scoped implementation review +- `specsync change ship ` / `change finalize` - same-PR archive tip; do not commit between review and ship +- `specsync change status [id]` - one next action and a `Handoff:` line +- `specsync change audit` - active workspaces + living specs (not archive history) +- `specsync coverage` - show which modules lack specs +- `specsync score` - quality score for each spec (0-100) +- `specsync scaffold ` - full scaffold: spec + companions + registry entry + source detection +- `specsync new ` - quick-create a minimal spec (add `--full` for companions) +- `specsync resolve --remote` - verify cross-project dependencies + +## Repository delivery policy (SpecSync 6.1.1) + +This repository requires SDD for meaningful work, including Godot and Sculpt. Use the exact +6.1.1 writer. Definition approval is separate from actual human implementation review. +Keep canonical validation, product tests, scoped verification and global strict active audit +separate. Run the lifecycle guard before readiness; inherited debt is not exempt. Read prior +lessons, record the observed problem, smallest correction, evidence and applicability limits. +Finalize/archive on the same PR only after genuine current review. Preserve stronger Trust, +provenance, signer and reviewer policies. Never invent approvals or repair unrelated history. diff --git a/.cursor/skills/spec-sync/SKILL.md b/.cursor/skills/spec-sync/SKILL.md index e597cd04..348e2fdf 100644 --- a/.cursor/skills/spec-sync/SKILL.md +++ b/.cursor/skills/spec-sync/SKILL.md @@ -1,39 +1,64 @@ --- name: spec-sync -description: Keep markdown module specs in specs// synchronized with source code using spec-sync. Use this whenever creating, editing, or reviewing code in a module that has (or should have) a spec, or whenever the user mentions specs, spec-sync, companion files (tasks.md/requirements.md/context.md/testing.md/design.md), or asks to add/update a module's documentation. +description: Keep markdown module specs in specs// synchronized with source code using specsync check (the product). Use this whenever creating, editing, or reviewing a spec or its source, or when the user mentions spec-sync, SDD, change adopt, companion files, or the 6.0 change lifecycle (approve, check --commit, review, ship). --- # Spec-Sync Workflow This project uses [spec-sync](https://github.com/CorvidLabs/spec-sync) for bidirectional spec-to-code validation. Specs live in `specs//.spec.md`. -## Companion files +`specsync check` is the product. Bidirectional spec-to-code validation does not require an +active change. SDD (`specsync change`) is opt-in: `specsync init` writes it off; +`specsync change adopt` turns it on. -Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: - -- **`tasks.md`** — Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. -- **`requirements.md`** — Acceptance criteria and user stories. These are permanent invariants, not tasks — do not check them off. Update if requirements change. -- **`context.md`** — Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. -- **`testing.md`** — Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. -- **`design.md`** *(opt-in)* — Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. +## Verified change lifecycle (6.0) -## Verified SDD change lifecycle (5.0) +Happy path verbs: `change new` -> `answer` -> `approve --actor` -> implement -> +`check --commit` -> `review --reviewer` -> `ship`/`finalize`. `start` / `verify` / +`accept` / `archive` are v1 recovery, not the happy path. Change ids are slugs, not +`CHG-NNNN`. -For every meaningful source, test, public documentation, schema, or configuration change: +When SDD is adopted and the work is a meaningful source, test, public documentation, +schema, or configuration change: 1. Run `specsync change new "" --json` and conduct the returned interview with the user. 2. Use `specsync change answer "" --json` until no questions remain. 3. Complete the adaptively selected artifacts and semantic deltas. Requirements use stable `REQ--` IDs, a normative SHALL statement, and acceptance criteria. -4. Ask the user for the definition approval, then run `specsync change approve `. -5. Run `specsync change start ` before editing implementation code. -6. Keep tasks and artifacts current, then run `specsync change verify `. -7. Present verification evidence and ask for closing approval. Only after explicit approval, - run `specsync change accept `; archive separately with `specsync change archive `. +4. Ask the user for the single scope approval, then run `specsync change approve --actor ""`. +5. Implement code, canonical specs, and tests on the same branch. Run `specsync change check [] --commit` + for **scoped** verification of this change only (materialize deltas + spec↔code sync). Do **not** + treat check as a full archive integrity walk. Use `specsync change audit` when you need project + health over **active** workspaces and living specs. Archives are history. +6. Complete ordinary pull-request review. For agent-authored work, have a human inspect the + change package, implementation diff, canonical spec delta, and targeted evidence once, then + record it with `specsync change review --reviewer ""`. The reviewer MAY be the + same person who approved the definition. Do not invent a second identity for solo work. +7. Run `specsync change ship ` (or `finalize`) for the same-PR archive tip. Do not commit + between review and ship. Merge on GitHub. SpecSync does not merge the pull request. + +## Lifecycle verbs + +- `specsync check` - validate all specs against source. Default daily path. No change required. +- `specsync change check [id]` - verify **this** change (materialize + spec↔code sync). Add `--commit` for ship-ready product-tip evidence. +- `specsync change audit` - project health over **active** workspaces and living specs. Not archive history. +- Archives are history; do not re-validate terminal evidence for every archived change on each check. +- Slash commands after `specsync agents install`: Claude and Gemini use `/specsync:create-spec`, `/specsync:create-change`, `/specsync:check`, `/specsync:audit`. Cursor uses the flat names `/specsync-create-spec`, `/specsync-create-change`, `/specsync-check`, `/specsync-audit`. + +Never invent or self-grant the scope approval. If an approved definition +changes, its digest becomes stale and must be approved again. `specsync change status` always +prints one explicit next action and one `Handoff:` line. Clear context (or hand the change to a +fresh session) only when `Handoff:` says `safe`; otherwise do what `Before clearing:` names first. +Resume with `specsync change status `. Historical repair commands remain available for older +evidence, but new changes use this single workflow. + +Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: -Never invent or self-grant either human approval. If an approved definition changes, its digest -becomes stale and must be approved again. `specsync check` validates canonical specs plus approved -active deltas, requirement-to-test evidence, change coverage, and CI gates. +- **`tasks.md`** - Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. +- **`requirements.md`** - Acceptance criteria and user stories. These are permanent invariants, not tasks: do not check them off. Update if requirements change. +- **`context.md`** - Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. When `.3md` exists beside the spec, that file is the lesson source: the first plane is context and later planes are lessons. Record a new lesson on a later plane. `context.md` stays, and briefings do not read it while the 3md file parses. +- **`testing.md`** - Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. +- **`design.md`** *(opt-in)* - Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. ## Before modifying any module @@ -43,33 +68,54 @@ active deltas, requirement-to-test evidence, change coverage, and CI gates. ## After completing work -1. Mark completed items in `tasks.md` — check off finished tasks, add new ones discovered -2. Update `context.md` — record decisions made, update current status +1. Mark completed items in `tasks.md`: check off finished tasks, add new ones discovered +2. If `.3md` exists beside the spec, record the lesson on a later plane of that file. Otherwise update `context.md`: record decisions made, update current status 3. If requirements changed, update `requirements.md` acceptance criteria 4. If test coverage changed, update `testing.md` with new test files or edge cases 5. If UI/layout changed, update `design.md` with revised layout, components, or tokens ## Before creating a PR -Run `specsync check --strict` — all specs must pass with zero warnings. +Run `specsync check --strict`: all specs must pass with zero warnings. If SDD is adopted, push +the product tip from `change check --commit` with the PR. Record `change review` and +`change ship`/`finalize` only after that tip is on the PR and required checks have run. Do not +record review or ship before the PR exists. ## When adding new modules Run `specsync scaffold ` to create a spec, companion files, a registry -entry, and auto-detected source files — or `specsync new ` for a +entry, and auto-detected source files, or `specsync new ` for a minimal spec-only draft. Complete the spec before writing code. The `/specsync:create-spec` command (or tool-equivalent) runs this for you, and accepts either a bare module name or a natural-language feature description (e.g. `/specsync:create-spec "I want a feature that lets users export their -data as CSV"`) — pass a description and it will pick a module name and use +data as CSV"`): pass a description and it will pick a module name and use the description to draft the spec's Purpose and Requirements. ## Key commands -- `specsync check` — validate all specs against source code -- `specsync check --json` — machine-readable validation output -- `specsync coverage` — show which modules lack specs -- `specsync score` — quality score for each spec (0-100) -- `specsync scaffold ` — full scaffold: spec + companions + registry entry + source detection -- `specsync new ` — quick-create a minimal spec (add `--full` for companions) -- `specsync resolve --remote` — verify cross-project dependencies +- `specsync check` - validate all specs against source code +- `specsync check --json` - machine-readable validation output +- `specsync change adopt` - turn on the opt-in verified change workflow +- `specsync change new ""` / `change answer` - open a change and finish the interview +- `specsync change approve --actor ""` - record the single scope approval +- `specsync change check [id]` - scoped verification for one SDD change (`--commit` for ship evidence) +- `specsync change review --reviewer ""` - record scoped implementation review +- `specsync change ship ` / `change finalize` - same-PR archive tip; do not commit between review and ship +- `specsync change status [id]` - one next action and a `Handoff:` line +- `specsync change audit` - active workspaces + living specs (not archive history) +- `specsync coverage` - show which modules lack specs +- `specsync score` - quality score for each spec (0-100) +- `specsync scaffold ` - full scaffold: spec + companions + registry entry + source detection +- `specsync new ` - quick-create a minimal spec (add `--full` for companions) +- `specsync resolve --remote` - verify cross-project dependencies + +## Repository delivery policy (SpecSync 6.1.1) + +This repository requires SDD for meaningful work, including Godot and Sculpt. Use the exact +6.1.1 writer. Definition approval is separate from actual human implementation review. +Keep canonical validation, product tests, scoped verification and global strict active audit +separate. Run the lifecycle guard before readiness; inherited debt is not exempt. Read prior +lessons, record the observed problem, smallest correction, evidence and applicability limits. +Finalize/archive on the same PR only after genuine current review. Preserve stronger Trust, +provenance, signer and reviewer policies. Never invent approvals or repair unrelated history. diff --git a/.gemini/skills/spec-sync/SKILL.md b/.gemini/skills/spec-sync/SKILL.md index 4832c7b3..348e2fdf 100644 --- a/.gemini/skills/spec-sync/SKILL.md +++ b/.gemini/skills/spec-sync/SKILL.md @@ -1,39 +1,64 @@ --- name: spec-sync -description: Keep markdown module specs in specs// synchronized with source code using spec-sync. Use this whenever creating, editing, or reviewing code in a module that has (or should have) a spec, or whenever the user mentions specs, spec-sync, companion files (tasks.md/requirements.md/context.md/testing.md/design.md), or asks to add/update a module's documentation. +description: Keep markdown module specs in specs// synchronized with source code using specsync check (the product). Use this whenever creating, editing, or reviewing a spec or its source, or when the user mentions spec-sync, SDD, change adopt, companion files, or the 6.0 change lifecycle (approve, check --commit, review, ship). --- # Spec-Sync Workflow This project uses [spec-sync](https://github.com/CorvidLabs/spec-sync) for bidirectional spec-to-code validation. Specs live in `specs//.spec.md`. -## Companion files +`specsync check` is the product. Bidirectional spec-to-code validation does not require an +active change. SDD (`specsync change`) is opt-in: `specsync init` writes it off; +`specsync change adopt` turns it on. -## Verified SDD change lifecycle (5.0) +## Verified change lifecycle (6.0) -For every meaningful source, test, public documentation, schema, or configuration change: +Happy path verbs: `change new` -> `answer` -> `approve --actor` -> implement -> +`check --commit` -> `review --reviewer` -> `ship`/`finalize`. `start` / `verify` / +`accept` / `archive` are v1 recovery, not the happy path. Change ids are slugs, not +`CHG-NNNN`. + +When SDD is adopted and the work is a meaningful source, test, public documentation, +schema, or configuration change: 1. Run `specsync change new "" --json` and conduct the returned interview with the user. 2. Use `specsync change answer "" --json` until no questions remain. 3. Complete the adaptively selected artifacts and semantic deltas. Requirements use stable `REQ--` IDs, a normative SHALL statement, and acceptance criteria. -4. Ask the user for the definition approval, then run `specsync change approve `. -5. Run `specsync change start ` before editing implementation code. -6. Keep tasks and artifacts current, then run `specsync change verify `. -7. Present verification evidence and ask for closing approval. Only after explicit approval, - run `specsync change accept `; archive separately with `specsync change archive `. - -Never invent or self-grant either human approval. If an approved definition changes, its digest -becomes stale and must be approved again. `specsync check` validates canonical specs plus approved -active deltas, requirement-to-test evidence, change coverage, and CI gates. +4. Ask the user for the single scope approval, then run `specsync change approve --actor ""`. +5. Implement code, canonical specs, and tests on the same branch. Run `specsync change check [] --commit` + for **scoped** verification of this change only (materialize deltas + spec↔code sync). Do **not** + treat check as a full archive integrity walk. Use `specsync change audit` when you need project + health over **active** workspaces and living specs. Archives are history. +6. Complete ordinary pull-request review. For agent-authored work, have a human inspect the + change package, implementation diff, canonical spec delta, and targeted evidence once, then + record it with `specsync change review --reviewer ""`. The reviewer MAY be the + same person who approved the definition. Do not invent a second identity for solo work. +7. Run `specsync change ship ` (or `finalize`) for the same-PR archive tip. Do not commit + between review and ship. Merge on GitHub. SpecSync does not merge the pull request. + +## Lifecycle verbs + +- `specsync check` - validate all specs against source. Default daily path. No change required. +- `specsync change check [id]` - verify **this** change (materialize + spec↔code sync). Add `--commit` for ship-ready product-tip evidence. +- `specsync change audit` - project health over **active** workspaces and living specs. Not archive history. +- Archives are history; do not re-validate terminal evidence for every archived change on each check. +- Slash commands after `specsync agents install`: Claude and Gemini use `/specsync:create-spec`, `/specsync:create-change`, `/specsync:check`, `/specsync:audit`. Cursor uses the flat names `/specsync-create-spec`, `/specsync-create-change`, `/specsync-check`, `/specsync-audit`. + +Never invent or self-grant the scope approval. If an approved definition +changes, its digest becomes stale and must be approved again. `specsync change status` always +prints one explicit next action and one `Handoff:` line. Clear context (or hand the change to a +fresh session) only when `Handoff:` says `safe`; otherwise do what `Before clearing:` names first. +Resume with `specsync change status `. Historical repair commands remain available for older +evidence, but new changes use this single workflow. Each canonical spec may have policy-selected companion files. Read and update the ones present; do not create empty companions only for ceremony: -- **`tasks.md`** — Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. -- **`requirements.md`** — Acceptance criteria and user stories. These are permanent invariants, not tasks — do not check them off. Update if requirements change. -- **`context.md`** — Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. -- **`testing.md`** — Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. -- **`design.md`** *(opt-in)* — Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. +- **`tasks.md`** - Work items for this module. Check off tasks (`- [x]`) as you complete them. Add new tasks if you discover work needed. +- **`requirements.md`** - Acceptance criteria and user stories. These are permanent invariants, not tasks: do not check them off. Update if requirements change. +- **`context.md`** - Architectural decisions, key files, and current status. Update when you make design decisions or change what's in progress. When `.3md` exists beside the spec, that file is the lesson source: the first plane is context and later planes are lessons. Record a new lesson on a later plane. `context.md` stays, and briefings do not read it while the 3md file parses. +- **`testing.md`** - Test strategy: automated test locations, manual QA checklists, and edge cases/boundary conditions. +- **`design.md`** *(opt-in)* - Layout, component hierarchy, design tokens, and asset references. Present when `companions.design` is enabled in config. ## Before modifying any module @@ -43,33 +68,54 @@ Each canonical spec may have policy-selected companion files. Read and update th ## After completing work -1. Mark completed items in `tasks.md` — check off finished tasks, add new ones discovered -2. Update `context.md` — record decisions made, update current status +1. Mark completed items in `tasks.md`: check off finished tasks, add new ones discovered +2. If `.3md` exists beside the spec, record the lesson on a later plane of that file. Otherwise update `context.md`: record decisions made, update current status 3. If requirements changed, update `requirements.md` acceptance criteria 4. If test coverage changed, update `testing.md` with new test files or edge cases 5. If UI/layout changed, update `design.md` with revised layout, components, or tokens ## Before creating a PR -Run `specsync check --strict` — all specs must pass with zero warnings. +Run `specsync check --strict`: all specs must pass with zero warnings. If SDD is adopted, push +the product tip from `change check --commit` with the PR. Record `change review` and +`change ship`/`finalize` only after that tip is on the PR and required checks have run. Do not +record review or ship before the PR exists. ## When adding new modules Run `specsync scaffold ` to create a spec, companion files, a registry -entry, and auto-detected source files — or `specsync new ` for a +entry, and auto-detected source files, or `specsync new ` for a minimal spec-only draft. Complete the spec before writing code. The `/specsync:create-spec` command (or tool-equivalent) runs this for you, and accepts either a bare module name or a natural-language feature description (e.g. `/specsync:create-spec "I want a feature that lets users export their -data as CSV"`) — pass a description and it will pick a module name and use +data as CSV"`): pass a description and it will pick a module name and use the description to draft the spec's Purpose and Requirements. ## Key commands -- `specsync check` — validate all specs against source code -- `specsync check --json` — machine-readable validation output -- `specsync coverage` — show which modules lack specs -- `specsync score` — quality score for each spec (0-100) -- `specsync scaffold ` — full scaffold: spec + companions + registry entry + source detection -- `specsync new ` — quick-create a minimal spec (add `--full` for companions) -- `specsync resolve --remote` — verify cross-project dependencies +- `specsync check` - validate all specs against source code +- `specsync check --json` - machine-readable validation output +- `specsync change adopt` - turn on the opt-in verified change workflow +- `specsync change new ""` / `change answer` - open a change and finish the interview +- `specsync change approve --actor ""` - record the single scope approval +- `specsync change check [id]` - scoped verification for one SDD change (`--commit` for ship evidence) +- `specsync change review --reviewer ""` - record scoped implementation review +- `specsync change ship ` / `change finalize` - same-PR archive tip; do not commit between review and ship +- `specsync change status [id]` - one next action and a `Handoff:` line +- `specsync change audit` - active workspaces + living specs (not archive history) +- `specsync coverage` - show which modules lack specs +- `specsync score` - quality score for each spec (0-100) +- `specsync scaffold ` - full scaffold: spec + companions + registry entry + source detection +- `specsync new ` - quick-create a minimal spec (add `--full` for companions) +- `specsync resolve --remote` - verify cross-project dependencies + +## Repository delivery policy (SpecSync 6.1.1) + +This repository requires SDD for meaningful work, including Godot and Sculpt. Use the exact +6.1.1 writer. Definition approval is separate from actual human implementation review. +Keep canonical validation, product tests, scoped verification and global strict active audit +separate. Run the lifecycle guard before readiness; inherited debt is not exempt. Read prior +lessons, record the observed problem, smallest correction, evidence and applicability limits. +Finalize/archive on the same PR only after genuine current review. Preserve stronger Trust, +provenance, signer and reviewer policies. Never invent approvals or repair unrelated history. diff --git a/.github/workflows/trust.yml b/.github/workflows/trust.yml index 2682c31b..c6d3bb8c 100644 --- a/.github/workflows/trust.yml +++ b/.github/workflows/trust.yml @@ -35,8 +35,8 @@ jobs: with: bun-version: latest - # Strict SpecSync contract uses the same 6.0.0 binary Trust 1.2.2 - # defaults to. 6.x check is spec validation plus coverage only; + # Strict SpecSync and Trust explicitly select the 6.1.1 engine. + # Keep the independent canonical contract. 6.x check is spec validation plus coverage only; # Trust owns lifecycle verify. - name: Install pinned lifecycle tools shell: bash @@ -44,7 +44,7 @@ jobs: set -euo pipefail archive="$RUNNER_TEMP/specsync-macos-aarch64.tar.gz" checksum="$archive.sha256" - base="https://github.com/CorvidLabs/spec-sync/releases/download/v6.0.0" + base="https://github.com/CorvidLabs/spec-sync/releases/download/v6.1.1" curl -fsSL "$base/specsync-macos-aarch64.tar.gz" -o "$archive" curl -fsSL "$base/specsync-macos-aarch64.tar.gz.sha256" -o "$checksum" expected="$(awk '{print $1}' "$checksum")" @@ -73,8 +73,44 @@ jobs: - name: CorvidLabs Trust gate id: trust uses: CorvidLabs/trust@bccd89c111d47778c97c5064fb62ab51695e04ea # v1.2.2 + with: + specsync-version: "6.1.1" # Durability: fail if the standing rules block was removed. - name: Trust block present run: | grep -q "CorvidLabs trust toolchain: BEGIN" AGENTS.md + + # Archive readiness is a separate status: product Trust can complete before human + # implementation review and same-PR finalization. Both statuses remain required. + archive-readiness: + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install checksum-verified SpecSync 6.1.1 + shell: bash + run: | + set -euo pipefail + archive="$RUNNER_TEMP/specsync-macos-aarch64.tar.gz" + checksum="$archive.sha256" + base="https://github.com/CorvidLabs/spec-sync/releases/download/v6.1.1" + curl -fsSL "$base/specsync-macos-aarch64.tar.gz" -o "$archive" + curl -fsSL "$base/specsync-macos-aarch64.tar.gz.sha256" -o "$checksum" + expected="$(awk '{print $1}' "$checksum")" + actual="$(shasum -a 256 "$archive" | awk '{print $1}')" + test "$actual" = "$expected" + mkdir -p "$RUNNER_TEMP/specsync-bin" + tar -xzf "$archive" -C "$RUNNER_TEMP/specsync-bin" + mv "$RUNNER_TEMP/specsync-bin/specsync-macos-aarch64" "$RUNNER_TEMP/specsync-bin/specsync" + chmod +x "$RUNNER_TEMP/specsync-bin/specsync" + echo "$RUNNER_TEMP/specsync-bin" >> "$GITHUB_PATH" + + - name: Lifecycle regression controls + run: bash scripts/test-specsync-lifecycle.sh + + - name: Active lifecycle and archive gate + if: ${{ always() }} + run: bash scripts/check-specsync-lifecycle.sh diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/accepted-state.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/accepted-state.json new file mode 100644 index 00000000..6db0364b --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/accepted-state.json @@ -0,0 +1,44 @@ +{ + "schema_version": 1, + "workflow_version": 2, + "workflow_origin_version": 2, + "id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "slug": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "title": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "description": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "kind": "operations", + "state": "accepted", + "canonical_applied": true, + "base_commit": "c19963be38ec9843b738c1dc335c53809bb99207", + "created_at": 1792331985, + "updated_at": 1792335718, + "affected_specs": [], + "affected_paths": [ + ".github/workflows/trust.yml", + ".specsync/sdd.json", + "AGENTS.md", + "scripts/check-specsync-lifecycle.sh", + "scripts/test-specsync-lifecycle.sh", + ".codex/skills/spec-sync/SKILL.md", + ".cursor/skills/spec-sync/SKILL.md", + ".gemini/skills/spec-sync/SKILL.md", + ".claude/skills/spec-sync/SKILL.md" + ], + "no_spec_change": true, + "no_spec_change_rationale": "Operations-only CI and agent governance migration; product APIs and canonical module contracts remain unchanged.", + "acceptance_criteria": [ + "Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. A non-mutating lifecycle guard fails for a wrong engine, disabled policy, uncovered meaningful path or unfinished active workspace and passes a clean finalized fixture. No fabricated approvals or inherited-history repairs. Human review and finalization remain pending until they actually happen." + ], + "selected_artifacts": [ + "context", + "plan", + "testing", + "design", + "tasks" + ], + "dependencies": [], + "answers": { + "architecture_risk": "no", + "public_contract": "no" + } +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/approvals.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/approvals.json new file mode 100644 index 00000000..fa39260c --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/approvals.json @@ -0,0 +1,50 @@ +{ + "approvals": [ + { + "gate": "definition", + "actor": "0xLeif", + "timestamp": 1792332499, + "digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "note": "Human definition approval: Leif (0xLeif) answered yes at 2026-10-18 14:07 UTC to the written nine-project implementation scope in source thread 01a118b4-4fe7-70fc-9f2d-dbbe961ba009. Evidence relayed by authorized delegation. Recorded by agent:codex as corvid-agent. Approval covers this prepared definition only; not human implementation acceptance, review, merge, release or deployment.", + "approved_scope": { + "schema_version": 1, + "change_id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "title": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "description": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "kind": "operations", + "affected_specs": [], + "affected_paths": [ + ".claude/skills/spec-sync/SKILL.md", + ".codex/skills/spec-sync/SKILL.md", + ".cursor/skills/spec-sync/SKILL.md", + ".gemini/skills/spec-sync/SKILL.md", + ".github/workflows/trust.yml", + ".specsync/sdd.json", + "AGENTS.md", + "scripts/check-specsync-lifecycle.sh", + "scripts/test-specsync-lifecycle.sh" + ], + "no_spec_change": true, + "no_spec_change_rationale": "Operations-only CI and agent governance migration; product APIs and canonical module contracts remain unchanged.", + "acceptance_criteria": [ + "Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. A non-mutating lifecycle guard fails for a wrong engine, disabled policy, uncovered meaningful path or unfinished active workspace and passes a clean finalized fixture. No fabricated approvals or inherited-history repairs. Human review and finalization remain pending until they actually happen." + ], + "dependencies": [], + "supersedes": [], + "answers": { + "architecture_risk": "no", + "public_contract": "no" + } + }, + "approved_delta_digests": {} + }, + { + "gate": "finalization", + "actor": "specsync:finalization", + "timestamp": 1792335718, + "digest": "2e7a0a12464b78d7981563784042c7568a56f8af00e88ff28e08544df43dd875", + "note": "Same-PR finalization closing digest" + } + ], + "reopenings": [] +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/change.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/change.md new file mode 100644 index 00000000..cd406cfa --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/change.md @@ -0,0 +1,24 @@ +--- +id: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +state: archived +type: operations +base_commit: c19963be38ec9843b738c1dc335c53809bb99207 +--- + +# Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md + +## Intent + +Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md + +## Affected Canonical Specs + +- None + +## Acceptance Criteria + +- Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. A non-mutating lifecycle guard fails for a wrong engine, disabled policy, uncovered meaningful path or unfinished active workspace and passes a clean finalized fixture. No fabricated approvals or inherited-history repairs. Human review and finalization remain pending until they actually happen. + +## No-spec Rationale + +Operations-only CI and agent governance migration; product APIs and canonical module contracts remain unchanged. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/context.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/context.md new file mode 100644 index 00000000..55ec6201 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/context.md @@ -0,0 +1,33 @@ +--- +change: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +artifact: context +--- + +# Context + +## Status + +Prepared by agent:codex using the authenticated corvid-agent GitHub account. Proposed interview answers are agent drafting from the user request, not a new human decision. Definition approval: pending. Implementation acceptance/review: pending. No approve, review, check, finalize, push or PR publication was performed for this change. + +Exact base: `c19963be38ec9843b738c1dc335c53809bb99207` on `main`; isolated branch `codex/specsync-611-definition`. + +## Ownership + +PR #98 (0xLeif) owns element bundle cleanup/fledge.toml. Preserve element/dist and historical archives. Linux checks do not establish macOS Sculpt UI acceptance. + +Host-Mac _notes #69 comment 6245284491 owns Bot policy; Raven #418 is merged and excluded. Site #537 is closed unmerged. The 197-repository audit is not this target list. + +## Evidence-backed observations + +The isolated official Linux aarch64 6.1.1 archive passed its published SHA-256 check and reports specsync 6.1.1. The global PATH writer is 6.1.0 and must not write these records. Arcsite Trust 1.2.0 action.yml supports specsync-version. Broad rollout permission does not approve these newly written definitions. + +## Learning plan + +Read the existing instruction/spec context and cited lessons before implementing. Record observed failure, fix, command/evidence, applicability limits and remaining question in this change context. Promote only reusable supported findings; do not claim a new product lesson from an unrun test. Preserve historical lesson bundles. + +- .specsync/archive/changes/2026-10-10-record-viewer-navigation-verification-evidence-for-the-approved-archive/lesson-bundle.md +- .specsync/archive/changes/2026-10-10-repair-blurry-cubes-and-slice-canvases-after-view-and-display-size-changes-while-retaining-the-webgl-context-and-camera/lesson-bundle.md + +## Resume + +Use the isolated 6.1.1 binary with `change status adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md`. Definition approval and implementation review remain separate human decisions. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/design.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/design.md new file mode 100644 index 00000000..f8e614f8 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/design.md @@ -0,0 +1,14 @@ +--- +change: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +artifact: design +--- + +# Design + +## Operations design + +Pin the installed lifecycle writer and Trust selector to 6.1.1, retain Trust 1.2.2 and Fledge pins. Extend root meaningful paths to gdscript/, apps/sculpt/ and .agents/. Root lifecycle owns Sculpt operations; preserve nested specs and the existing Linux Sculpt and macOS app lanes. Do not invent a nested SDD policy or change its hashes. + +The guard runs separately from canonical validation and product tasks to avoid recursive verification. It checks exact engine, required flags and native strict active audit, then refuses unfinished active workspaces. It never changes state, signs evidence, or repairs archives. Inherited debt is a blocker rather than a baseline exemption. + +Learning stays in native change context/lesson bundles and applicable existing skills. Stronger risk and provenance controls remain unchanged. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/finalization.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/finalization.json new file mode 100644 index 00000000..47dc17d4 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/finalization.json @@ -0,0 +1,12 @@ +{ + "schema_version": 2, + "change_id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "implementation_commit": "aa35d5cff5df3eeac55f69dba538026e6c9da2a6", + "implementation_tree": "84c232b8572dc0369729cf549a8884607982eae1", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "closing_digest": "2e7a0a12464b78d7981563784042c7568a56f8af00e88ff28e08544df43dd875", + "review_digest": "ae3e073ba73b3cd80e83182032c89271c7ff67a6d5cfb341389335eb3a04c5e8", + "finalization_digest": "128ed5764be5ced507882d619d3f61a1a4443d52867717796efdd1ca5c72c779", + "timestamp": 1792335718 +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/implementation-observations.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/implementation-observations.md new file mode 100644 index 00000000..ea9c6609 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/implementation-observations.md @@ -0,0 +1,23 @@ +# Implementation observations and pending qualification + +Observed: native audit inspects archived state enough to reject an invented archive directory lacking state.json. Correction: tests use an empty clean fixture and archive-only note, explicitly not a fabricated accepted/finalized change. Genuine human-review/finalization remains manual. Evidence: initial control failure and final 3md-controls.log; this does not prove authentic finalized-delivery positive behavior. +Observed: placing an enforcing archive guard before existing Trust would skip existing checks when inherited debt fails. Correction: append independent always() guard/control steps after the unchanged Trust invocation. Evidence: workflow diff; hosted execution has not run. +Observed: approved definition tasks remain incomplete; scoped verification refuses them. Preserve approval-bound artifacts and record results externally pending a supported safe runtime-update path or exact amendment. No self reapproval. +Observed: Linux Sculpt package compilation fails CLzfse/lzfse.h absent. No product change is authorized by this operations migration; resolve build prerequisites separately and rerun. Godot absent; macOS Sculpt lane not runnable on Ubuntu. + +Native change check --strict --commit passed, but rewrites change.md and removes unknown sections. A disposable native check preserved this file byte-exact with the approved digest unchanged (3md-observation-probe.json). Store observations here as supplemental human-readable package context; do not assume the native lesson synthesizer consumes it; this is not a machine approval or review. The original definition/context remain untouched. Checkboxes mean the planned operations and attempts were executed, not that product checks passed. + +Canonical strict100 coverage passed. All 15 lifecycle controls passed, including ignored child-file/subtree regressions exercising the existing reject-all-exclusions policy. Scoped operations evidence is not product evidence. Global audit after scoped verification has exactly nine inherited errors. The archive guard remains blocked. + +Cold full verify timed out at240 seconds after lint/build while Swift tests were running; warm full retry PASSED all eight steps in5m41.827s (exit0): lint/build,315 Swift tests,431 JS tests,115 Rust tests (one existing ignored exhaustive mutant test), nine-pair interchange, element bundle drift and editor grammar checks. Linux Sculpt exit1 missing lzfse.h; Godot missing; macOS lane unavailable. Trust initial invocation could not infer comparison range. The root product lane passed. No Sculpt, Godot, complete Trust pass, hosted CI, human implementation review or finalization is asserted. + +Owners must recover incomplete inherited plans/interviews, REQ-ThreeMD-044 collision and stale verification separately. Provide Linux LZFSE/Godot prerequisites and macOS Sculpt validation; complete product/Trust gates before readiness. + +Final workflow review: even always() steps in the same job make product Trust status red +until archive finalization. Moved only the new lifecycle controls/guard into an independent +archive-readiness job with checksum-verified6.1.1 installation. Existing canonical, product, +risk, provenance and Trust-block steps remain unchanged in the original trust job. Neither +job depends on the other; readiness still requires both, without forcing human finalization +before product evidence is available. YAML structure and fixture controls validate the split. +The prior explicit-range Trust run was interrupted for user-requested cleanup (exit15), not +a pass; a disk-monitored exact-candidate rerun is pending. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/lesson-bundle.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/lesson-bundle.md new file mode 100644 index 00000000..bf112416 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/lesson-bundle.md @@ -0,0 +1,85 @@ +# Lesson bundle — adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md + +Material for folding this change's lessons into each affected module's lesson file. +Synthesise from what actually happened below; do not restate the change description. + +## What this change was + +- **Title**: Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md +- **Kind**: Operations +- **Paths**: .github/workflows/trust.yml, .specsync/sdd.json, AGENTS.md, scripts/check-specsync-lifecycle.sh, scripts/test-specsync-lifecycle.sh, .codex/skills/spec-sync/SKILL.md, .cursor/skills/spec-sync/SKILL.md, .gemini/skills/spec-sync/SKILL.md, .claude/skills/spec-sync/SKILL.md +- **Acceptance**: Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. A non-mutating lifecycle guard fails for a wrong engine, disabled policy, uncovered meaningful path or unfinished active workspace and passes a clean finalized fixture. No fabricated approvals or inherited-history repairs. Human review and finalization remain pending until they actually happen. + +## Evidence + +- Verification commit: `aa35d5cff5df3eeac55f69dba538026e6c9da2a6` +- Base commit: `c19963be38ec9843b738c1dc335c53809bb99207` +- Verified by: `specsync check (no spec in scope)` + +## From the change's context.md + +# Context + +## Status + +Prepared by agent:codex using the authenticated corvid-agent GitHub account. Proposed interview answers are agent drafting from the user request, not a new human decision. Definition approval: pending. Implementation acceptance/review: pending. No approve, review, check, finalize, push or PR publication was performed for this change. + +Exact base: `c19963be38ec9843b738c1dc335c53809bb99207` on `main`; isolated branch `codex/specsync-611-definition`. + +## Ownership + +PR #98 (0xLeif) owns element bundle cleanup/fledge.toml. Preserve element/dist and historical archives. Linux checks do not establish macOS Sculpt UI acceptance. + +Host-Mac _notes #69 comment 6245284491 owns Bot policy; Raven #418 is merged and excluded. Site #537 is closed unmerged. The 197-repository audit is not this target list. + +## Evidence-backed observations + +The isolated official Linux aarch64 6.1.1 archive passed its published SHA-256 check and reports specsync 6.1.1. The global PATH writer is 6.1.0 and must not write these records. Arcsite Trust 1.2.0 action.yml supports specsync-version. Broad rollout permission does not approve these newly written definitions. + +## Learning plan + +Read the existing instruction/spec context and cited lessons before implementing. Record observed failure, fix, command/evidence, applicability limits and remaining question in this change context. Promote only reusable supported findings; do not claim a new product lesson from an unrun test. Preserve historical lesson bundles. + +- .specsync/archive/changes/2026-10-10-record-viewer-navigation-verification-evidence-for-the-approved-archive/lesson-bundle.md +- .specsync/archive/changes/2026-10-10-repair-blurry-cubes-and-slice-canvases-after-view-and-display-size-changes-while-retaining-the-webgl-context-and-camera/lesson-bundle.md + +## Resume + +Use the isolated 6.1.1 binary with `change status adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md`. Definition approval and implementation review remain separate human decisions. + +## From the change's design.md + +# Design + +## Operations design + +Pin the installed lifecycle writer and Trust selector to 6.1.1, retain Trust 1.2.2 and Fledge pins. Extend root meaningful paths to gdscript/, apps/sculpt/ and .agents/. Root lifecycle owns Sculpt operations; preserve nested specs and the existing Linux Sculpt and macOS app lanes. Do not invent a nested SDD policy or change its hashes. + +The guard runs separately from canonical validation and product tasks to avoid recursive verification. It checks exact engine, required flags and native strict active audit, then refuses unfinished active workspaces. It never changes state, signs evidence, or repairs archives. Inherited debt is a blocker rather than a baseline exemption. + +Learning stays in native change context/lesson bundles and applicable existing skills. Stronger risk and provenance controls remain unchanged. + +## From the change's testing.md + +# Testing + +## Planned local tests (not run) + +- `fledge lanes run verify` +- `swift test --package-path apps/sculpt --no-parallel --skip deterministicPortableInterchangeFixtures` +- `fledge run gdscript` +- `fledge lanes run sculpt (macOS only)` + +Run the exact pinned writer: `specsync --version` must report 6.1.1. Run `specsync check --force --strict`, `specsync change audit --strict`, then scoped `specsync change check adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md --strict` only after definition approval and implementation. The operations no-spec check alone is not product testing. Preserve current coverage thresholds. Run the repository Trust gate where configured and qualified; report missing prerequisites or provenance failures without weakening them. + +## Lifecycle regression controls + +In disposable fixture repositories, compare an unchanged-policy clean finalized case against uncovered source/test/governance changes, wrong 6.1.0 engine, disabled flags and active/unfinalized workspaces. Each negative control must fail for the intended reason. Verify existing checks still execute and an archive-only follow-up can pass without creating an approval/review record. No human identity is invented for fixtures; controls needing authentic human acceptance remain manual. + +## Baseline versus candidate + +Baseline command outputs and exit codes live outside this repository in the rollout evidence directory at exact base c19963be38ec9843b738c1dc335c53809bb99207. They are not implementation validation. Re-run baselines after any base update. New failures belong to this candidate; inherited failures remain owner debt. No product tests have run in this preparation. + +## Where these lessons go + +This change declared no affected specs, so there is no module context to fold into. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/plan.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/plan.md new file mode 100644 index 00000000..0f520dce --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/plan.md @@ -0,0 +1,36 @@ +--- +change: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +artifact: plan +--- + +# Plan + +## Approach + +Pin the installed lifecycle writer and Trust selector to 6.1.1, retain Trust 1.2.2 and Fledge pins. Extend root meaningful paths to gdscript/, apps/sculpt/ and .agents/. Root lifecycle owns Sculpt operations; preserve nested specs and the existing Linux Sculpt and macOS app lanes. Do not invent a nested SDD policy or change its hashes. + +Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. + +## Out of scope + +No product functional behavior, dependency upgrades, credentials, branch protections, main pushes, merges, tags, releases, deployments, VPS access, production services or historical acceptance repairs. No Bot #230 or paused AlgoChat Fledge work. Keep .specsync/version bytes unchanged; it is a lifecycle format stamp. + +## Steps + +1. Human inspects and approves this exact definition; resolve overlaps before implementation. +2. Pin only declared selectors and regenerate installed agent integrations with verified 6.1.1; inspect generated diff and retain local guidance. +3. Add required meaningful path coverage and a non-mutating lifecycle guard. Preserve existing workflow jobs. +4. Run product gates, canonical check and active audit separately; disclose baseline debt and resolve it only through separately authorized owner work. +5. Publish a tested draft PR only after applicable publication checks pass. Obtain actual current human implementation review. +6. Record only authentic review; finalize/archive on the same PR after evidence and lessons are ready. No merge in this scope. + +## Risks + +Inherited active records may block a strict global audit/archive guard. Do not accept them retroactively or add exclusions. The rollout stays blocked where stronger enforcement exposes debt. Linux cannot establish macOS or browser visual acceptance. + +## Constraints consulted + +PR #98 (0xLeif) owns element bundle cleanup/fledge.toml. Preserve element/dist and historical archives. Linux checks do not establish macOS Sculpt UI acceptance. + +- .specsync/archive/changes/2026-10-10-record-viewer-navigation-verification-evidence-for-the-approved-archive/lesson-bundle.md +- .specsync/archive/changes/2026-10-10-repair-blurry-cubes-and-slice-canvases-after-view-and-display-size-changes-while-retaining-the-webgl-context-and-camera/lesson-bundle.md diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review-attempts.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review-attempts.json new file mode 100644 index 00000000..9d2e2ad5 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review-attempts.json @@ -0,0 +1,21 @@ +{ + "schema_version": 1, + "reviews": [ + { + "schema_version": 2, + "change_id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "reviewer": "0xLeif", + "provenance": { + "schema_version": 1, + "provider": "github_actions_check", + "required_check": "SpecSync scoped review" + }, + "verdict": "pass", + "implementation_commit": "aa35d5cff5df3eeac55f69dba538026e6c9da2a6", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "timestamp": 1792335709 + } + ] +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review.json new file mode 100644 index 00000000..172d96c3 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/review.json @@ -0,0 +1,16 @@ +{ + "schema_version": 2, + "change_id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "reviewer": "0xLeif", + "provenance": { + "schema_version": 1, + "provider": "github_actions_check", + "required_check": "SpecSync scoped review" + }, + "verdict": "pass", + "implementation_commit": "aa35d5cff5df3eeac55f69dba538026e6c9da2a6", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "timestamp": 1792335709 +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/state.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/state.json new file mode 100644 index 00000000..62ff1566 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/state.json @@ -0,0 +1,44 @@ +{ + "schema_version": 1, + "workflow_version": 2, + "workflow_origin_version": 2, + "id": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "slug": "adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md", + "title": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "description": "Adopt verified SpecSync 6.1.1 approval review learning and archive lifecycle for 3md", + "kind": "operations", + "state": "archived", + "canonical_applied": true, + "base_commit": "c19963be38ec9843b738c1dc335c53809bb99207", + "created_at": 1792331985, + "updated_at": 1792335727, + "affected_specs": [], + "affected_paths": [ + ".github/workflows/trust.yml", + ".specsync/sdd.json", + "AGENTS.md", + "scripts/check-specsync-lifecycle.sh", + "scripts/test-specsync-lifecycle.sh", + ".codex/skills/spec-sync/SKILL.md", + ".cursor/skills/spec-sync/SKILL.md", + ".gemini/skills/spec-sync/SKILL.md", + ".claude/skills/spec-sync/SKILL.md" + ], + "no_spec_change": true, + "no_spec_change_rationale": "Operations-only CI and agent governance migration; product APIs and canonical module contracts remain unchanged.", + "acceptance_criteria": [ + "Exact 6.1.1 writer and action inputs; required meaningful source/test/governance coverage; genuine human definition approval before implementation; separate current scoped human review of the implementation; actual product tests distinct from canonical checks and active-workspace audit; same-PR finalize/archive before merge; read prior lessons and record observed findings with evidence and limits. Preserve all stronger existing checks, risk thresholds, signer policies, archives and unrelated work. A non-mutating lifecycle guard fails for a wrong engine, disabled policy, uncovered meaningful path or unfinished active workspace and passes a clean finalized fixture. No fabricated approvals or inherited-history repairs. Human review and finalization remain pending until they actually happen." + ], + "selected_artifacts": [ + "context", + "plan", + "testing", + "design", + "tasks" + ], + "dependencies": [], + "answers": { + "architecture_risk": "no", + "public_contract": "no" + } +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/tasks.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/tasks.md new file mode 100644 index 00000000..d0655740 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/tasks.md @@ -0,0 +1,13 @@ +--- +change: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +artifact: tasks +--- + +# Tasks + +- [x] Apply only the approved declared selector, instructions and policy changes. +- [x] Add and exercise lifecycle guard controls. +- [x] Run planned product, canonical, scoped and global checks; record actual results and limitations. +- [x] Record observed reusable lessons in change context. + +Human approval, PR publication, implementation review and finalization are delivery holds in testing/context, not claimed completed implementation tasks. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/testing.md b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/testing.md new file mode 100644 index 00000000..ab4a51f4 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/testing.md @@ -0,0 +1,23 @@ +--- +change: adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md +artifact: testing +--- + +# Testing + +## Planned local tests (not run) + +- `fledge lanes run verify` +- `swift test --package-path apps/sculpt --no-parallel --skip deterministicPortableInterchangeFixtures` +- `fledge run gdscript` +- `fledge lanes run sculpt (macOS only)` + +Run the exact pinned writer: `specsync --version` must report 6.1.1. Run `specsync check --force --strict`, `specsync change audit --strict`, then scoped `specsync change check adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md --strict` only after definition approval and implementation. The operations no-spec check alone is not product testing. Preserve current coverage thresholds. Run the repository Trust gate where configured and qualified; report missing prerequisites or provenance failures without weakening them. + +## Lifecycle regression controls + +In disposable fixture repositories, compare an unchanged-policy clean finalized case against uncovered source/test/governance changes, wrong 6.1.0 engine, disabled flags and active/unfinalized workspaces. Each negative control must fail for the intended reason. Verify existing checks still execute and an archive-only follow-up can pass without creating an approval/review record. No human identity is invented for fixtures; controls needing authentic human acceptance remain manual. + +## Baseline versus candidate + +Baseline command outputs and exit codes live outside this repository in the rollout evidence directory at exact base c19963be38ec9843b738c1dc335c53809bb99207. They are not implementation validation. Re-run baselines after any base update. New failures belong to this candidate; inherited failures remain owner debt. No product tests have run in this preparation. diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification-attempts.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification-attempts.json new file mode 100644 index 00000000..2ba4d3f9 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification-attempts.json @@ -0,0 +1,245 @@ +{ + "schema_version": 1, + "attempts": [ + { + "timestamp": 1792333044, + "commit": "c19963be38ec9843b738c1dc335c53809bb99207", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "9b44fc6cdda52ab58f64d9d75d9bab974370942b497c7a9a5d500c68d84de3f6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333067, + "commit": "c19963be38ec9843b738c1dc335c53809bb99207", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "ccc269040799a04a143ccd782cb735ce11e66b320b34b931fb48d50d1a6221b3", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333080, + "commit": "c19963be38ec9843b738c1dc335c53809bb99207", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "ccc269040799a04a143ccd782cb735ce11e66b320b34b931fb48d50d1a6221b3", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333083, + "commit": "bd2f2fcf84a7f0bbd5d843a4c14b77c29d509db2", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "ccc269040799a04a143ccd782cb735ce11e66b320b34b931fb48d50d1a6221b3", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333385, + "commit": "b8b189111c5d7ce37d8fdcd858d93eb22a51d51f", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "0d09b9245c262ec5a6395d131d659753dc4cf8dc377a33bc192f720d945f211d", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333387, + "commit": "d4a1fbf2b61ac113a8e7bcd1dd6aa0cb1c03a52b", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "0d09b9245c262ec5a6395d131d659753dc4cf8dc377a33bc192f720d945f211d", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333776, + "commit": "3a750aa55c4b09e0525dec1044d026b16b517f1f", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333778, + "commit": "827abb0c6a1209fe8a2dc30649c6a8e611d08dd1", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792333778, + "commit": "aa35d5cff5df3eeac55f69dba538026e6c9da2a6", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "acceptance_input_digest": "a1bbb3e74d51f87df3cd64c3babc354e051f00d66cf3b96d3ec50bb16103a3a0", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".claude/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "91ab160a5d83c5bed48fe771877350681d391d4d54b7e8adb8936464f0362420", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".codex/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "41b37b48b47b62fd2d66d355699e3f5a9caa00cc746e75f2ef8d1998ee8fd6a0", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".cursor/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "59fdbdcd08d493598b9eefb730aa7ea7434260edd1d072d55dd7ee6f4fbd1e32", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".gemini/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "6337d445e66aaaec5694fc794237d8e94616c721326e1e5ca9875811643178f4", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".github/workflows/trust.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "c5c25748ca08106cca8c48c91645ad5e6e157321595819ecde537e8ca75acb25", + "entry_digest": "13431b6496ff1df4d55cc505634792a56b4dcc982df77679525f444193d2f3f3", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".specsync/sdd.json", + "kind": "file", + "mode": 33188, + "payload_digest": "206e1970201061e0369048d2d21c5df92701599e0d447feed7aeb7565a7cddfd", + "entry_digest": "6059c927ed6e85afc15d36e9063311e48a33aeca320e2c3843e90694e4cab465", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "AGENTS.md", + "kind": "file", + "mode": 33188, + "payload_digest": "5bb0b879f9f4c752bd03756414b46e54a7f96632fdfa8f25ca976e6daf10edc0", + "entry_digest": "6b2b1e367cefa6997127b42060dbc5a3eee822523860c9834eb2e980bcde5f9a", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "scripts/check-specsync-lifecycle.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "3acbc9319778c72cab469e18781a36f90ab57d205c8ee84daa7b3b33cf922837", + "entry_digest": "4159e847b5ed9dfbb71a0b7e6afb3b73592282a193d7108a5f337e36d15ff1d7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "scripts/test-specsync-lifecycle.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "dae06c6dbeb43cb28f5e440cd27707383cc9b978c1b551fcb2ba491a2afc28f7", + "entry_digest": "802c3c8b07753c81230d0234c94c41d92b89a3c5b516abf723d0c32f93194311", + "owners": [ + "@exact:delivery" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + } + ] +} diff --git a/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification.json b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification.json new file mode 100644 index 00000000..f1fc4c72 --- /dev/null +++ b/.specsync/archive/changes/2026-10-18-adopt-verified-specsync-6-1-1-approval-review-learning-and-archive-lifecycle-for-3md/verification.json @@ -0,0 +1,112 @@ +{ + "timestamp": 1792333778, + "commit": "aa35d5cff5df3eeac55f69dba538026e6c9da2a6", + "contract_digest": "4b677788851f857f7d93e23e3714c3cf931ecd0466d9572fa311e130946ad877", + "execution_digest": "a38f609153cb422e57d5d60a455f7e836d8116bbce3ed1506ceaaa635c661665", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "acceptance_input_digest": "a1bbb3e74d51f87df3cd64c3babc354e051f00d66cf3b96d3ec50bb16103a3a0", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".claude/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "91ab160a5d83c5bed48fe771877350681d391d4d54b7e8adb8936464f0362420", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".codex/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "41b37b48b47b62fd2d66d355699e3f5a9caa00cc746e75f2ef8d1998ee8fd6a0", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".cursor/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "59fdbdcd08d493598b9eefb730aa7ea7434260edd1d072d55dd7ee6f4fbd1e32", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".gemini/skills/spec-sync/SKILL.md", + "kind": "file", + "mode": 33188, + "payload_digest": "66a97759c8da2c056c2beb26594d265583bd81765b6f07d0ba4c237841032f95", + "entry_digest": "6337d445e66aaaec5694fc794237d8e94616c721326e1e5ca9875811643178f4", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".github/workflows/trust.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "c5c25748ca08106cca8c48c91645ad5e6e157321595819ecde537e8ca75acb25", + "entry_digest": "13431b6496ff1df4d55cc505634792a56b4dcc982df77679525f444193d2f3f3", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".specsync/sdd.json", + "kind": "file", + "mode": 33188, + "payload_digest": "206e1970201061e0369048d2d21c5df92701599e0d447feed7aeb7565a7cddfd", + "entry_digest": "6059c927ed6e85afc15d36e9063311e48a33aeca320e2c3843e90694e4cab465", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "AGENTS.md", + "kind": "file", + "mode": 33188, + "payload_digest": "5bb0b879f9f4c752bd03756414b46e54a7f96632fdfa8f25ca976e6daf10edc0", + "entry_digest": "6b2b1e367cefa6997127b42060dbc5a3eee822523860c9834eb2e980bcde5f9a", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "scripts/check-specsync-lifecycle.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "3acbc9319778c72cab469e18781a36f90ab57d205c8ee84daa7b3b33cf922837", + "entry_digest": "4159e847b5ed9dfbb71a0b7e6afb3b73592282a193d7108a5f337e36d15ff1d7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "scripts/test-specsync-lifecycle.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "dae06c6dbeb43cb28f5e440cd27707383cc9b978c1b551fcb2ba491a2afc28f7", + "entry_digest": "802c3c8b07753c81230d0234c94c41d92b89a3c5b516abf723d0c32f93194311", + "owners": [ + "@exact:delivery" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] +} diff --git a/.specsync/changes/add-a-structured-binary-document-payload-kind-2-to-threemd-2-1-in-swift-typescript-and-rust-with-fast-checksums-cli/plan.md b/.specsync/changes/add-a-structured-binary-document-payload-kind-2-to-threemd-2-1-in-swift-typescript-and-rust-with-fast-checksums-cli/plan.md index a7cba63e..45bf606c 100644 --- a/.specsync/changes/add-a-structured-binary-document-payload-kind-2-to-threemd-2-1-in-swift-typescript-and-rust-with-fast-checksums-cli/plan.md +++ b/.specsync/changes/add-a-structured-binary-document-payload-kind-2-to-threemd-2-1-in-swift-typescript-and-rust-with-fast-checksums-cli/plan.md @@ -419,3 +419,19 @@ Leif's veto: uncompressed container must fit `Emax`. 7. **Integration.** WP3 to WP5 land together with WP6 in one integration merge. 8. **CLI tests.** They stay in `Tests/ThreeMDTests`; no test target is added, so `Package.swift` is not touched. + +## Approach + +Execute the existing WP0–WP12 plan above for ThreeMD 2.1.0 (SPEC 1.2) across Swift, TypeScript and Rust, preserving the shared fixtures and nine-pair interchange integration point. + +## Out of scope + +No individual work package merges, tags or publishes on its own. Existing ground rules and declared directory ownership remain binding; this heading normalization adds no delivery scope or approval. + +## Steps + +Follow the existing Order graph and WP0–WP12 sections above, including integration verification before release readiness. Their detailed work and outstanding evidence remain unchanged. + +## Constraints consulted + +This normalization uses this plan's Ground rules, Owners and directory ownership, Order and Risks sections. Keep the original pinned-tool historical requirements and explicit prohibition on weakening lifecycle, contract, risk or provenance gates; no claim is made that deferred work is complete. diff --git a/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/plan.md b/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/plan.md index 3038a3db..7a06442f 100644 --- a/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/plan.md +++ b/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/plan.md @@ -14,3 +14,23 @@ artifact: plan 7. Trust verify. No publish, tag, or merge in this change. The grammar, envelope, and profile stay as they are. Sculpt is out of scope. `element/dist` is not rebuilt. + +## Approach + +Implement the existing numeric/NFC, text, storage, composition/editing, helper and interchange stages in the numbered plan, preserving parity with the other three languages. + +## Out of scope + +The grammar, envelope and composition profile remain unchanged. Sculpt and element/dist rebuilds are outside this change; no publication, tag or merge is authorized by this plan. + +## Steps + +Follow the seven existing numbered steps above; retain the shared conformance checks and 16 writer/reader-pair target. + +## Risks + +Existing context records differences in Godot numeric conversion, NFC and integer division. LZFSE is explicitly unsupported; file access belongs only to the separate game helper. + +## Constraints consulted + +This format normalization uses this record's existing plan.md and context.md and the constraints answer sourced from those artifacts. It adds no human approval, completed-test claim or historical acceptance. diff --git a/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/state.json b/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/state.json index ca55c37d..5e0ff267 100644 --- a/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/state.json +++ b/.specsync/changes/add-gdscript-as-a-fourth-supported-threemd-language-a-godot-4-addon-that-parses-serializes-stores-composes-and-edits/state.json @@ -10,7 +10,7 @@ "state": "draft", "base_commit": "773d927edb1e80d0561c4d8a1d155127c7e4d156", "created_at": 1791472582, - "updated_at": 1791472649, + "updated_at": 1792337634, "affected_specs": [ "ThreeMD" ], @@ -39,6 +39,7 @@ "dependencies": [], "answers": { "architecture_risk": "yes", + "constraints": "Existing plan/context constraints: preserve text grammar, binary envelope and composition profile; Godot 4.7, explicit unsupported LZFSE, no library file/network IO, separate game helper; interchange protocol 3md-interchange-1 with 16 pairs. Sculpt and element/dist rebuilds are out of scope. Preserve trust policy; no publish, tag, merge or invented definition approval. Recorded from the existing artifacts during authorized manual repair, not a new human decision.", "public_contract": "yes" } } diff --git a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/state.json b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/state.json index f5780033..13c1cdd6 100644 --- a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/state.json +++ b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/state.json @@ -11,7 +11,7 @@ "canonical_applied": true, "base_commit": "e1beb0954c62328c56d451d7c12087cf732fb337", "created_at": 1791659613, - "updated_at": 1791660493, + "updated_at": 1792339982, "affected_specs": [ "ThreeMDViewer", "ThreeMD" diff --git a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification-attempts.json b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification-attempts.json index 77a3ebc6..845bc1e6 100644 --- a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification-attempts.json +++ b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification-attempts.json @@ -32,6 +32,70 @@ } ], "requirement_ids": [] + }, + { + "timestamp": 1792337688, + "commit": "ca5e27054aa7007b429bd7926b009e9024289ce7", + "contract_digest": "15696a49a060f43344e43fcc830ce7413d265cda61d9031e33750ef073f6d590", + "execution_digest": "ab68f592a2d69ad1942dd3acb8ad6cf063006bcdcc5900342d30ce7ce10c2c4f", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMD --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792337690, + "commit": "a195271afbd752fa3455baff360554dd143000d7", + "contract_digest": "15696a49a060f43344e43fcc830ce7413d265cda61d9031e33750ef073f6d590", + "execution_digest": "ab68f592a2d69ad1942dd3acb8ad6cf063006bcdcc5900342d30ce7ce10c2c4f", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMD --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792339980, + "commit": "4738ab87756df8b367cbe05d68dbb51c1db9d1bb", + "contract_digest": "15696a49a060f43344e43fcc830ce7413d265cda61d9031e33750ef073f6d590", + "execution_digest": "ab68f592a2d69ad1942dd3acb8ad6cf063006bcdcc5900342d30ce7ce10c2c4f", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMD --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792339982, + "commit": "507f63d6cecce32e34efb59ec9039e67bd2f1ea7", + "contract_digest": "15696a49a060f43344e43fcc830ce7413d265cda61d9031e33750ef073f6d590", + "execution_digest": "ab68f592a2d69ad1942dd3acb8ad6cf063006bcdcc5900342d30ce7ce10c2c4f", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMD --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] } ] } diff --git a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification.json b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification.json index b769ac48..dec5658e 100644 --- a/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification.json +++ b/.specsync/changes/document-viewer-examples-and-supported-file-folder-and-github-opening-workflows/verification.json @@ -1,9 +1,9 @@ { - "timestamp": 1791660489, - "commit": "d6cd08dd6a48c1029757b3701502f71f435d16ff", + "timestamp": 1792339982, + "commit": "507f63d6cecce32e34efb59ec9039e67bd2f1ea7", "contract_digest": "15696a49a060f43344e43fcc830ce7413d265cda61d9031e33750ef073f6d590", "execution_digest": "ab68f592a2d69ad1942dd3acb8ad6cf063006bcdcc5900342d30ce7ce10c2c4f", - "workspace_digest": "f3c38cdceac07b6d4d38fd1bf4cf269931e5da1e16aac737e77d28fb378c2e21", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", "passed": true, "commands": [ { diff --git a/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/plan.md b/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/plan.md index ffee2797..b3dbd4b1 100644 --- a/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/plan.md +++ b/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/plan.md @@ -13,3 +13,23 @@ artifact: plan 6. Update SPEC.md, the module spec, the README, the migration note, the linked-file contract, and the test-plan notes. Remove the README chart that says decoding stops at 64 MiB. 7. Prove a real 1 GB text and kind-2 round trip locally. Do not commit that allocation and do not add it to CI. 8. Run the focused Swift, Bun, and Rust tests, then `fledge trust verify`. Definition approval stays with the user. Do not tag `v2.1.0`. + +## Approach + +Use host-supported storage limits and wider length/count integers while preserving explicit caller lower limits and existing small-file encodings. + +## Out of scope + +Composition profile ceilings and edit budgets remain unchanged. Coordinates retain four-byte integers. This repair does not authorize a tag, merge or publication. + +## Steps + +Follow the eight existing numbered steps above. Keep the real 1 GB round-trip check local and out of CI, and record its actual evidence separately. + +## Risks + +The existing context records host-integer limits near 2 GiB on 32-bit processes, JavaScript safe-integer bounds and possible memory exhaustion. Do not run a large allocation without sufficient host memory. + +## Constraints consulted + +This format normalization uses this record's existing plan.md and context.md and the constraints answer sourced from those artifacts. It adds no human approval, completed-test claim or historical acceptance. diff --git a/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/state.json b/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/state.json index bb67ec1b..c097a695 100644 --- a/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/state.json +++ b/.specsync/changes/remove-the-absolute-storage-size-ceilings-so-a-1-gb-5-gb-or-any-document-the-process-can-hold-is-parsed-and-saved-in/state.json @@ -10,7 +10,7 @@ "state": "draft", "base_commit": "d5f0730696b5da6da8f4e6181b1c4f24485cfcf4", "created_at": 1791388600, - "updated_at": 1791388625, + "updated_at": 1792337634, "affected_specs": [ "ThreeMD" ], @@ -50,6 +50,7 @@ "dependencies": [], "answers": { "architecture_risk": "yes", + "constraints": "Existing plan/context constraints: retain optional caller lower positive limits and reject non-positive limits; retain four-byte coordinate integers and minimal small kind-2 encoding; composition profile ceilings and edit budgets remain. Respect host integer and JavaScript safe-integer bounds. Real 1 GB round-trip evidence is local only, never a CI allocation. No tag, merge, publication or invented definition approval. Recorded from existing artifacts during authorized manual repair.", "public_contract": "yes" } } diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/approvals.json b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/approvals.json new file mode 100644 index 00000000..eb9c8f65 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/approvals.json @@ -0,0 +1,37 @@ +{ + "approvals": [ + { + "gate": "definition", + "actor": "0xLeif", + "timestamp": 1792339854, + "digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "note": null, + "approved_scope": { + "schema_version": 1, + "change_id": "retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot", + "title": "Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot", + "description": "Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot", + "kind": "operations", + "affected_specs": [], + "affected_paths": [ + ".specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/", + ".specsync/retired/" + ], + "no_spec_change": true, + "no_spec_change_rationale": "The 2.1 documentation delta was superseded by canonical 2.2.0 and 2.2.1 release documentation. Preserve its current workspace bytes and verifying state as non-finalized history; do not replay its stale delta or change living specs.", + "acceptance_criteria": [ + "Preserve every file and original verifying state of the superseded 2.1 documentation workspace byte-for-byte under a dated .specsync/retired snapshot with SHA-256 manifest and explicit non-finalized label. Preserve canonical/source tree, prior approvals and archives. Do not reapply obsolete 2.1 requirements. Keep all other unresolved active work and strict policy audit failures visible. Verify manifest, unchanged trees and scope; current retirement operation requires actual definition approval and current human review before native finalization. No merge, release, deployment or engine change." + ], + "dependencies": [], + "supersedes": [], + "answers": { + "architecture_risk": "yes", + "constraints": "Only the public-docs/coverage workspace is selected. Its REQ-ThreeMD-044 was superseded by fe20a18 and 4e718b4 release documentation. Other records, especially incomplete structured-binary scope, remain active. Bot retirement is a reference only, not authority. This new definition has no approval yet; do not move files before actual approval or claim prior exact-head review covers it.", + "public_contract": "no" + } + }, + "approved_delta_digests": {} + } + ], + "reopenings": [] +} diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/change.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/change.md new file mode 100644 index 00000000..9d355760 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/change.md @@ -0,0 +1,24 @@ +--- +id: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +state: implementing +type: operations +base_commit: 48ff62f8e44f4b6cced9e35c984085764659c282 +--- + +# Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot + +## Intent + +Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot + +## Affected Canonical Specs + +- None + +## Acceptance Criteria + +- Preserve every file and original verifying state of the superseded 2.1 documentation workspace byte-for-byte under a dated .specsync/retired snapshot with SHA-256 manifest and explicit non-finalized label. Preserve canonical/source tree, prior approvals and archives. Do not reapply obsolete 2.1 requirements. Keep all other unresolved active work and strict policy audit failures visible. Verify manifest, unchanged trees and scope; current retirement operation requires actual definition approval and current human review before native finalization. No merge, release, deployment or engine change. + +## No-spec Rationale + +The 2.1 documentation delta was superseded by canonical 2.2.0 and 2.2.1 release documentation. Preserve its current workspace bytes and verifying state as non-finalized history; do not replay its stale delta or change living specs. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/context.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/context.md new file mode 100644 index 00000000..547a257c --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/context.md @@ -0,0 +1,14 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: context +--- + +# Context + +The public-docs/coverage record remains verifying with a 2.1.0 ADDED delta. Canonical REQ-ThreeMD-044 now states published 2.2.1 facts from commit 4e718b4 (PR84), following fe20a18 (PR80). Replaying the old delta would revert living release facts. Native check rejects it. Retirement preserves original evidence without claiming successful acceptance. The user requested manual archival; this concrete retirement definition remains unapproved. + +## Observed retirement results + +All 12 source files and the original verifying state are preserved exactly under .specsync/retired/2026-10-18-superseded-docs/. The SHA-256 manifest identifies source commit 48ff62f8e44f4b6cced9e35c984085764659c282. All 2256 tracked non-lifecycle files are unchanged. Filesystem negative fixtures reject missing, altered and extra files and an invented archived state. Canonical strict validation and lifecycle regression controls pass. The strict active audit still reports the policy coverage issue; no diagnostic is suppressed. All five other inherited records remain active. Human implementation review and finalization of this retirement operation are pending. + +The first post-move audit also marked the two viewer verification records stale because retired files enter the project-input digest. Both viewer records were refreshed successfully with native strict check/commit. This refresh records automated evidence only; human review remains pending. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/design.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/design.md new file mode 100644 index 00000000..8e8f06f4 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/design.md @@ -0,0 +1,8 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: design +--- + +# Design + +Use .specsync/retired/2026-10-18-superseded-docs/ with the original workspace name and bytes, plus a sibling manifest and explanation explicitly saying verifying historical snapshot, not accepted/finalized. Do not place an unfinalized record in the native verified archive namespace. Exact manifest creation and movement occur only after definition approval. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/plan.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/plan.md new file mode 100644 index 00000000..98ba30bd --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/plan.md @@ -0,0 +1,21 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: plan +--- + +# Plan + +## Approach +Preserve the one superseded documentation package as raw historical evidence outside the active roster. + +## Out of scope +Do not retire other packages, claim completion, edit source/specs, modify policy, change the engine or merge. + +## Steps +Inventory and hash every current source package file; record original state and manifest. After actual definition approval, move the exact directory to dated .specsync/retired history and verify every byte. Compare canonical/source trees, run scoped verification and strict audit, expose remaining errors, obtain current human review and finalize only this operation when eligible. + +## Risks +Retiring an unresolved requirement could hide work. Limit this operation to the superseded release-documentation delta; keep the incomplete structured-binary and other five packages active. A retired snapshot is not an authenticated completed archive. + +## Constraints consulted +Read root AGENTS, the native spec-sync skill, the old documentation package, current canonical requirements, and pinned Bot retirement artifacts. Bot authority does not transfer. Preserve the trusted-base audit and existing approval ledgers. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/research.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/research.md new file mode 100644 index 00000000..fdc8e7e1 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/research.md @@ -0,0 +1,8 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: research +--- + +# Research + +Pinned Bot commit 6652d332 uses .specsync/retired for unchanged snapshots with manifests and original states. It has its own approved operation and repository guidance. In 3md, current canonical REQ-ThreeMD-044 and commits fe20a18/4e718b4 demonstrate the older 2.1 public-docs delta is superseded. This evidence does not establish that all other work is obsolete. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/state.json b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/state.json new file mode 100644 index 00000000..64def417 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/state.json @@ -0,0 +1,39 @@ +{ + "schema_version": 1, + "workflow_version": 2, + "workflow_origin_version": 2, + "id": "retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot", + "slug": "retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot", + "title": "Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot", + "description": "Retire the superseded ThreeMD 2.1 documentation workspace as an unchanged historical snapshot", + "kind": "operations", + "state": "verifying", + "canonical_applied": true, + "base_commit": "48ff62f8e44f4b6cced9e35c984085764659c282", + "created_at": 1792338305, + "updated_at": 1792339993, + "affected_specs": [], + "affected_paths": [ + ".specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/", + ".specsync/retired/" + ], + "no_spec_change": true, + "no_spec_change_rationale": "The 2.1 documentation delta was superseded by canonical 2.2.0 and 2.2.1 release documentation. Preserve its current workspace bytes and verifying state as non-finalized history; do not replay its stale delta or change living specs.", + "acceptance_criteria": [ + "Preserve every file and original verifying state of the superseded 2.1 documentation workspace byte-for-byte under a dated .specsync/retired snapshot with SHA-256 manifest and explicit non-finalized label. Preserve canonical/source tree, prior approvals and archives. Do not reapply obsolete 2.1 requirements. Keep all other unresolved active work and strict policy audit failures visible. Verify manifest, unchanged trees and scope; current retirement operation requires actual definition approval and current human review before native finalization. No merge, release, deployment or engine change." + ], + "selected_artifacts": [ + "context", + "plan", + "testing", + "research", + "design", + "tasks" + ], + "dependencies": [], + "answers": { + "architecture_risk": "yes", + "constraints": "Only the public-docs/coverage workspace is selected. Its REQ-ThreeMD-044 was superseded by fe20a18 and 4e718b4 release documentation. Other records, especially incomplete structured-binary scope, remain active. Bot retirement is a reference only, not authority. This new definition has no approval yet; do not move files before actual approval or claim prior exact-head review covers it.", + "public_contract": "no" + } +} diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/tasks.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/tasks.md new file mode 100644 index 00000000..f9a7998b --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/tasks.md @@ -0,0 +1,17 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: tasks +--- + +# Tasks + +- [x] Record actual approval of the exact definition. +- [x] Inventory and hash the selected package and source/spec tree. +- [x] Preserve the exact raw snapshot and verify missing/altered/extra/state-change negative controls. +- [x] Run canonical validation, lifecycle regression controls and strict audit; report remaining errors honestly. + +Native scoped verification follows this implementation checklist as its own gate. + +## Pending human review and finalization + +Current human implementation review has not occurred. This retirement operation remains active until genuine review and supported finalization; definition approval does not grant acceptance. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/testing.md b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/testing.md new file mode 100644 index 00000000..9533b041 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/testing.md @@ -0,0 +1,8 @@ +--- +change: retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot +artifact: testing +--- + +# Testing + +Require SHA-256 equality for every moved file and identical original state/approval bytes. Compare all tracked source and canonical spec bytes before/after. Assert exactly the selected workspace leaves the active roster and all other packages remain. Run canonical strict check, scoped strict verification and active strict audit. The policy failure must remain visible; retirement is not an audit exemption. Negative controls reject missing, altered or extra snapshot files and any claimed archived/accepted state conversion. No human review or acceptance is supplied by these tests. diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification-attempts.json b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification-attempts.json new file mode 100644 index 00000000..548db6b1 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification-attempts.json @@ -0,0 +1,69 @@ +{ + "schema_version": 1, + "attempts": [ + { + "timestamp": 1792339946, + "commit": "48ff62f8e44f4b6cced9e35c984085764659c282", + "contract_digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "execution_digest": "f8632faf9e82fc45b1c732db6fbdddcc6ef440212aca5337e11cc1025ce68131", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792339948, + "commit": "27bd3b1b11617dae61864177584c5a1f1e390c24", + "contract_digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "execution_digest": "f8632faf9e82fc45b1c732db6fbdddcc6ef440212aca5337e11cc1025ce68131", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792339990, + "commit": "dd1ccf5ab931d4b07e635f35912b5cf924f777fb", + "contract_digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "execution_digest": "d3592b775f5bed29ce865e94495dbea55b0b0ebd0b57865b44f2dbdc811526e8", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1792339992, + "commit": "08a799eecd8856b556ea1d043eccc157457e27f7", + "contract_digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "execution_digest": "d3592b775f5bed29ce865e94495dbea55b0b0ebd0b57865b44f2dbdc811526e8", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + } + ] +} diff --git a/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification.json b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification.json new file mode 100644 index 00000000..cc63ab36 --- /dev/null +++ b/.specsync/changes/retire-the-superseded-threemd-2-1-documentation-workspace-as-an-unchanged-historical-snapshot/verification.json @@ -0,0 +1,16 @@ +{ + "timestamp": 1792339992, + "commit": "08a799eecd8856b556ea1d043eccc157457e27f7", + "contract_digest": "78dd8a85470b23c0c75b01814080fceaf927af491b80277e469fb4383d82f067", + "execution_digest": "d3592b775f5bed29ce865e94495dbea55b0b0ebd0b57865b44f2dbdc811526e8", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check (no spec in scope)", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] +} diff --git a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/plan.md b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/plan.md index 753c940e..f83962ad 100644 --- a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/plan.md +++ b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/plan.md @@ -13,3 +13,23 @@ artifact: plan 5. Repair the startup failure/event gap and partial-resource initialization under the existing loss-suspension contract; verify actual Safari and import the tested follow-up in the site. 6. Reproduce the main Linux Slice gesture failures, synchronize helpers with deferred drawing and the virtual grid, verify repeated and full Linux/macOS suites, and publish a feature CI repair without another site import. + +## Approach + +Confine repair to browser drawables and scheduling: defer observer drawing, bound the Slice bitmap to the viewport, and latch context loss until restoration. + +## Out of scope + +Native camera mathematics, editing semantics, parser/storage and trust policies remain unchanged, as stated in context.md. + +## Steps + +Follow the six existing steps above. Retain exact edit/Undo assertions and runtime bytes while synchronizing gesture-test readiness with deferred drawing and the virtual grid. + +## Risks + +As recorded in context.md, null/already-lost contexts before event delivery and resource creation without null guards can break startup. Stale or empty rendered metadata can misdirect synthetic gestures; testing.md records the readiness checks and evidence limits. + +## Constraints consulted + +This normalization uses the existing plan.md, context.md and testing.md. It preserves the existing loss-suspension/restoration contract and adds no camera, loader, format or trust-policy scope, test result or review claim. diff --git a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/state.json b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/state.json index 4d285043..65d5820d 100644 --- a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/state.json +++ b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/state.json @@ -11,7 +11,7 @@ "canonical_applied": true, "base_commit": "fc4944c134a8f351f3073bf4febcdebb87df2f81", "created_at": 1791664278, - "updated_at": 1791674266, + "updated_at": 1792339989, "affected_specs": [ "ThreeMDViewer" ], diff --git a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification-attempts.json b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification-attempts.json index fd3ba315..d59023a6 100644 --- a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification-attempts.json +++ b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification-attempts.json @@ -144,6 +144,78 @@ "requirement_ids": [ "REQ-ThreeMDViewer-004" ] + }, + { + "timestamp": 1792337694, + "commit": "03bddee2198a9ed95db69ba8605eee3f180184bd", + "contract_digest": "5a8d804bd8dfc53eff71bfb3730f3f1d2d69f478fa86df116d24bb2ba58727d4", + "execution_digest": "e5e872baf0ee8b5c31792cd0828ed0e9c33b2b5618b8133b83528676ffdf74b3", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [ + "REQ-ThreeMDViewer-004" + ] + }, + { + "timestamp": 1792337699, + "commit": "744b58fb17ec1b89df88f2c8f43ffe16cd17e3e1", + "contract_digest": "5a8d804bd8dfc53eff71bfb3730f3f1d2d69f478fa86df116d24bb2ba58727d4", + "execution_digest": "e5e872baf0ee8b5c31792cd0828ed0e9c33b2b5618b8133b83528676ffdf74b3", + "workspace_digest": "647da28121b9f545f3246bdecbb1abebb6d92a801f682f57ba85f1f0d7c8ef24", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [ + "REQ-ThreeMDViewer-004" + ] + }, + { + "timestamp": 1792339985, + "commit": "e782f09a7c1cd0dbd9491953586b6929e1f08e12", + "contract_digest": "5a8d804bd8dfc53eff71bfb3730f3f1d2d69f478fa86df116d24bb2ba58727d4", + "execution_digest": "e5e872baf0ee8b5c31792cd0828ed0e9c33b2b5618b8133b83528676ffdf74b3", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [ + "REQ-ThreeMDViewer-004" + ] + }, + { + "timestamp": 1792339988, + "commit": "fb27fb90e882f66be7f83b828513d8b8a2789d1e", + "contract_digest": "5a8d804bd8dfc53eff71bfb3730f3f1d2d69f478fa86df116d24bb2ba58727d4", + "execution_digest": "e5e872baf0ee8b5c31792cd0828ed0e9c33b2b5618b8133b83528676ffdf74b3", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", + "passed": true, + "commands": [ + { + "command": "specsync check --spec ThreeMDViewer --strict", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [ + "REQ-ThreeMDViewer-004" + ] } ] } diff --git a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification.json b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification.json index 85ae46a8..71a73b3a 100644 --- a/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification.json +++ b/.specsync/changes/stabilize-viewer-canvas-resizing-and-webgl-context-recovery/verification.json @@ -1,9 +1,9 @@ { - "timestamp": 1791674262, - "commit": "a8d44c98cbfb37b698dcfedd79f8e7ce4a8f1bbb", + "timestamp": 1792339988, + "commit": "fb27fb90e882f66be7f83b828513d8b8a2789d1e", "contract_digest": "5a8d804bd8dfc53eff71bfb3730f3f1d2d69f478fa86df116d24bb2ba58727d4", - "execution_digest": "a9d0e55787398e55789e1c53fd78961550829b38e5a77d178af3b25bc23b5b81", - "workspace_digest": "06c7afec6136b3c7293a454a7f565fc12ffb22f5edf7a57481d3b1518ce3806d", + "execution_digest": "e5e872baf0ee8b5c31792cd0828ed0e9c33b2b5618b8133b83528676ffdf74b3", + "workspace_digest": "19f8e1584958db8fb185453046a406c84fe8af2f79f59aa05fcb8a0d37173bf6", "passed": true, "commands": [ { diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md b/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md deleted file mode 100644 index d4a3ddcd..00000000 --- a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -change: update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100 -artifact: plan ---- - -# Plan - -1. Capture hi for the docs and for 100% implementation coverage before adding specs. -2. Keep root SpecSync on the format libraries. Add the Linux shim to RookSculpture. -3. Teach `.atlasignore` the same exclusions for the nested app, docs, tests, manifests, and interchange harnesses. -4. Add `apps/sculpt/pathmap/SculptSources.spec.md` so Atlas at the repository root can see `apps/sculpt/Sources`. The Rook specs stay the behavioral contract and keep paths relative to `apps/sculpt`. -5. Update the public docs and regenerate `docs.3md` and `web/docs.3md`. Widen the pages workflow so a coverage-input change republishes the badge. -6. The corrected definition is recorded as `user:0xLeif` on 2026-10-08. The root canonical spec is ThreeMD only. The Linux shim stays on the app spec as `REQ-RookSculpture-046`. Closing approval is still open. Do not self-approve it. diff --git a/.specsync/retired/2026-10-18-superseded-docs/README.md b/.specsync/retired/2026-10-18-superseded-docs/README.md new file mode 100644 index 00000000..1d7aad04 --- /dev/null +++ b/.specsync/retired/2026-10-18-superseded-docs/README.md @@ -0,0 +1,5 @@ +# Superseded documentation history + +This directory preserves the old ThreeMD 2.1 documentation workspace as an unchanged historical snapshot. Its original state is verifying. It is not an accepted, finalized or authenticated completed archive. Every original file, including approval history, is retained byte-for-byte; manifest.json records the source commit and SHA-256 values. + +Canonical release documentation superseded its 2.1.0 wording with 2.2.0 and 2.2.1 facts in commits fe20a18 and 4e718b4. The obsolete delta must not be reapplied to current specifications. The retirement operation has separate lifecycle records. All other unresolved work remains active. diff --git a/.specsync/retired/2026-10-18-superseded-docs/manifest.json b/.specsync/retired/2026-10-18-superseded-docs/manifest.json new file mode 100644 index 00000000..4792c998 --- /dev/null +++ b/.specsync/retired/2026-10-18-superseded-docs/manifest.json @@ -0,0 +1,23 @@ +{ + "schema_version": 1, + "classification": "retired historical snapshot, not accepted or finalized", + "source_commit": "48ff62f8e44f4b6cced9e35c984085764659c282", + "source_path": ".specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100", + "snapshot_directory": "update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100", + "original_state": "verifying", + "file_count": 12, + "files_sha256": { + "state.json": "39fd4a45197a4fd9a669da2162a26e1d98ed927cfd60e507cca9f6480afad6a3", + "verification-attempts.json": "70e0ab334593273cb638533863594c43c46e89f26a87fc46b8504318b600e39d", + "verification.json": "69fffd5759f32e9be4e9809134efb46c6182b3aa02ca92b418a81d40425eb777", + "tasks.md": "700763447fe42cda6f481d6e787a0baeffdfda6d483e45b5b547bfc0909ef391", + "testing.md": "f37efa695019b83775ac13dc7ee7c8102637d77725bc54225cb33450a98a91ed", + "plan.md": "dbf769b2a03c7a52943ea51c044fd38965f8ccbfa11cda5169023cc9d309b2ec", + "context.md": "730535d0f92e4750c4aae6456672bb67212d74820b7a002d526649bf6f065ade", + "requirements.md": "1d1974a3a41246ef54c03a08d5a5d85c04808e9755452863d23a2c123f3dd535", + "approvals.json": "6d9c110c2a73f752b1fcc7e831e6cfdffaba11bfdff651eabbe650b5eb79ab21", + "change.md": "f98b38d15cba4f2dd784c93b348787889aa6e2301fabbae255bf637e498e5bc6", + "docs.md": "a21196dc9b52024401d32caa907e0824f6af39d6399bd0071f48ff97634af5a1", + "deltas/ThreeMD.md": "d61c5cabbff5d5151bc668496e43f708565c384982576c8316524a5fb125666b" + } +} diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/approvals.json b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/approvals.json similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/approvals.json rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/approvals.json diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/change.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/change.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/change.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/change.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/context.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/context.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/context.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/context.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/deltas/ThreeMD.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/deltas/ThreeMD.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/deltas/ThreeMD.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/deltas/ThreeMD.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/docs.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/docs.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/docs.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/docs.md diff --git a/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md new file mode 100644 index 00000000..d04b137e --- /dev/null +++ b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/plan.md @@ -0,0 +1,33 @@ +--- +change: update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100 +artifact: plan +--- + +# Plan + +1. Capture hi for the docs and for 100% implementation coverage before adding specs. +2. Keep root SpecSync on the format libraries. Add the Linux shim to RookSculpture. +3. Teach `.atlasignore` the same exclusions for the nested app, docs, tests, manifests, and interchange harnesses. +4. Add `apps/sculpt/pathmap/SculptSources.spec.md` so Atlas at the repository root can see `apps/sculpt/Sources`. The Rook specs stay the behavioral contract and keep paths relative to `apps/sculpt`. +5. Update the public docs and regenerate `docs.3md` and `web/docs.3md`. Widen the pages workflow so a coverage-input change republishes the badge. +6. The corrected definition is recorded as `user:0xLeif` on 2026-10-08. The root canonical spec is ThreeMD only. The Linux shim stays on the app spec as `REQ-RookSculpture-046`. Closing approval is still open. Do not self-approve it. + +## Approach + +Keep root SpecSync on the format libraries and retain Sculpt's Rook behavioral contracts; correct Atlas root-relative coverage and public documentation according to the existing numbered plan. + +## Out of scope + +Do not treat compact .3mdb as an upstream ThreeMD standard, rewrite historical adoption receipts, or edit the separate in-progress Godot work, as context.md requires. + +## Steps + +Follow the six existing steps above, preserving the ThreeMD-only root canonical scope and the app shim's REQ-RookSculpture-046 contract. Closing approval remains open. + +## Risks + +Atlas matches paths from the repository root while Rook specs use apps/sculpt-relative paths. Root-anchored exclusions can accidentally count nested tests, docs, manifests and interchange harnesses; context.md records that mismatch. + +## Constraints consulted + +This normalization uses the existing plan.md and context.md, including the recorded hi/docs.md and hi/coverage.md intent references and the separate apps/sculpt/hi/ scope. It adds no approval or completion claim. diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/requirements.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/requirements.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/requirements.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/requirements.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/state.json b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/state.json similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/state.json rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/state.json diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/tasks.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/tasks.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/tasks.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/tasks.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/testing.md b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/testing.md similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/testing.md rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/testing.md diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification-attempts.json b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification-attempts.json similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification-attempts.json rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification-attempts.json diff --git a/.specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification.json b/.specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification.json similarity index 100% rename from .specsync/changes/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification.json rename to .specsync/retired/2026-10-18-superseded-docs/update-the-public-docs-for-the-2-1-monorepo-and-make-repository-spec-coverage-100/verification.json diff --git a/.specsync/sdd.json b/.specsync/sdd.json index 796067cb..a21260d1 100644 --- a/.specsync/sdd.json +++ b/.specsync/sdd.json @@ -55,7 +55,10 @@ ".claude/", ".codex/", ".cursor/", - ".gemini/" + ".gemini/", + "gdscript/", + "apps/sculpt/", + ".agents/" ], "ignored_paths": [], "verification_commands": [ diff --git a/AGENTS.md b/AGENTS.md index 5ddb8cf7..805a4590 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -114,7 +114,7 @@ config in `.swift-format` enforces the mechanical parts. ## Binary and composition scope -Use SpecSync 6.0.0 for all lifecycle writers. The local binary is +Use SpecSync 6.1.1 for all lifecycle writers. The local binary is `/Users/leif/.cargo/bin/specsync`; the development Fledge pin is 1.7.2 at `/opt/homebrew/bin/fledge`. CI verifies the release checksums and pins Trust 1.2.2 to `bccd89c111d47778c97c5064fb62ab51695e04ea`. PATH can resolve @@ -212,3 +212,25 @@ This repository uses one trust gate. Every session must use it and must not bypa - Keep generated trust configuration and this managed block in place. + +## Required SpecSync 6.1.1 delivery lifecycle + +Use an explicitly verified 6.1.1 executable; the historical local path above is not proof +of its version. Root required meaningful coverage includes gdscript/, apps/sculpt/ and +.agents/. Preserve Sculpt's nested specs, hashes and separate Linux/macOS lanes. + +Inspect the completed native definition with the human and record only actual approval +before implementation. Changed definitions need renewed approval. Run product tests, +canonical validation, scoped change verification and strict active-workspace audit separately. +An operations check with no spec in scope does not establish product testing. + +Run `bash scripts/test-specsync-lifecycle.sh` and `bash scripts/check-specsync-lifecycle.sh`. +The non-mutating gate requires the exact engine and coverage policy, native strict active +audit, and no unfinished active workspace. Inherited failures remain owner recovery work; +do not exempt them or rewrite historical approval. + +For agent work, a human must inspect the current implementation, package, canonical delta +and evidence before `change review`. Definition approval is not implementation acceptance. +Finalize/archive on that same PR after actual verification and review; do not merge first. +Read prior lessons and record observed problems, smallest corrections, evidence, applicability +limits and open questions in native context/lesson bundles. Preserve prior archives. diff --git a/scripts/check-specsync-lifecycle.sh b/scripts/check-specsync-lifecycle.sh new file mode 100755 index 00000000..a1d3f61b --- /dev/null +++ b/scripts/check-specsync-lifecycle.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Run from the repository root. This gate never writes lifecycle state. +set -euo pipefail +engine="${SPECSYNC_BIN:-specsync}" +test "$("$engine" --version)" = 'specsync 6.1.1' || { echo 'lifecycle: expected specsync 6.1.1' >&2; exit 1; } +python3 - <<'PY' +import json +from pathlib import Path +p=json.loads(Path('.specsync/sdd.json').read_text()) +for flag in ('enabled','require_change_for_meaningful_files'): + if p.get(flag) is not True: raise SystemExit('lifecycle: required policy disabled: '+flag) +required=('src/ tests/ site/ .github/ Cargo.toml Cargo.lock action.yml package.json bun.lock package-lock.json pnpm-lock.yaml yarn.lock Package.swift Package.resolved go.mod go.sum pyproject.toml uv.lock requirements.txt .specsync/sdd.json .specsync/config.toml .specsync/config.json .specsync/version Sources/ Tests/ Examples/ conformance/ editor/ element/ js/ rust/ uitests/ web/ scripts/ README.md ROADMAP.md CHANGELOG.md SECURITY.md CONTRIBUTING.md docs/ docs.3md specs/ SPEC.md fledge.toml .trust.toml .augur.toml .attest.json AGENTS.md CLAUDE.md .claude/ .codex/ .cursor/ .gemini/ gdscript/ apps/sculpt/ .agents/').split() +missing=set(required)-set(p.get('meaningful_paths',[])) +if missing: raise SystemExit('lifecycle: missing meaningful paths: '+', '.join(sorted(missing))) +# This repository has no exclusions. Refuse masking future coverage with one. +if p.get('ignored_paths') != []: raise SystemExit('lifecycle: unexpected ignored paths') +PY +"$engine" change audit --strict +python3 - <<'PY' +from pathlib import Path +active=Path('.specsync/changes') +remaining=sorted(str(p) for p in active.iterdir() if p.is_dir()) if active.exists() else [] +if remaining: raise SystemExit('lifecycle: unfinished active workspaces: '+', '.join(remaining)) +print('lifecycle: exact engine, required coverage, strict audit and archive gate passed') +PY diff --git a/scripts/test-specsync-lifecycle.sh b/scripts/test-specsync-lifecycle.sh new file mode 100755 index 00000000..87c68bae --- /dev/null +++ b/scripts/test-specsync-lifecycle.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Disposable fixture checks use the real engine, without inventing review/approval. +set -euo pipefail +engine="${SPECSYNC_BIN:-specsync}" +engine="$(command -v "$engine")" +repo="$(pwd)" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +export SPECSYNC_BIN="$engine" +git -C "$tmp" init -q +"$engine" init --root "$tmp" >/dev/null +cp .specsync/sdd.json "$tmp/.specsync/sdd.json" +git -C "$tmp" add . +git -C "$tmp" -c user.name=fixture -c user.email=fixture@example.invalid commit -qm 'Empty fixture, no human approval claims' +cd "$tmp" +check() { bash "$repo/scripts/check-specsync-lifecycle.sh" >"$tmp/result" 2>&1; } +fail_for() { + if check; then echo "unexpected pass: $1" >&2; exit 1; fi + grep -F "$1" "$tmp/result" >/dev/null || { cat "$tmp/result"; exit 1; } + echo "PASS negative: $1" +} +check || { cat "$tmp/result"; exit 1; } +echo 'PASS clean fixture (no active change or fabricated acceptance)' +cat > "$tmp/wrong-engine" <<'STUB' +#!/bin/sh +printf 'specsync 6.1.0\n' +STUB +chmod +x "$tmp/wrong-engine" +SPECSYNC_BIN="$tmp/wrong-engine" fail_for 'expected specsync 6.1.1' +for flag in enabled require_change_for_meaningful_files; do + cp "$repo/.specsync/sdd.json" .specsync/sdd.json + python3 - "$flag" <<'PY' +import json,sys +p='.specsync/sdd.json'; d=json.load(open(p)); d[sys.argv[1]]=False; open(p,'w').write(json.dumps(d)) +PY + fail_for "required policy disabled: $flag" +done +for path in Sources/ Tests/ AGENTS.md gdscript/ apps/sculpt/ .agents/; do + cp "$repo/.specsync/sdd.json" .specsync/sdd.json + python3 - "$path" <<'PY' +import json,sys +p='.specsync/sdd.json'; d=json.load(open(p)); d['meaningful_paths'].remove(sys.argv[1]); open(p,'w').write(json.dumps(d)) +PY + fail_for "missing meaningful paths: $path" +done +for ignored in Sources/uncovered.swift Tests/hidden/; do + cp "$repo/.specsync/sdd.json" .specsync/sdd.json + python3 - "$ignored" <<'INNER' +import json,sys +p='.specsync/sdd.json'; d=json.load(open(p)); d['ignored_paths']=[sys.argv[1]]; open(p,'w').write(json.dumps(d)) +INNER + fail_for 'unexpected ignored paths' +done +cp "$repo/.specsync/sdd.json" .specsync/sdd.json +mkdir -p .specsync/changes/unfinished +# An empty orphan directory must also be rejected even when native audit ignores it. +fail_for 'unfinished active workspaces:' +rmdir .specsync/changes/unfinished +mkdir -p .specsync/archive +printf 'Fixture history placeholder; no approval or review asserted.\n' > .specsync/archive/fixture-note.md +check || { cat "$tmp/result"; exit 1; } +echo 'PASS archive-only fixture; authentic review/finalize remain manual' + +# Native audit must independently reject an unapproved meaningful change. +"$engine" change new "Fixture unfinished operation" --kind operations --path scripts/ --no-spec-change --rationale "Disposable negative control" --json > "$tmp/new.json" +mkdir -p scripts +printf '# fixture source change\n' > scripts/fixture.sh +if check; then echo 'unexpected native audit pass' >&2; exit 1; fi +grep -E 'incomplete|not covered|unapproved' "$tmp/result" >/dev/null || { cat "$tmp/result"; exit 1; } +echo 'PASS native audit: unapproved meaningful change'