Skip to content

openspec: refresh and archive add-claude-docker-openspec - #44

Open
dtump wants to merge 1 commit into
mainfrom
archive/add-claude-docker-openspec
Open

openspec: refresh and archive add-claude-docker-openspec#44
dtump wants to merge 1 commit into
mainfrom
archive/add-claude-docker-openspec

Conversation

@dtump

@dtump dtump commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes #37.

Summary

add-claude-docker-openspec was functionally implemented but its spec and tasks still described a pinning mechanism that no longer exists. Refreshes the artifacts against reality, verifies what had never been verified, and archives at 15/15 tasks.

No Dockerfile / run.sh / README.md changes — artifact refresh, archive and spec sync only.

The drift

  • tasks.md 1.1/1.3 and the spec's "Pin is greppable in Dockerfile" scenario assumed an ARG OPENSPEC_VERSION, retired when automate-version-pins (openspec: archive automate-version-pins, sync main specs #41) moved every automated pin to pins/<tool>.env. grep '^ARG OPENSPEC_VERSION' Dockerfile returned nothing.
  • Nine artifact paths were prefixed with a claude-docker/ subdirectory that does not exist.

Retargeted the spec at pins/openspec.env, and rewrote the ARG decision in design.md as superseded rather than deleting it — it was the right call under the convention in force when this landed.

Trimmed to what this capability actually owns

4 requirements → 2, dropping what other capabilities had since taken ownership of:

Dropped Now owned by
Install uses the existing npm pattern package-managers § npm-backed installs preserve --ignore-scripts — its scenario already names openspec as sharing the single npm install -g invocation
Builds on amd64 and arm64 Pure JS in the shared npm layer; no arch-specific behaviour of its own to assert
Pin is greppable in Dockerfile version-pin-refresh § Build consumes fragments without hand-authored pins — already requires no literal version for any automated tool

Following the precedent that capability sets for the manual pins (Go's reminder contract living in go-toolchain), openspec-cli binds openspec to those mechanisms instead of restating them, so each rule keeps exactly one owner.

Archive-blocking fixes

  • Missing ## Purpose in the delta. Without it, openspec archive creates the main spec with a TBD ... Update Purpose after archive placeholder.
  • Added the blank lines after ## Purpose / ## Requirements that the archive tool's rebuild omits — the same cosmetic artifact fixed in openspec: archive 4 completed changes, sync main specs #36.

Verification actually run

Tasks 2.x / 3.2 / 3.3 had never been run against a container, so nobody had confirmed openspec --version inside a built image. Done now, in an aarch64 container built from main on Apple Silicon:

  • openspec --version1.10.0, matching OPENSPEC_VERSION in pins/openspec.env, with claude (2.1.241) and pnpm (11.23.0) also matching their pins — so the image under test is a recent build from these fragments.
  • openspec --help exits 0 with the expected subcommands.
  • /usr/bin/openspec is an image symlink into /usr/lib/node_modules with no openspec entry in mountinfo — nothing resolves to a host mount.

That makes arm64 the better-verified arch here, not the gap the old task 2.4 claimed. The residual is the inverse: amd64 proves the install layer via CI's docker-build job (a failed npm install fails the build, so a broken openspec install cannot merge) but never invokes the CLI. Accepted for a pure-JS package with no native artifact, and recorded in design.md rather than left as an open task.

Task 3.2's docker inspect diff was replaced by a static proof: grep -i openspec run.sh entrypoint.sh returns nothing, so no code path can add a mount or env forward under any flag combination — stronger than sampling one container.

Test plan

schedule-pin-refresh is deliberately left open (its tasks 4.5-4.7 are operator actions).

Closes #37.

The change was functionally implemented but its spec and tasks still
described a pinning mechanism that no longer exists: tasks 1.1/1.3 and the
"Pin is greppable in Dockerfile" scenario assumed an ARG OPENSPEC_VERSION,
which automate-version-pins retired when it moved every automated pin to
pins/<tool>.env. `grep '^ARG OPENSPEC_VERSION' Dockerfile` returned nothing.
Retargeted the spec at pins/openspec.env and rewrote the ARG decision in
design.md as superseded rather than deleting it — it was the right call under
the convention in force when this landed.

Trimmed openspec-cli from 4 requirements to 2, dropping what other
capabilities had since taken ownership of:

- "Install uses the existing npm pattern" -> package-managers § npm-backed
  installs preserve --ignore-scripts, whose scenario already names openspec
  as sharing the single npm install -g invocation.
- "Builds on amd64 and arm64" -> openspec is pure JS in the shared npm
  layer, with no arch-specific behaviour of its own to assert.
- "Pin is greppable in Dockerfile" -> version-pin-refresh § Build consumes
  fragments without hand-authored pins already requires that the Dockerfile
  carry no literal version for any automated tool. Following the precedent
  that capability sets for the manual pins, openspec-cli binds openspec to
  the mechanism instead of restating it, so each rule keeps one owner.

Also added the ## Purpose section the delta was missing. Without it, archive
creates the main spec with a "TBD ... Update Purpose after archive"
placeholder, and added the blank lines after ## Purpose / ## Requirements
that the archive tool's rebuild omits — the same cosmetic artifact fixed in
#36. Nine artifact paths were prefixed with a claude-docker/ subdirectory
that does not exist; made them repo-root-relative.

Verification: tasks 2.x, 3.2 and 3.3 had never been run against a container,
so nobody had confirmed openspec --version inside a built image. Done now in
an aarch64 container built from main on Apple Silicon: openspec --version
reports 1.10.0, matching OPENSPEC_VERSION in pins/openspec.env, with claude
(2.1.241) and pnpm (11.23.0) also matching their pins; --help exits 0; and
/usr/bin/openspec is an image symlink into /usr/lib/node_modules with no
openspec entry in mountinfo, so nothing resolves to a host mount. That makes
arm64 the better-verified arch here, not the gap the old task claimed — the
residual is that amd64 proves the install layer via CI's docker-build job but
never invokes the CLI. Accepted for a pure-JS package and recorded in
design.md.

Task 3.2's docker inspect diff was replaced by a static proof: grep -i
openspec run.sh entrypoint.sh returns nothing, so no code path can add a
mount or env forward under any flag combination — stronger than sampling one
container.

Archived at 15/15 tasks. No Dockerfile/run.sh/README.md changes — artifact
refresh, archive and spec sync only.
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.

openspec: refresh add-claude-docker-openspec spec/tasks (stale after automate-version-pins)

1 participant