openspec: refresh and archive add-claude-docker-openspec - #44
Open
dtump wants to merge 1 commit into
Open
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #37.
Summary
add-claude-docker-openspecwas 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.mdchanges — artifact refresh, archive and spec sync only.The drift
tasks.md1.1/1.3 and the spec's "Pin is greppable in Dockerfile" scenario assumed anARG OPENSPEC_VERSION, retired whenautomate-version-pins(openspec: archive automate-version-pins, sync main specs #41) moved every automated pin topins/<tool>.env.grep '^ARG OPENSPEC_VERSION' Dockerfilereturned nothing.claude-docker/subdirectory that does not exist.Retargeted the spec at
pins/openspec.env, and rewrote the ARG decision indesign.mdas 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:
package-managers§ npm-backed installs preserve--ignore-scripts— its scenario already namesopenspecas sharing the singlenpm install -ginvocationversion-pin-refresh§ Build consumes fragments without hand-authored pins — already requires no literal version for any automated toolFollowing the precedent that capability sets for the manual pins (Go's reminder contract living in
go-toolchain),openspec-clibindsopenspecto those mechanisms instead of restating them, so each rule keeps exactly one owner.Archive-blocking fixes
## Purposein the delta. Without it,openspec archivecreates the main spec with aTBD ... Update Purpose after archiveplaceholder.## Purpose/## Requirementsthat 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 --versioninside a built image. Done now, in anaarch64container built frommainon Apple Silicon:openspec --version→1.10.0, matchingOPENSPEC_VERSIONinpins/openspec.env, withclaude(2.1.241) andpnpm(11.23.0) also matching their pins — so the image under test is a recent build from these fragments.openspec --helpexits 0 with the expected subcommands./usr/bin/openspecis an image symlink into/usr/lib/node_moduleswith noopenspecentry inmountinfo— 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-buildjob (a failednpm installfails 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 indesign.mdrather than left as an open task.Task 3.2's
docker inspectdiff was replaced by a static proof:grep -i openspec run.sh entrypoint.shreturns nothing, so no code path can add a mount or env forward under any flag combination — stronger than sampling one container.Test plan
openspec validate add-claude-docker-openspec --strictpasses pre-archiveopenspec archivesync was a clean create (openspec-cli: create, +2 requirements, no existing spec touched) — none of the delta-drift that blocked openspec: archive 4 completed changes, sync main specs #36/openspec: archive automate-version-pins, sync main specs #41openspec validate --all --changes— 12/12 post-archiveopenspec validate --specs --strict— 11/11 main specsgit statusclean, onlyopenspec/files touched — no shellcheck/hadolint/docker-build/smoke run, since no code changedschedule-pin-refreshis deliberately left open (its tasks 4.5-4.7 are operator actions).