Task — engineering-spec@1

"Publish npm release shipping bin.cs for the rename"

doneTASK-IMP-135
module improvement · class product · priority p0 · created 2026-07-23 · shipped null
depends on TASK-IMP-130 · blocks TASK-IMP-133

TASK-IMP-135: Publish npm release shipping bin.cs for the rename

Summary

Cut and publish the first @cyberskill/cyberos npm release whose bin field is cs (not cyberos), via this repo's existing OIDC release.yml pipeline — closing the plan-level gap TASK-IMP-133's audit ISS-005 named, so the Homebrew tap follow-up has a real registry artifact to pin.

Problem

TASK-IMP-130's acceptance criteria prove a scratch build's package.json declares bin.cs. They do not require that build to reach the npm registry. TASK-IMP-133's entire premise — bump Formula/cyberos-cli.rb's url/sha256 and assert bin/"cs" — and TASK-IMP-134's manual release-time checklist both assume a published release with bin.cs already exists. As of 2026-07-23 the live registry still serves @cyberskill/cyberos@1.0.9 with bin.cyberos, while the rename code lives only on the open PR branch. TASK-IMP-133's own audit (ISS-005) and Edge cases section named this as an unowned gap in the five-task batch; leaving it unowned means IMP-133 stays permanently blocked with no task whose done criterion is "the registry artifact exists."

Proposed Solution

Own the operational cut through the audited release path already documented in docs/deploy/RELEASE.md and implemented by .github/workflows/release.yml:

  1. Land the rename code (TASK-IMP-130 and siblings) on main via the normal PR merge — never a direct push to main.
  2. Let version.yml / scripts/cyberos-version.mjs produce the next platform VERSION (projected 1.1.0 minor from the rename feat commits), or apply an explicit Release-As: / --set if the operator chooses a different SemVer; promote the [Unreleased] Breaking rename entry into that dated CHANGELOG section.
  3. Tag v$(cat VERSION) at the bump commit and push the tag so release.yml fires natively (TASK-IMP-071).
  4. Wait for the npm job (OIDC trusted publishing, id-token: write, no NPM_TOKEN) to publish @cyberskill/cyberos@<version>.
  5. Verify live via npm view that the published version's bin contains cs and does not contain cyberos.

That live registry fact is the sole publish evidence this task accepts — a local npm pack / scratch tarball does not satisfy it.

Alternatives Considered

Success Metrics

Scope

In scope: merging the rename PR to main (or confirming it is already merged), the VERSION/CHANGELOG cut for the release that carries bin.cs, pushing the v* tag that fires release.yml, and verifying the live npm package's bin field.

Out of scope / Non-Goals

Dependencies

Depends on TASK-IMP-130 — the code that emits bin.cs must exist in the tree that the release tag points at. Soft coordination with TASK-IMP-131/132/134: those are already done on the same PR branch and should land with 130; this task does not list them in depends_on because the publish contract is specifically "the built payload's bin is cs," which 130 alone defines.

Blocks TASK-IMP-133 — that task MUST NOT merge a Formula pin to a cs-bin tarball until this task's live npm view evidence exists.

Relationship to TASK-IMP-069 / TASK-IMP-071. IMP-069 added the payload release assets and the npm job shape; IMP-071 made git push origin vX.Y.Z fire release.yml natively (no [skip ci] brake). This task consumes both — it does not re-implement them.

AI Authorship Disclosure

1. Description (normative)

2. Acceptance criteria

3. Edge cases


Final-acceptance evidence (2026-07-23)

Operator session blanket approval applies. TRACE-004 / AC evidence:

End of TASK-IMP-135.

Audit

§1 — Verdict summary

Six §1 clauses, five ACs, five edge cases including one security-class row. Closes the batch gap TASK-IMP-133 ISS-005 named: an owned, status-gating task whose done criterion is live registry evidence of bin.cs, not a scratch build.

§2 — Findings (all resolved)

ISS-001 — AC 3 lacked a concrete, re-runnable success filter

The first draft pointed at gh run view prose without requiring conclusion=success on the specific npm job for the cut tag. An implementer could paste a green overall workflow while the npm job was skipped or failed. Resolved: AC 3 now requires the release.yml run for v$V to show job npm with conclusion=success.

ISS-002 — AC 2 would pass on an Unreleased bullet alone

"CHANGELOG mentions the rename" is true today under ## [Unreleased] without any release cut. Resolved: AC 2 requires a dated ## [$V] heading for the published VERSION, with the rename markers inside that section (not only under Unreleased).

ISS-003 — clause 1.5's "must not fake publish" was prose-only

Without an AC that forbids substituting a local tarball, an implementer could npm pack a scratch build and call the task done. Resolved: AC 4 requires live npm view; AC 5 requires the recorded evidence be that npm view stdout and forbids flipping IMP-133 in the same commit.

ISS-004 — laptop npm publish was only discouraged in Alternatives, not a non-goal

A hurried implementer reading only Scope could still try a token publish when OIDC failed. Resolved: added an explicit Out of scope bullet forbidding local npm publish, inventing NPM_TOKEN, or renaming release.yml.

ISS-005 — reciprocity with TASK-IMP-133 was one-sided in the first draft body

The draft said this task blocks IMP-133, but IMP-133's frontmatter still listed only depends_on: [TASK-IMP-130] and its Scope still said "Publishing … is TASK-IMP-130's job." Resolved: IMP-133 depends_on gains TASK-IMP-135; Scope/Dependencies prose updated to name this task as the publish owner; IMP-130's blocks list gains TASK-IMP-135.

ISS-006 — projected 1.1.0 risked becoming a hard-coded false requirement

Pinning AC text to the literal string 1.1.0 would fail a legitimate Release-As: 1.2.0 cut that still ships bin.cs. Resolved: normative target is "first published version whose bin is cs"; ACs bind to V=$(cat VERSION) / npm view @…@$V, with 1.1.0 retained only as the projected default from cyberos-version.mjs --check.

§3 — TRACE-006 semantic sufficiency (per clause)

ClauseVerb demandCited test assertsVerdict
1.1 MUST land on main via PRancestor check + bin string on origin/mainAC 1sufficient
1.2 MUST cut VERSION + dated CHANGELOGdated section contains renameAC 2 (revised)sufficient after ISS-002
1.3 MUST tag v$V at bump committag points at VERSION commitAC 3sufficient
1.4 MUST publish via release.yml npm/OIDCnpm job conclusion=successAC 3 (revised)sufficient after ISS-001
1.5 MUST prove live bin.csnpm view bin keysAC 4 + AC 5sufficient after ISS-003
1.6 MUST NOT done without 1.5; MUST NOT close 133status disciplineAC 5sufficient

§4 — Resolution

Six findings resolved in the audited revision. Score = 10/10.

Status transition draft -> ready_to_implement is authorised by this verdict per STATUS-REFERENCE.md §1.1. Execution still requires a green PR merge to main and a successful OIDC publish — operator HALT conditions remain if either is blocked.


End of TASK-IMP-135 audit.