Skip to content

feat: rotate to OpenSpec CLI 1.13.1 — nested-change projection, task-reading parity, in-window patch rotation - #287

Merged
Gaubee merged 25 commits into
mainfrom
target/openspec-cli-1131-patch
Sep 17, 2026
Merged

Gaubee merged 25 commits into
mainfrom
target/openspec-cli-1131-patch

Conversation

@Gaubee

@Gaubee Gaubee commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Rotate the OpenSpecUI 13 line to the OpenSpec CLI 1.13.1 patch release inside the unchanged >=1.13.0 <1.14.0 window (no new command/flag/capability upstream — compat gate, Agent registry series, and staleness baseline do not move), and project the two 1.13.1 contract additions:

  • Change-list namespace directories (list --json per-entry nested + top-level hygiene warnings, both absent-when-empty): the kernel opsx-change-list projection keeps entries/value actionable-only and derives a single structural namespaces set (entry names bearing nested; warnings are display evidence, message text never parsed). Every change-row builder subtracts it at its own id source — Changes projection, Dashboard inputs (Kanban inherits), search documents, Store content decode, and the change.listWithMeta/change.subscribe transports. CLI-list loss degrades to today's local-row behavior; row visibility never becomes CLI-gated. The Changes page renders the warnings as a direct-plane amber region (verbatim upstream message, unknown-code fallback).
  • Task-line reading parity: the local parser and toggleMarkdownTask mirror the CLI 1.13.1 pattern verbatim (all CommonMark + ordered markers, indented sub-tasks, single-token markers incl. padded [ x]=done, whitespace-only boxes, link-continuation guard, CRLF tolerance, canonical [x]/[ ] write-back) so Kanban phases, CLI task counts, and divergence evidence stay aligned. CLI progress authority is untouched.

Plus: pin rotation across five points (npm alias + lockfile, fixture identity constants, reference EXPECTED_COMMIT, two PINNED_OPENSPEC_COMMIT guards, one local PINNED_BINS key caught by test:ci and registered into a typecheck lane per the typed-test-evidence law), executable pinned-fixture evidence (nested/warnings, task-count parity, validate ERROR finding), generic-diagnostics decode regression for the new error codes, references/openspec-1.13.1-report.md, governance records, and the release changeset.

OpenSpec change: openspec/changes/update-openspec-cli-1131/ (validated clean; checkpoints carry per-slice red/green evidence). Reviews: Round-A (substitute, 6.5 REVISE — 3 blockers folded), Codex Round-B (6.5 REVISE — 4 conditions resolved: structural namespace set, degradation semantics, per-consumer interfaces/tests, P5 output-shape correction), Codex Round-C (7.9/10 — Round-B conditions confirmed closed at implementation level; sole blocker B1'' was a stale status line in the change log, fixed; codex pre-stated 8.5/10 post-fix).

Local gates (CI-equivalent)

Gate Result
pnpm format:check ✅
pnpm lint:ci ✅ (0 errors, 6 pre-existing warnings)
pnpm typecheck ✅ (all lanes, 0 errors)
pnpm test:ci 778/780 passed + 13 skipped; both failures triaged below
pnpm test:browser:ci ✅ (all suites green)

Failure triage (test:ci)

  1. packages/core/src/opsx-kernel-schemas-root.fixtures.test.ts — real, fixed in this PR: a local PINNED_BINS map kept the '1.13.0' key, so PINNED_BINS['1.13.1'] was undefined and writeConfig crashed on undefined.trim(). The file sat in no typecheck lane (main tsconfig excludes **/*.test.ts), hiding the Record<PinnedOpenspecV13Version,...> guard — now registered in tsconfig.workflow-contract-tests.json; test re-run green.
  2. packages/core/src/reactive-fs/path-realpath.test.ts — environmental, not this change: deterministic under this shell's TMPDIR=/var/... prefix (macOS realpath canonicalizes to /private/var); passes with TMPDIR=$(echo $TMPDIR | sed 's|^/var/|/private/var/|'); git diff main..HEAD -- packages/core/src/reactive-fs/ is empty; Linux CI has no such prefix. Accepted by Codex Round-C (N3'') with this evidence.

Also environmental: the first test:browser:ci run failed only because Playwright chromium_headless_shell-1208 was missing locally; installed via pnpm exec playwright install chromium, re-run green.

Boundary

Final end-to-end browser walkthrough and release acceptance remain Owner-only (2026-07-20 law): suggested cases — a repository with a namespace folder under openspec/changes/ shows the amber warning region on the Changes page with no row/no detail route (Changes/Dashboard/Kanban/search/Store content), and a +/1.-marker tasks file toggles and counts consistently with the CLI.

Release: .changeset/openspec-1131-patch-rotation.md (fixed-group patch). Manager flow after merge confirmation: pnpm changeversion → checks → merge → release automation.

…uctural namespace set (N2), collision red cases (N3), decode evidence (N5)
… semantics, P5 output-shape correction, honest verdict record
…ies and hygiene warnings (Slice 2)

- contract: nested entries + typed warnings (code open-string) on the change list
- kernel: entries/value stay actionable-only; namespaces derived once, structurally
- consumers: Changes/Dashboard/Search/Store content subtract the namespace set;
  change.listWithMeta/subscribe transports filter through the same projection fact
- web: direct-plane hygiene warning region on the Changes page
- boundary fixture: v13 version-identity args follow the rotated 1.13.1 pin
…ics-decode contracts with executable fixtures (Slice 4)
…ister its typecheck lane

The stale local PINNED_BINS key made PINNED_BINS[version] undefined and crashed
writeConfig on undefined.trim() under test:ci. The file sat in no typecheck lane
(main tsconfig excludes **/*.test.ts), so the Record<PinnedOpenspecV13Version,...>
guard was invisible; it is now in tsconfig.workflow-contract-tests.json.
…e cold-start version pin to 1.13.1

CI Round 1 triage: the search wiring forced the opsx-change-list CLI Work on every
collection (getCurrent), putting a cold CLI computation on the first emission path —
Windows timing collapsed the subscriber choreography. Search now peeks the projection
(ready/current data only, never requesting the Work) so it adds no CLI computation and
degrades to full local indexing. The cold-start integration assertions hardcoded the
1.13.0 version (sixth rotation point, only reachable in CI's broader file set).
… mocks

CI round 2 triage: the continuity/navigation suites mock the whole @/lib/use-opsx
module and lacked the new useOpsxChangeListHygieneWarningsSubscription export the
route now imports. Full web unit project verified locally (192 files, 1210 tests).
@Gaubee
Gaubee merged commit 17d585a into main Sep 17, 2026
7 checks passed
@Gaubee
Gaubee deleted the target/openspec-cli-1131-patch branch September 18, 2026 12:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant