From be7d3a55a6d29da91f82c1e8a3853fa014dd1bc5 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 2 Oct 2026 14:39:16 +0800 Subject: [PATCH] docs(spec): archive target-openspec-cli-114-line Merge the four delta specs into the main specs (CLI discovery rotation with six new 1.14 requirement contracts, the OpenSpecUI 14 agent delivery inventory rename, the status advisory warnings surface, and the generator staleness baseline) and move the change to the archive after the 14.0.0 release and owner walkthrough acceptance. The vite-plus pre-commit hook has no staged config in this checkout (no vite.config.ts); repository format:check was run explicitly and passes (13 files). --- .../.openspec.yaml | 0 .../loop/checkpoints.md | 0 .../loop/implementation.md | 15 +- .../loop/intake.md | 0 .../loop/research-plan.md | 1 - .../specs/openspec-cli-integration/spec.md | 1 - .../specs/opsx-config-center/spec.md | 0 .../specs/opsx-workflow-ui/spec.md | 0 .../specs/projection-contract-truth/spec.md | 0 .../specs/openspec-cli-integration/spec.md | 185 +++++++++++++++--- openspec/specs/opsx-config-center/spec.md | 54 +++-- openspec/specs/opsx-workflow-ui/spec.md | 48 +++-- .../specs/projection-contract-truth/spec.md | 6 +- 13 files changed, 243 insertions(+), 67 deletions(-) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/.openspec.yaml (100%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/loop/checkpoints.md (100%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/loop/implementation.md (97%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/loop/intake.md (100%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/loop/research-plan.md (99%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/specs/openspec-cli-integration/spec.md (99%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/specs/opsx-config-center/spec.md (100%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/specs/opsx-workflow-ui/spec.md (100%) rename openspec/changes/{target-openspec-cli-114-line => archive/2026-10-02-target-openspec-cli-114-line}/specs/projection-contract-truth/spec.md (100%) diff --git a/openspec/changes/target-openspec-cli-114-line/.openspec.yaml b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/.openspec.yaml similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/.openspec.yaml rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/.openspec.yaml diff --git a/openspec/changes/target-openspec-cli-114-line/loop/checkpoints.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/checkpoints.md similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/loop/checkpoints.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/checkpoints.md diff --git a/openspec/changes/target-openspec-cli-114-line/loop/implementation.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/implementation.md similarity index 97% rename from openspec/changes/target-openspec-cli-114-line/loop/implementation.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/implementation.md index abb0434d..1a112333 100644 --- a/openspec/changes/target-openspec-cli-114-line/loop/implementation.md +++ b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/implementation.md @@ -145,13 +145,14 @@ the fix (verbatim single + batch payloads). Green: core focused run — Production: `agent-delivery-registry.ts` (series `'1.14'`, +10 entries: amp, atomcode, codestudio, dsh, easycode, gigacode, grok, veai, warp, IBM Bob; gsd shares the `.agents` root with amp), `tool-init-state.ts` -+ tests. Integrator decision on the slice agent's escalation: `SHARED_AGENTS_SKILLS_OWNER_CANDIDATES` -widens from three to five values `['codex','zed','agents','amp','gsd']` — upstream 1.14 arbitration pool -counts five `.agents` skills writers and the reviewed spec delta already says so; antigravity stays -commands-only (adapter-backed). The slice agent had conservatively kept the three-valued tuple and -deferred; the registry + its test were updated together in the integrator pass. Green: -`vitest run src/agent-delivery-registry.test.ts src/tool-init-state.test.ts src/agent-command-content.test.ts` -→ 93 passed. + +- tests. Integrator decision on the slice agent's escalation: `SHARED_AGENTS_SKILLS_OWNER_CANDIDATES` + widens from three to five values `['codex','zed','agents','amp','gsd']` — upstream 1.14 arbitration pool + counts five `.agents` skills writers and the reviewed spec delta already says so; antigravity stays + commands-only (adapter-backed). The slice agent had conservatively kept the three-valued tuple and + deferred; the registry + its test were updated together in the integrator pass. Green: + `vitest run src/agent-delivery-registry.test.ts src/tool-init-state.test.ts src/agent-command-content.test.ts` + → 93 passed. ### Batch A integrator pass (2026-10-02) diff --git a/openspec/changes/target-openspec-cli-114-line/loop/intake.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/intake.md similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/loop/intake.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/intake.md diff --git a/openspec/changes/target-openspec-cli-114-line/loop/research-plan.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/research-plan.md similarity index 99% rename from openspec/changes/target-openspec-cli-114-line/loop/research-plan.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/research-plan.md index 040a83c8..90541394 100644 --- a/openspec/changes/target-openspec-cli-114-line/loop/research-plan.md +++ b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/loop/research-plan.md @@ -136,7 +136,6 @@ the gate still admits 1.13 (record the ordering honestly — boundary lands afte Green: joint v14 gate (13 files) + boundary + upstream-contract-regression; core typecheck; lockfile diff + shim check. Mutation red: bins-map → wrong alias fails `--version` identity. - ## Slice 6 — Cross-package alignment (four owner groups) 1. Web compat copy: `cli-health-gate`(+test), settings diagnostics, `use-cli-runner` — ranges/labels derive diff --git a/openspec/changes/target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md similarity index 99% rename from openspec/changes/target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md index 1663c9a0..688a42da 100644 --- a/openspec/changes/target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md +++ b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/openspec-cli-integration/spec.md @@ -219,7 +219,6 @@ locations; they are CLI-owned evidence for which file and line each checkbox liv - **THEN** parsing SHALL succeed with both members absent - **AND** no default location SHALL be fabricated - ### Requirement: Spec Requirement Names Contract The `show --type spec --json` contract SHALL carry the OpenSpec 1.14 optional `name` member on each diff --git a/openspec/changes/target-openspec-cli-114-line/specs/opsx-config-center/spec.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/opsx-config-center/spec.md similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/specs/opsx-config-center/spec.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/opsx-config-center/spec.md diff --git a/openspec/changes/target-openspec-cli-114-line/specs/opsx-workflow-ui/spec.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/opsx-workflow-ui/spec.md similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/specs/opsx-workflow-ui/spec.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/opsx-workflow-ui/spec.md diff --git a/openspec/changes/target-openspec-cli-114-line/specs/projection-contract-truth/spec.md b/openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/projection-contract-truth/spec.md similarity index 100% rename from openspec/changes/target-openspec-cli-114-line/specs/projection-contract-truth/spec.md rename to openspec/changes/archive/2026-10-02-target-openspec-cli-114-line/specs/projection-contract-truth/spec.md diff --git a/openspec/specs/openspec-cli-integration/spec.md b/openspec/specs/openspec-cli-integration/spec.md index ed7e0cf6..39b9d312 100644 --- a/openspec/specs/openspec-cli-integration/spec.md +++ b/openspec/specs/openspec-cli-integration/spec.md @@ -21,97 +21,100 @@ Define how OpenSpecUI integrates with the OpenSpec CLI to execute OPSX workflows ### Requirement: CLI Discovery and Version Enforcement -OpenSpecUI 13 SHALL classify stable OpenSpec CLI `>=1.13.0 <1.14.0` as supported, current, and recommended. -OpenSpec CLI `<1.13.0` (including the whole 1.12.x window that OpenSpecUI 12 admitted, and every older line), -every prerelease, `>=1.14.0`, and an unparseable version SHALL be incompatible and blocked by default. +OpenSpecUI 14 SHALL classify stable OpenSpec CLI `>=1.14.0 <1.15.0` as supported, current, and recommended. +OpenSpec CLI `<1.14.0` (including the whole 1.13.x window that OpenSpecUI 13 admitted, and every older line), +every prerelease, `>=1.15.0`, and an unparseable version SHALL be incompatible and blocked by default. + +Scenario titles below are inherited scenario identity: an "Accept ..." title names that line's historical +admission era, while every scenario body states the OpenSpecUI 14 classification (retired and blocked). +Bodies are the normative text; a separate spec-hygiene change may verify a title-rename mechanism later. When an incompatible executable is available, the mismatch Dialog MAY expose `Skip version check`; that action SHALL bypass only the current Web page runtime's admission gate and SHALL NOT change the detected version, compatibility evidence, CLI payloads, downstream errors, or product support claim. #### Scenario: Accept the current 1.13 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.13.x executable +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.13.x executable that OpenSpecUI 13 admitted - **WHEN** admission is evaluated -- **THEN** normal interactions SHALL be admitted -- **AND** compatibility evidence SHALL identify the CLI as current and recommended +- **THEN** the retired 1.13 line SHALL be blocked by default +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges `>=1.14.0 <1.15.0` #### Scenario: Block unsupported version forms -- **GIVEN** OpenSpecUI 13 detects CLI 1.13.0-rc.1, 1.14.0, or an unparseable version +- **GIVEN** OpenSpecUI 14 detects CLI 1.14.0-rc.1, 1.15.0, or an unparseable version - **WHEN** admission is evaluated - **THEN** the mismatch Dialog SHALL block normal interactions - **AND** the mismatch evidence SHALL name the accepted and recommended ranges #### Scenario: Retire the v12 admission window -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.12.x executable that OpenSpecUI 12 admitted +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.12.x executable that OpenSpecUI 12 admitted - **WHEN** admission is evaluated - **THEN** the retired line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted range `>=1.13.0 <1.14.0` and recommended range - `>=1.13.0 <1.14.0` +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the current 1.12 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.12.x executable that OpenSpecUI 12 admitted as its +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.12.x executable that OpenSpecUI 12 admitted as its current and recommended line - **WHEN** admission is evaluated - **THEN** the retired 1.12 line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Retire the v11 admission window -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.10.x or 1.11.x executable that OpenSpecUI 11 +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.10.x or 1.11.x executable that OpenSpecUI 11 admitted - **WHEN** admission is evaluated - **THEN** the retired line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the supported non-current 1.10 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.10.x executable that OpenSpecUI 11 admitted as its +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.10.x executable that OpenSpecUI 11 admitted as its supported non-current line - **WHEN** admission is evaluated - **THEN** the retired 1.10 line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the current 1.11 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.11.x executable that OpenSpecUI 11 admitted as its +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.11.x executable that OpenSpecUI 11 admitted as its current and recommended line - **WHEN** admission is evaluated - **THEN** the retired 1.11 line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the supported non-current 1.8 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.8.x executable that OpenSpecUI 9 admitted as its +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.8.x executable that OpenSpecUI 9 admitted as its supported non-current line - **WHEN** admission is evaluated - **THEN** the retired 1.8 line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the current 1.9 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.9.x executable that OpenSpecUI 9 admitted as its +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.9.x executable that OpenSpecUI 9 admitted as its current and recommended line - **WHEN** admission is evaluated - **THEN** the retired 1.9 line SHALL be blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Accept the adapted 1.7 line -- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.7.x executable that OpenSpecUI 7 admitted as its adapted - line +- **GIVEN** OpenSpecUI 14 detects a stable OpenSpec CLI 1.7.x executable that OpenSpecUI 7 admitted as its + adapted line - **WHEN** admission is evaluated - **THEN** the retired 1.7 line SHALL remain blocked by default -- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges +- **AND** the mismatch evidence SHALL name the v14 accepted and recommended ranges #### Scenario: Block OpenSpec CLI 1.6 -- **GIVEN** OpenSpecUI 13 detects an available OpenSpec CLI 1.6.x executable +- **GIVEN** OpenSpecUI 14 detects an available OpenSpec CLI 1.6.x executable - **WHEN** admission is evaluated - **THEN** the mismatch Dialog SHALL block normal interactions -- **AND** SHALL identify the v13 accepted and recommended ranges +- **AND** SHALL identify the v14 accepted and recommended ranges #### Scenario: Bypass only the current page runtime @@ -639,7 +642,7 @@ OpenSpecUI SHALL NOT offer change-detail navigation, task summaries, or workflow #### Scenario: Decode a namespaced directory entry - **GIVEN** `list --json` returns an entry `{name: "area", completedTasks: 0, totalTasks: 0, lastModified: - "...", status: "no-tasks", nested: ["area/alpha", "area/beta"]}` and a top-level warning with +"...", status: "no-tasks", nested: ["area/alpha", "area/beta"]}` and a top-level warning with `code: "nested_change_directory"` - **WHEN** the change list is decoded - **THEN** the entry and warning SHALL decode as typed facts with the exact `nested` names @@ -820,3 +823,129 @@ SHALL document brace/extglob task tracking as a boundary rather than a silent di - **THEN** the path SHALL be recognized as a glob pattern and watched at its directory granularity - **AND** literal paths without wildcard, brace-expansion, or extglob syntax SHALL keep single-file watching + +### Requirement: Version Report Command Contract + +OpenSpecUI 14 SHALL decode `openspec version --json` as a typed CLI contract: a `schemaVersion: 1` envelope +carrying the installed `version` and `install` facts (location, packageManager, scope), with the `update` +member conditionally present only under `--check`. The executor SHALL NOT run the registry probe unless an +explicit consumer requests it, and no UI surface is obligated by this contract. + +#### Scenario: Decode the no-check envelope + +- **GIVEN** `openspec version --json` runs without `--check` on an admitted 1.14 CLI +- **WHEN** the output crosses the typed contract +- **THEN** `schemaVersion`, `version`, and `install` SHALL be preserved as typed facts +- **AND** no `update` member SHALL be synthesized + +#### Scenario: Update metadata stays optional and probe-gated + +- **GIVEN** a consumer has not requested an update check +- **WHEN** the version contract is invoked +- **THEN** no network probe SHALL be issued by OpenSpecUI +- **AND** a payload carrying `update` SHALL parse with the member preserved verbatim + +### Requirement: Change List Inventory Contract + +The CLI change-list contract SHALL carry the OpenSpec 1.14 per-entry optional `archived` member (present +only under `--archived`/`--all`). The 1.13.1 `nested` and top-level `warnings` members stay covered by the +existing Change List Nested Directory contract; this line only migrates their fixtures. OpenSpecUI's Archive +list SHALL keep its reactive-filesystem projection owner; the CLI members are typed evidence, not a mandated +data-source switch. + +#### Scenario: Archived entries decode with the archived flag + +- **GIVEN** `openspec list --archived --json` returns an archived entry +- **WHEN** the output crosses the typed contract +- **THEN** the entry SHALL preserve `archived: true` and the shared per-entry shape + +#### Scenario: Nested findings are objective evidence + +- **GIVEN** a plain `list --json` reports a namespace folder +- **WHEN** the output crosses the typed contract +- **THEN** the entry's `nested` member and the top-level `warnings` finding SHALL be preserved verbatim +- **AND** absent members SHALL stay absent (no synthesized empty states) + +#### Scenario: Default list output remains compatible + +- **GIVEN** `openspec list --json` without the new flags on a change set with no namespace folders +- **WHEN** the output crosses the typed contract +- **THEN** parsing SHALL succeed with neither `archived` nor `warnings` fabricated + +### Requirement: Status Advisory Warnings Contract + +OpenSpecUI 14 SHALL decode the OpenSpec 1.14 `status --json` top-level `warnings` member (unrecognized +`.openspec.yaml` key advisories) as optional typed evidence preserved verbatim with CLI ownership. Warnings +SHALL NOT gate Root readiness, action availability, or Apply state. + +#### Scenario: Unrecognized metadata keys are preserved verbatim + +- **GIVEN** a change's `.openspec.yaml` carries an unrecognized key and `status --json` reports it +- **WHEN** the payload crosses the typed contract +- **THEN** the warning string SHALL be preserved exactly as the CLI provided it +- **AND** OpenSpecUI SHALL NOT synthesize or reword a warning when the member is absent + +#### Scenario: Warnings never gate actions + +- **GIVEN** a status payload carries advisory warnings +- **WHEN** action availability is evaluated +- **THEN** gating SHALL remain unchanged by the warnings + +### Requirement: Apply Task Source Locations Contract + +The Apply Instructions task contract SHALL carry the OpenSpec 1.14 `sourcePath` (absolute) and `line` +(1-based) members as optional typed facts on each task. OpenSpecUI SHALL NOT re-derive or second-guess the +locations; they are CLI-owned evidence for which file and line each checkbox lives at. + +#### Scenario: Located tasks decode with both members + +- **GIVEN** `instructions apply --json` on an admitted 1.14 CLI returns located tasks +- **WHEN** the payload crosses the typed contract and its projection chain +- **THEN** each task SHALL preserve `sourcePath` and `line` with CLI provenance + +#### Scenario: Older-shape tasks still parse + +- **GIVEN** an Apply Instructions payload whose tasks lack the location members +- **WHEN** the payload crosses the typed contract +- **THEN** parsing SHALL succeed with both members absent +- **AND** no default location SHALL be fabricated + +### Requirement: Spec Requirement Names Contract + +The `show --type spec --json` contract SHALL carry the OpenSpec 1.14 optional `name` member on each +requirement and each scenario, preserved by CLI value through the spec-document contract and the Spec +Catalog projection chain. This surface is distinct from `show --json --diff`. + +#### Scenario: Names decode on a 1.14 spec document + +- **GIVEN** an admitted 1.14 CLI returns a spec document whose requirements and scenarios carry names +- **WHEN** the payload crosses the typed contract and its projection chain +- **THEN** requirement names and scenario names SHALL be preserved by CLI value with provenance + +#### Scenario: Older documents still parse without names + +- **GIVEN** a spec document whose members lack `name` +- **WHEN** the payload crosses the typed contract +- **THEN** parsing SHALL succeed with the members absent +- **AND** a non-string `name` SHALL be rejected rather than silently accepted as typed evidence + +### Requirement: Status Action Context Edit Roots Contract + +Store-backed `status --json` `actionContext.allowedEditRoots` SHALL be preserved exactly as the CLI reports +it in both branches: with a declaring project on the current path, the array lists the implementation root +and the project root with the declaring-repo constraint; without one, the array lists the project root with +the constraint telling the agent to ask which repository to edit. OpenSpecUI SHALL NOT branch production +logic on the root count. + +#### Scenario: Declaring project joins the edit roots + +- **GIVEN** a store-backed change whose store is declared by a project on the current path +- **WHEN** status is projected +- **THEN** `allowedEditRoots` SHALL preserve the CLI-reported roots and constraint verbatim + +#### Scenario: No declaring project asks the user + +- **GIVEN** a store-backed change with no declaring project on the current path +- **WHEN** status is projected +- **THEN** `allowedEditRoots` SHALL preserve the CLI-reported single root and the ask-the-user constraint +- **AND** OpenSpecUI SHALL NOT synthesize an implementation root diff --git a/openspec/specs/opsx-config-center/spec.md b/openspec/specs/opsx-config-center/spec.md index 49e39fbf..90fcbecf 100644 --- a/openspec/specs/opsx-config-center/spec.md +++ b/openspec/specs/opsx-config-center/spec.md @@ -345,10 +345,10 @@ mutation, or completion. - **AND** browsers without `corner-shape: bevel` SHALL receive square hole corners - **AND** the painted veil SHALL use distinct theme-aware colors that remain perceptible on both light and dark surfaces -### Requirement: OpenSpecUI 13 Agent Delivery Inventory +### Requirement: OpenSpecUI 14 Agent Delivery Inventory `/config/agents` SHALL select the official Agent inventory and command capabilities from the admitted running -OpenSpec CLI version, not from one fixed 1.13 registry. It SHALL project supported 1.13 physical delivery +OpenSpec CLI version, not from one fixed 1.14 registry. It SHALL project supported 1.14 physical delivery metadata: current/legacy project roots, user-global skill roots, detection paths, command paths, delivery capability, generated version, migration/cleanup evidence, and IDE restart requirements where that CLI declares them. A tool absent from the admitted CLI line SHALL be unavailable for that line, not falsely stale or @@ -364,7 +364,7 @@ present. #### Scenario: Zed is a 1.10-line skills-only target -- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x - **WHEN** the Agent inventory is listed - **THEN** Zed Agent SHALL appear as a skills-only project target writing `.agents/skills` - **AND** it SHALL NOT be offered with a command surface @@ -374,7 +374,7 @@ present. #### Scenario: Antigravity migration is objective -- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x and OpenSpec-managed Antigravity artifacts exist at +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x and OpenSpec-managed Antigravity artifacts exist at `.agent/` - **WHEN** Agent delivery is projected - **THEN** OpenSpecUI SHALL report `.agents/skills` and `.agents/workflows` as current roots with `.agent` as @@ -384,7 +384,7 @@ present. #### Scenario: Antigravity remains on its 1.10 root - **GIVEN** OpenSpec-managed Antigravity artifacts were generated by a 1.10-era CLI at `.agent/` and the - admitted OpenSpec CLI is stable 1.13.x + admitted OpenSpec CLI is stable 1.14.x - **WHEN** Antigravity delivery is projected - **THEN** `.agent` SHALL appear only as legacy/migration evidence toward the `.agents` roots - **AND** the retired 1.10-era current-root interpretation SHALL NOT be projected for that session @@ -399,7 +399,8 @@ present. #### Scenario: Shared skills-root ownership is three-valued -- **GIVEN** the `.agents/skills` tree may be owned by `codex`, `zed`, or the vendor-neutral `agents` target +- **GIVEN** the `.agents/skills` tree may be owned by `codex`, `zed`, the vendor-neutral `agents` target, or + since OpenSpec 1.14 by `amp` or `gsd` - **WHEN** Agent delivery is projected - **THEN** the owner evidence SHALL come from the official marker and arbitration rules - **AND** Antigravity SHALL be identified as commands-only at that root, never the skills writer @@ -407,7 +408,7 @@ present. #### Scenario: SourceCraft Code Assistant enters at 1.12 -- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x - **WHEN** the Agent inventory is listed - **THEN** SourceCraft Code Assistant SHALL appear with skills at `.codeassistant/skills` and commands at `.codeassistant/commands/opsx-.md` @@ -418,20 +419,41 @@ present. - **WHEN** the Agent inventory is listed - **THEN** SourceCraft Code Assistant SHALL be unavailable for that line +#### Scenario: Ten 1.14 tools enter the official inventory + +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x +- **WHEN** the Agent inventory is listed +- **THEN** Amp (`.agents` root, detection `.amp`), GSD (`.agents` root, detection `.gsd`), AtomCode + (`.atomcode`), Code Studio (`.codestudio`, IDE restart), DeepSeek Harness (skills-only `.dsh`), EasyCode + (`.easycode`, TOML commands), GigaCode (`.gigacode`), Grok Build (skills-only `.grok`), Veai (skills-only + `.veai`), and Warp (`.warp`, detection `WARP.md`) SHALL appear with their official capability and path + metadata +- **AND** the skills-only entries SHALL NOT be offered with a command surface +- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x or older +- **WHEN** the Agent inventory is listed +- **THEN** no 1.14-line target SHALL appear as stale, missing, or generated for that session + +#### Scenario: Registry labels and command paths rotate as physical facts + +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x +- **WHEN** the Agent inventory is listed +- **THEN** IBM Bob SHALL appear by its full product name +- **AND** Kilo Code commands SHALL project `.kilo/command/` with the retired `.kilocode/workflows/` path as + legacy/cleanup evidence only + #### Scenario: Select the version-specific official inventory -- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x - **WHEN** the Agent inventory is listed - **THEN** Zed Agent SHALL appear with the shared `.agents/skills` root and Antigravity SHALL declare the `.agents` roots with `.agent` as legacy - **AND** SourceCraft Code Assistant, Command Code, MiniMax Code, Rovo Dev CLI, and Shared `.agents` skills - SHALL retain their individual capability and path metadata (including MiniMax's user-global root and - Command Code's `.commandcode/commands/opsx-.md` surface) + SHALL retain their individual capability and path metadata - **AND** an IDE restart requirement SHALL remain visible only where that line declares it for a tool it actually writes for -- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x or older +- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x or older - **WHEN** the Agent inventory is listed -- **THEN** no 1.13-line target SHALL appear as stale, missing, or generated for that session +- **THEN** no 1.14-line target SHALL appear as stale, missing, or generated for that session #### Scenario: One missing adapter does not invalidate unrelated command evidence @@ -442,14 +464,14 @@ present. #### Scenario: Retained physical state keeps the selected inventory -- **GIVEN** an admitted 1.13 Agent projection observes a filesystem or Environment replacement +- **GIVEN** an admitted 1.14 Agent projection observes a filesystem or Environment replacement - **WHEN** its retained physical states recompute -- **THEN** the replacement SHALL use the same 1.13-selected registry as the initial projection +- **THEN** the replacement SHALL use the same 1.14-selected registry as the initial projection - **AND** SHALL NOT reintroduce retired-line targets from a process-global registry #### Scenario: Direct Init uses the projected registry -- **GIVEN** an admitted 1.13 Agent projection includes a tool +- **GIVEN** an admitted 1.14 Agent projection includes a tool - **WHEN** a caller directly requests Init with a tool outside the projected registry in an explicit `tools` array - **THEN** the Router SHALL reject the tool before a CLI process starts @@ -458,7 +480,7 @@ present. #### Scenario: Update repairs drifted command files through the CLI -- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x and a generated command file was hand-edited or +- **GIVEN** the admitted OpenSpec CLI is stable 1.14.x and a generated command file was hand-edited or truncated while its skill files carry the current `generatedBy` - **WHEN** the Agent Update action runs the official `openspec update` - **THEN** the CLI SHALL detect and repair the drifted command file diff --git a/openspec/specs/opsx-workflow-ui/spec.md b/openspec/specs/opsx-workflow-ui/spec.md index bd18742e..6f013575 100644 --- a/openspec/specs/opsx-workflow-ui/spec.md +++ b/openspec/specs/opsx-workflow-ui/spec.md @@ -492,30 +492,29 @@ CLI progress denominator or phase. ### Requirement: Pinned Workflow Fixtures Are Executable -OpenSpecUI SHALL prove each accepted workflow contract against the pinned OpenSpec 1.13.1 executable, and -SHALL prove capability-boundary rejections with the retained pinned OpenSpec 1.12.0 executable. A -hand-authored payload alone SHALL NOT establish support for the CLI line, and a fixture for a retired line -SHALL NOT be reused as positive evidence for the current line. +OpenSpecUI SHALL prove each accepted workflow contract against the pinned OpenSpec 1.14.0 executable, and +SHALL prove capability-boundary rejections with a retained pinned retired executable. A hand-authored +payload alone SHALL NOT establish support for the CLI line, and a fixture for a retired line SHALL NOT be +reused as positive evidence for the current line. #### Scenario: Both supported lines preserve planning/task separation - **GIVEN** the pinned workflow fixture matrix runs against the retained pair of pinned executables - (OpenSpec 1.13.1 as the positive line and OpenSpec 1.12.0 as the boundary line) + (OpenSpec 1.14.0 as the positive line and a retired executable as the boundary line) - **WHEN** it evaluates Status and Apply Instructions on the positive line -- **THEN** the 1.13.1 executable SHALL satisfy the typed planning-completion and progress contracts +- **THEN** the 1.14.0 executable SHALL satisfy the typed planning-completion and progress contracts - **AND** the boundary executable SHALL NOT be consulted for positive contract evidence #### Scenario: Capability boundaries are executable facts -- **GIVEN** the retained pinned 1.12.0 executable is evaluated against the OpenSpecUI 13 admission gate +- **GIVEN** the retained pinned retired executable is evaluated against the OpenSpecUI 14 admission gate - **WHEN** the fixture matrix asserts the capability boundary -- **THEN** the 1.12.0 line SHALL be recorded as below-admitted for the v13 window -- **AND** the 1.13.1 executable SHALL prove the accepted payloads (including the findings report, the - Apply Instructions readiness guidance fields, and the change-list nested-directory warnings) +- **THEN** the retired line SHALL be recorded as below-admitted for the v14 window +- **AND** the 1.14.0 executable SHALL prove the accepted payloads #### Scenario: Positive identity is proven, not assumed -- **GIVEN** the pinned bins map names an installed npm alias for the 1.13.1 executable +- **GIVEN** the pinned bins map names an installed npm alias for the 1.14.0 executable - **WHEN** the fixture matrix runs - **THEN** the executable's `--version` identity SHALL be asserted before contract assertions - **AND** a bins-map entry pointing at another alias SHALL fail that identity assertion @@ -735,3 +734,30 @@ as before. Board/Kanban cards SHALL NOT change (lane placement already carries t - **AND** the tooltip SHALL state the CLI reports no tasks without asserting whether tracking is configured - **AND** rows with any other status or nonzero totals SHALL render exactly as before + +### Requirement: Status Advisory Warnings Surface + +Change Detail SHALL present CLI-owned status advisory warnings (unrecognized `.openspec.yaml` keys) when an +admitted OpenSpec CLI session provides them, following the Apply-readiness summary-row law: ONE +always-visible summary row naming the warning count and owning CLI command, with the verbatim warning text +one explicit expansion away on the same direct plane. Absent members SHALL degrade silently, and warnings +SHALL NOT gate any action. + +#### Scenario: Warning summary renders on the direct plane + +- **GIVEN** an admitted 1.14 session provides status warnings +- **WHEN** Change Detail renders its status region +- **THEN** one summary row SHALL be visible naming the warning count with CLI attribution without hover +- **AND** the verbatim warning text SHALL become visible with one explicit expansion + +#### Scenario: Degrade without warnings + +- **GIVEN** a status payload omits the warnings member +- **WHEN** Change Detail renders +- **THEN** no warning surface SHALL be synthesized + +#### Scenario: Warnings never gate actions + +- **GIVEN** status warnings are rendered +- **WHEN** Apply or Archive availability is evaluated +- **THEN** action gating SHALL remain unchanged diff --git a/openspec/specs/projection-contract-truth/spec.md b/openspec/specs/projection-contract-truth/spec.md index 0ef15fb9..a58a1ed0 100644 --- a/openspec/specs/projection-contract-truth/spec.md +++ b/openspec/specs/projection-contract-truth/spec.md @@ -147,7 +147,7 @@ findings, or global Agent filesystem observations. ### Requirement: Generator Evidence Follows the Admitted CLI Agent generator evidence SHALL resolve the running OpenSpec CLI's live version and SHALL compare on-disk -generated state against the admitted 1.13 expectations. The pinned generator constant SHALL state the 1.13.0 +generated state against the admitted 1.14 expectations. The pinned generator constant SHALL state the 1.14.0 baseline and SHALL never be substituted for a live resolution. Generated-by comparisons SHALL be series-aware: artifacts generated by the admitted series SHALL NOT be flagged stale merely for differing from the pinned baseline constant, while below-admitted or unparseable generators SHALL be stale. @@ -161,7 +161,7 @@ baseline constant, while below-admitted or unparseable generators SHALL be stale #### Scenario: Stale generated state is line-aware -- **GIVEN** on-disk Agent artifacts carry `generatedBy: 1.12.0` while the admitted CLI line is 1.13 +- **GIVEN** on-disk Agent artifacts carry `generatedBy: 1.13.2` while the admitted CLI line is 1.14 - **WHEN** generator evidence is computed - **THEN** the artifacts SHALL be reported as stale with the generator version as evidence -- **AND** artifacts generated by an admitted 1.13.x generator SHALL NOT be reported stale +- **AND** artifacts generated by an admitted 1.14.x generator SHALL NOT be reported stale