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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Original request (2026-09-12): "Openspec 1.13.0 释放了,你更新一下,
- [x] `references/openspec-1.13.0-report.md` written with executed CLI evidence.
- [x] Change artifacts (specs deltas + loop docs) written.
- [x] Codex change review: Round-B 8.7/10 APPROVE WITH NON-BLOCKING NOTES (Round-A 5.8 REVISE folded).
- [ ] CP0 committed.
- [x] CP0 committed (51b0515e; the review checkbox above it closed at Round-B).

## CP1 — Window and contract (implementation)

Expand Down Expand Up @@ -64,6 +64,9 @@ Original request (2026-09-12): "Openspec 1.13.0 释放了,你更新一下,
- [x] Required PR checks green (third CI round after the prepare-script fix and the web
change-diff-evidence rotation): CI Scope, Changeset Gate, Fast Gate, Windows Portability Gate,
Browser Gate + both shards — all pass on run 34651529010.
- [ ] Owner acceptance: final end-to-end browser walkthrough (Owner-only).
- [ ] Archive change, merge, release — Owner decision.
- [ ] GitHub issues surveyed and handled with objective links after delivery.
- [x] Owner acceptance passed (2026-09-12): functional walkthrough on the isolated instance
accepted; two UX defects filed and delivered in #284, re-verified in browser.
- [x] Owner decision (2026-09-12): release authorized; 13.0.0 published (npm latest, tags,
GitHub Release verified; one release rerun recovered the main package); archive delivered in
this change.
- [x] GitHub issue #282 answered with objective links and closed after #283 merged.
104 changes: 83 additions & 21 deletions openspec/specs/openspec-cli-integration/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,82 +21,97 @@ Define how OpenSpecUI integrates with the OpenSpec CLI to execute OPSX workflows

### Requirement: CLI Discovery and Version Enforcement

OpenSpecUI 12 SHALL classify stable OpenSpec CLI `>=1.12.0 <1.13.0` as supported, current, and recommended.
OpenSpec CLI `<1.12.0` (including the whole 1.10.x/1.11.x window that OpenSpecUI 11 admitted, and every older
line), every prerelease, `>=1.13.0`, and an unparseable version SHALL be incompatible and blocked by default.
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.
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.12 line
#### Scenario: Accept the current 1.13 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.12.x executable
- **GIVEN** OpenSpecUI 13 detects a stable OpenSpec CLI 1.13.x executable
- **WHEN** admission is evaluated
- **THEN** normal interactions SHALL be admitted
- **AND** compatibility evidence SHALL identify the CLI as current and recommended

#### Scenario: Block unsupported version forms

- **GIVEN** OpenSpecUI 12 detects CLI 1.12.0-rc.1, 1.13.0, or an unparseable version
- **GIVEN** OpenSpecUI 13 detects CLI 1.13.0-rc.1, 1.14.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
- **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`

#### 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
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

#### Scenario: Retire the v11 admission window

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.10.x or 1.11.x executable that OpenSpecUI 11
- **GIVEN** OpenSpecUI 13 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 v12 accepted range `>=1.12.0 <1.13.0` and recommended range
`>=1.12.0 <1.13.0`
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Accept the supported non-current 1.10 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.10.x executable that OpenSpecUI 11 admitted as its
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Accept the current 1.11 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.11.x executable that OpenSpecUI 11 admitted as its
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Accept the supported non-current 1.8 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.8.x executable that OpenSpecUI 9 admitted as its
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Accept the current 1.9 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.9.x executable that OpenSpecUI 9 admitted as its
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Accept the adapted 1.7 line

- **GIVEN** OpenSpecUI 12 detects a stable OpenSpec CLI 1.7.x executable that OpenSpecUI 7 admitted as its adapted
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** the mismatch evidence SHALL name the v13 accepted and recommended ranges

#### Scenario: Block OpenSpec CLI 1.6

- **GIVEN** OpenSpecUI 12 detects an available OpenSpec CLI 1.6.x executable
- **GIVEN** OpenSpecUI 13 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 v12 accepted and recommended ranges
- **AND** SHALL identify the v13 accepted and recommended ranges

#### Scenario: Bypass only the current page runtime

Expand Down Expand Up @@ -563,3 +578,50 @@ strict-mode escalation SHALL remain CLI-owned.
path
- **THEN** OpenSpecUI SHALL render exactly the CLI-reported findings
- **AND** SHALL NOT locally run or simulate an archive merge to add or remove findings

### Requirement: Apply Readiness Guidance Contract

OpenSpecUI 13 SHALL decode the OpenSpec 1.13 Apply Instructions optional `missingPrerequisites` and `warnings`
members as typed contract facts. `missingPrerequisites` SHALL be preserved as the CLI-owned build-order
closure of incomplete artifacts and MAY be non-empty while `state` is `ready` (conditional artifacts apply
does not gate on); it SHALL NOT redefine the apply state, the actionable `tasks` list, or CLI progress
denominators. `warnings` SHALL be preserved verbatim as CLI-owned advisory evidence and SHALL only be
projected from a parsed payload; OpenSpecUI SHALL NOT synthesize, deduplicate, or reword a warning.

#### Scenario: Blocked change preserves the prerequisite chain

- **GIVEN** Apply Instructions on an admitted 1.13 CLI report `state: blocked` with
`missingArtifacts: [tasks]` and `missingPrerequisites: [proposal, specs, design, tasks]`
- **WHEN** the payload crosses the typed contract
- **THEN** both arrays SHALL be preserved with CLI provenance
- **AND** the blocked state and first-hop `missingArtifacts` SHALL remain the gating facts

#### Scenario: Ready change may carry unread prerequisites

- **GIVEN** Apply Instructions report `state: ready` with `missingPrerequisites: [specs, design]`
- **WHEN** the payload is projected
- **THEN** the ready state SHALL remain unchanged
- **AND** the unread chain SHALL remain available as evidence
- **AND** it SHALL NOT relabel the change as blocked or planning-incomplete

#### Scenario: No-delta-specs warning is preserved verbatim

- **GIVEN** Apply Instructions report `warnings` containing the upstream no-delta-specs advisory
- **WHEN** the payload is projected
- **THEN** the warning text SHALL be preserved exactly as the CLI provided it
- **AND** OpenSpecUI SHALL NOT fabricate a warning when the field is absent

#### Scenario: Absent fields on older-shape payloads

- **GIVEN** an Apply Instructions payload omits `missingPrerequisites` or `warnings` (empty upstream values)
- **WHEN** the payload crosses the typed contract
- **THEN** parsing SHALL succeed with both facts absent
- **AND** no default empty-array presentation SHALL be invented as CLI evidence

#### Scenario: Remedies text is not pattern-matched

- **GIVEN** an admitted 1.13 CLI apply instruction prose names `openspec instructions <artifact>` remedies
instead of the `openspec-continue-change` skill
- **WHEN** OpenSpecUI captures instruction prose in an evidence surface
- **THEN** it SHALL treat the text as opaque CLI evidence
- **AND** SHALL NOT pattern-match the retired 1.12 skill reference
32 changes: 20 additions & 12 deletions openspec/specs/opsx-config-center/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 12 Agent Delivery Inventory
### Requirement: OpenSpecUI 13 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.12 registry. It SHALL project supported 1.12 physical delivery
OpenSpec CLI version, not from one fixed 1.13 registry. It SHALL project supported 1.13 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
Expand All @@ -364,7 +364,7 @@ present.

#### Scenario: Zed is a 1.10-line skills-only target

- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x
- **GIVEN** the admitted OpenSpec CLI is stable 1.13.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
Expand All @@ -374,7 +374,7 @@ present.

#### Scenario: Antigravity migration is objective

- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x and OpenSpec-managed Antigravity artifacts exist at
- **GIVEN** the admitted OpenSpec CLI is stable 1.13.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
Expand All @@ -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.12.x
admitted OpenSpec CLI is stable 1.13.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
Expand All @@ -407,7 +407,7 @@ present.

#### Scenario: SourceCraft Code Assistant enters at 1.12

- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x
- **GIVEN** the admitted OpenSpec CLI is stable 1.13.x
- **WHEN** the Agent inventory is listed
- **THEN** SourceCraft Code Assistant SHALL appear with skills at `.codeassistant/skills` and commands at
`.codeassistant/commands/opsx-<id>.md`
Expand All @@ -420,7 +420,7 @@ present.

#### Scenario: Select the version-specific official inventory

- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x
- **GIVEN** the admitted OpenSpec CLI is stable 1.13.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
Expand All @@ -429,9 +429,9 @@ present.
Command Code's `.commandcode/commands/opsx-<id>.md` surface)
- **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.11.x or older
- **GIVEN** the admitted OpenSpec CLI is stable 1.12.x or older
- **WHEN** the Agent inventory is listed
- **THEN** no 1.12-line target SHALL appear as stale, missing, or generated for that session
- **THEN** no 1.13-line target SHALL appear as stale, missing, or generated for that session

#### Scenario: One missing adapter does not invalidate unrelated command evidence

Expand All @@ -442,20 +442,28 @@ present.

#### Scenario: Retained physical state keeps the selected inventory

- **GIVEN** an admitted 1.12 Agent projection observes a filesystem or Environment replacement
- **GIVEN** an admitted 1.13 Agent projection observes a filesystem or Environment replacement
- **WHEN** its retained physical states recompute
- **THEN** the replacement SHALL use the same 1.12-selected registry as the initial projection
- **THEN** the replacement SHALL use the same 1.13-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.12 Agent projection includes a tool
- **GIVEN** an admitted 1.13 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
- **AND** SHALL preserve the CLI-owned literal `tools: 'all'` without rewriting it from the projected
inventory

#### 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
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
- **AND** OpenSpecUI SHALL present the CLI's own repair evidence without introducing parallel drift detection

### Requirement: Config Retains Sole Agent Mutation Authority

Agent policy and delivery mutations SHALL remain owned by `/config/agents`. Other pages MAY link to this owner or
Expand Down
Loading
Loading