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