Skip to content

fix: unblock the publish pipeline and release 6.0.3 (restores the observer dashboard on npm) - #1695

Open
YoavMayer wants to merge 2 commits into
a5c-ai:mainfrom
YoavMayer:fix/observer-publish-6.0.3
Open

fix: unblock the publish pipeline and release 6.0.3 (restores the observer dashboard on npm)#1695
YoavMayer wants to merge 2 commits into
a5c-ai:mainfrom
YoavMayer:fix/observer-publish-6.0.3

Conversation

@YoavMayer

Copy link
Copy Markdown
Contributor

Hotfix: restore the observer dashboard on npm (6.0.3)

Merging this PR triggers a lockstep npm publish of ALL @a5c-ai/ packages at 6.0.3* — not a scoped observer release. publish.yml derives the publish version from the root package.json and scripts/sync-workspace-versions.mjs stamps it onto every workspace manifest before packing. That mechanism is why the root bump here is the load-bearing line.

Why this is urgent

The last successful Publish run on main was 2026-07-03. Since #1413 merged (2026-08-07), Validate Observer And Compiler fails on every main push, and Prepare Publish gates ALL Publish Foundation jobs on it — no package in the monorepo can publish at all until this lands. Every merge to main currently ships nothing, silently.

What users see today

npx @a5c-ai/babysitter-observer-dashboard@latest (the /babysitter:observe path) serves 6.0.0, an old "Compendium Edition" codebase that renders unusably. The dashboard merged in #1413 has never reached npm: the Publish run on the merge commit (run 31163538088) failed in Validate Observer And CompilerCannot find module '@testing-library/dom' — which silently skipped the entire publish chain.

The two commits (atomic — do not cherry-pick apart)

  1. Declare @testing-library/dom — the missing devDependency behind the CI failure. It resolves locally only via root hoisting, which CI's npm ci does not reproduce.
  2. Root + observer 6.0.2 → 6.0.3 — 6.0.2 is burned: all 39 packages have different content under that number on npm since July 1. Critically, commit 1 alone would be dangerous: with root at 6.0.2, a green pipeline finds every version already published, skips publishing, and dist-tag adds latest onto the unvetted July-1 builds across the ecosystem.

Verified

  • 6.0.3 is free on npm for all 39 published packages (npm view <pkg>@6.0.3 → E404 for every one).
  • 35 packages sit at latest=6.0.0; four (genty, kradle, hooks-adapter-antigravity, hooks-adapter-hermes) already drifted to latest=6.0.2 — a successful 6.0.3 repairs that split.
  • Observer package on this branch is byte-identical to main; gates on it: build/tsc exit 0, vitest 1297/1297, Playwright 175 passed / 0 failed against a production server, style parity vs the known-good standalone 0.14.2 (230/230 tokens, 42/42 computed styles, 0% pixel diff).
  • Lockfile regenerated via npm (--package-lock-only --workspaces --include-workspace-root), never hand-edited: 7 peer-flag removals + 3 version lines.

Recovery if the matrix partially fails

Publish matrices are fail-fast: false with exact-pinned internal deps. Re-running the workflow is safe: already-published packages hit the existing-version branch and no-op; the re-run completes the remainder.

Post-merge checklist

  • Publish run green end-to-end (previous failure mode: silent skip)
  • npm view @a5c-ai/babysitter-observer-dashboard dist-tags shows latest: 6.0.3
  • npx -y @a5c-ai/babysitter-observer-dashboard@latest renders the kanban dashboard

🤖 Generated with Claude Code

The test setup imports @testing-library/dom but the package never declared
it. Locally it resolves anyway, because npm hoists it to the monorepo root
where Node's resolution finds it. CI's `npm ci` does not reproduce that
hoist, so the module is simply absent there.

Consequence, observed on the a5c-ai#1413 merge to main (run 31163538088, commit
ca6e2ea): `Validate Observer And Compiler` failed with

    Error: Cannot find module '@testing-library/dom'

across all 93 test files. `Prepare Publish` gates on that job together with
seven others, so it was skipped -- and with it every `Publish Foundation`
job. The run reported failure, nothing was published, and users still
receive 6.0.0, an unrelated codebase: this dashboard has never reached npm.

Declaring the dependency makes resolution independent of hoist layout.
Verified by hiding the hoisted copy: vitest then fails with CI's exact
error, and passes once declared.
The load-bearing line is the ROOT package.json. On main, publish.yml derives
PUBLISH_VERSION from the root manifest (publish.yml:692) and then
scripts/sync-workspace-versions.mjs rewrites every @a5c-ai/* workspace
manifest and every internal dependency range to that exact version before
the publish tarball is built. Workspace version fields are decorative at
publish time; the observer bump here is kept only so the repo agrees with
what actually ships.

Publishing is therefore strictly lockstep: this bump releases all 39
@a5c-ai/* packages at 6.0.3 from current main. Verified free: `npm view
<pkg>@6.0.3` returns E404 for every one of the 39 (the ~38
6.0.3-staging.<sha> prereleases do not collide with the exact stable
version). 35 of the 39 sit at latest=6.0.0 today; four (genty, kradle,
hooks-adapter-antigravity, hooks-adapter-hermes) already drifted to
latest=6.0.2 -- a successful 6.0.3 also repairs that split.

Why 6.0.2 cannot be reused: npm has held 6.0.2 since 2026-07-01 with
different content for all 39 packages -- the observer's carries an
unrelated "Compendium Edition" dashboard whose stylesheet has 40
--ground-void/--tkc-* tokens found nowhere in this repo. npm forbids
republishing a used number, and the unpublish window closed in July.

Why this commit must never land without the dependency fix (and vice
versa): scripts/publish-package-from-tag.mjs, on finding a version already
published, skips `npm publish` and runs `npm dist-tag add <pkg>@<ver>
latest`. A green pipeline at root 6.0.2 would publish nothing and silently
move latest onto the unvetted July-1 builds across the ecosystem. The two
commits of this PR are one atomic change.

@a5c-ai a5c-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adversarial review result: requesting changes because the required QA run did not execute successfully.

I did not find a code-level blocker in the manifest changes themselves. Adding @testing-library/dom to packages/observer-dashboard/package.json is consistent with @testing-library/react@16.3.2 requiring @testing-library/dom as a peer, and the root version bump matches the publish workflow's lockstep release model.

However, the review process requires rejection if QA failed or is inconclusive, and the dispatched QA run failed before running any QA scenarios:

  • QA Dispatch run 31286656024 failed in actions/checkout@v6.
  • The workflow attempted to check out ref: fix/observer-publish-6.0.3 from repository: a5c-ai/babysitter.
  • That branch is the PR head branch in the fork YoavMayer/babysitter, not a branch in a5c-ai/babysitter.
  • Checkout failed with: A branch or tag with the name 'fix/observer-publish-6.0.3' could not be found.
  • No QA trigger/scenario step ran.

Major concern:

  • GitHub Actions / PR checks: PR branch CI is also inconclusive. gh run list shows CI run 31276352192 completed with conclusion=action_required and no jobs. For a PR that intentionally causes a lockstep publish of all @a5c-ai/* packages, merge should wait for executed CI or an equivalent trusted validation run against the exact PR head or merge result.

What needs to happen before merge:

  1. Re-run QA from a trusted ref that can actually check out the PR head, for example by using the fork owner/repo or exact commit SHA instead of only the branch name in the base repository.
  2. Run or approve the normal PR CI so the branch has executed checks, not action_required.
  3. Immediately before merge, re-check that 6.0.3 is still unpublished for all published @a5c-ai/* packages. I spot-checked representative packages and they returned E404 at review time, but I did not rerun the full 39-package sweep.

Risk Assessment

Risk level: risk:high

  • Lockstep publish blast radius: publish.yml derives the main-branch publish version from root package.json, then scripts/sync-workspace-versions.mjs stamps that version across @a5c-ai workspaces. This PR therefore publishes much more than the observer package. Mitigation: require green CI/QA on the exact merge candidate and monitor every Publish Foundation matrix job after merge.
  • Existing-version/dist-tag risk: scripts/publish-package-from-tag.mjs skips publish when npm view <pkg>@<version> succeeds and may ensure the dist-tag for existing content. Mitigation: perform a fresh all-package 6.0.3 availability sweep immediately before merge.
  • Fork checkout gap: current QA dispatch cannot validate this fork branch by branch name. Mitigation: dispatch QA with a checkout target that resolves the fork PR head or exact SHA, then treat only that successful run as evidence.

@a5c-ai

a5c-ai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Live-stack QA

Result: blocked / unknown.

A focused live-stack workflow was dispatched for adversarial QA against refs/pull/1695/head, but the run stayed queued during polling and GitHub then returned installation API rate-limit errors before results could be observed.

Run: https://github.com/a5c-ai/babysitter/actions/runs/31286846792

Job Result
No completed jobs observed blocked: queued, then API rate-limited

Matrix requested:

[
  {"agent":"claude","model":"foundry-gpt55","mode":"interactive","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"codex","model":"google-gemini31","mode":"interactive","install":"bp","live":true,"process_mode":"create"},
  {"agent":"claude","model":"foundry-gpt55","mode":"bridged-hooks","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"codex","model":"google-gemini31","mode":"ni","install":"vanilla","live":true}
]

Notes:

  • The workflow was dispatched from staging with workflow input ref=refs/pull/1695/head, so the workflow checkout targets the fork PR ref.
  • Verdict is not a pass. It needs follow-up once the queued run completes or API quota recovers.

@a5c-ai a5c-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not see a source-code blocker in this diff: the observer workspace now declares @testing-library/dom, the lockfile resolves it to 10.4.1, and the root/observer version bump to 6.0.3 matches the publish workflow's root-version release path.

I cannot approve/merge this run, though, because the adversarial review process requires QA to pass and QA did not produce a passing terminal result.

QA evidence:

  • Dispatch 31286620191 failed before tests because qa-dispatch.yml checked out fix/observer-publish-6.0.3 in a5c-ai/babysitter, but that branch is in the contributor fork.
  • Retry 31286672814 used refs/pull/1695/head; checkout succeeded and the QA action started, but polling hit the GitHub installation API rate limit before the run produced a terminal conclusion.
  • No QA test failure was observed in the retry, but it is still inconclusive from this review run's perspective.

Required before merge: get a successful QA/publish-gate run for this PR head, or otherwise provide a terminal passing result for the same effective checkout.

Risk Assessment

Risk level: risk:high.

  • Risk: the root package.json bump intentionally drives a lockstep release/retag across the package set, not just observer-dashboard. A bad publish affects the wider @a5c-ai/* ecosystem. Mitigation: require full publish-gating CI/QA before merge and verify the publish run completes end-to-end after merge.
  • Risk: if any package occupies 6.0.3 between review and publish, publish-package-from-tag.mjs can take the existing-version retag path. Mitigation: re-check npm availability immediately before publish and verify representative dist-tags after publish.
  • Risk: a partial publish matrix could leave versions or latest tags split. Mitigation: monitor the publish matrix, rerun failed legs as needed, and verify npm view @a5c-ai/babysitter-observer-dashboard dist-tags shows latest: 6.0.3 after completion.

@a5c-ai

a5c-ai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Live-stack QA

Result: blocked / not passed.

The adversarial live-stack QA workflow was dispatched, but it remained queued throughout the polling window. Polling then hit the GitHub App installation API rate limit before job results were available.

Run: https://github.com/a5c-ai/babysitter/actions/runs/31286793303
Last known status: queued at 2026-08-09T01:02:08Z
Rate-limit reset: 2026-08-09T01:29:43Z

Job Result
Live Stack run 31286793303 blocked: queued until polling stopped; GitHub API rate limit exceeded before job results were available

Matrix tested:

[
  {"agent":"codex","model":"foundry-gpt55","mode":"interactive","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"codex","model":"google-gemini31","mode":"interactive","install":"bp","live":true,"process_mode":"create"},
  {"agent":"claude","model":"foundry-gpt55","mode":"bridged-hooks","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"claude","model":"anthropic-sonnet46","mode":"bridged-hooks","install":"bp","live":true,"process_mode":"create"}
]

Overall verdict: not passed because the live-stack jobs did not complete within the polling window and no successful job conclusions were available.

@a5c-ai a5c-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the PR adversarially. I did not find a code-level blocker in the package metadata diff itself: the added @testing-library/dom devDependency is consistent with the observer test stack, the root 6.0.3 bump matches the publish workflow's version source, and sync-workspace-versions.mjs does stamp local workspace manifests/internal ranges during Prepare Publish.

I cannot approve or merge this yet because the required QA gate is not passing.

QA status:

  • Initial qa-dispatch.yml run 31286633245 failed during checkout because the workflow tried to check out fork branch fix/observer-publish-6.0.3 in a5c-ai/babysitter, where that branch does not exist.
  • I retried with branch=refs/pull/1695/head as run 31286726814; checkout succeeded and the QA trigger action was still running at the last successful poll.
  • Further polling hit GitHub's installation API rate limit, so the repaired QA result is inconclusive, not passing.

Please get a green QA/validation signal on the PR head before merge. For this fork PR, dispatching QA with refs/pull/1695/head is the viable checkout ref.

Risk Assessment

Risk level: risk:medium.

Risks and mitigations:

  • Full-package publish blast radius: this PR intentionally affects the publish version for the whole @a5c-ai/* release train, not only observer-dashboard. Mitigation: require green publish validation/QA before merge and verify the publish run end-to-end after merge.
  • Fork checkout handling: qa-dispatch.yml fails when given only the fork branch name. Mitigation: use refs/pull/1695/head or otherwise make the branch available in the base repository for QA.
  • Publish-time manifest mutation: the static diff only bumps root and observer, relying on sync-workspace-versions.mjs during Prepare Publish for the rest. Mitigation: verify the publish-source artifact and post-merge npm dist-tags, especially @a5c-ai/babysitter-observer-dashboard@latest.

@a5c-ai

a5c-ai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Live-stack QA

Result: not passed / inconclusive. The live-stack workflow was dispatched, but it did not complete within the polling window.

Run: https://github.com/a5c-ai/babysitter/actions/runs/31286851386

Dispatch note: direct workflow dispatch with --ref refs/pull/1695/head was rejected by GitHub with HTTP 422 (No ref found for: refs/pull/1695/head), so the retry was dispatched from staging with workflow input ref=refs/pull/1695/head so the job checks out the PR ref.

Job Result
Live Stack run 31286851386 not completed: queued through poll 17, then GitHub API rate-limited polling with HTTP 403 through poll 20/job query

Matrix tested:

[{"agent":"codex","install":"bp","live":true,"mode":"interactive","model":"google-gemini31","process_mode":"predefined"},{"agent":"claude","install":"bp","live":true,"mode":"interactive","model":"foundry-gpt55","process_mode":"create"}]

Overall verdict: failed to produce passing QA evidence; rerun or inspect the Actions run once GitHub schedules it.

@a5c-ai a5c-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adversarial review completed for PR #1695.

I did not find a code-level blocker in the manifest/lockfile changes themselves:

  • package.json bumps the root version to 6.0.3, which is the value publish.yml reads on main before running scripts/sync-workspace-versions.mjs and preparing the publish artifact.
  • packages/observer-dashboard/package.json bumps the observer package to 6.0.3 and adds @testing-library/dom to the observer devDependencies.
  • package-lock.json is consistent with those changes and includes @testing-library/dom@10.4.1.
  • npm view @a5c-ai/babysitter-observer-dashboard@6.0.3 returned E404/no match, and the publish-workflow workspaces I checked were also free at 6.0.3.

Requesting changes because the required QA gate did not produce a conclusive pass.

QA evidence:

  • Initial QA dispatch run 31286644398 failed before tests because actions/checkout@v6 tried to check out fix/observer-publish-6.0.3 in a5c-ai/babysitter, but the PR head branch is on the contributor fork.
  • I retried with branch=refs/pull/1695/head in run 31286721582; checkout succeeded and the job entered the Babysitter trigger step.
  • The repaired run was still in progress through repeated polling, and subsequent polling hit the GitHub API rate limit before a terminal QA conclusion could be read.
  • No actual QA test result was obtained, so this is QA inconclusive rather than QA passed.

To unblock this review, rerun QA with a checkout-able PR ref or otherwise provide a completed publish/observer validation result for this exact PR head.

Risk Assessment

Risk level: risk:high

  • Risk: merging to main publishes the unified 6.0.3 version across the monorepo publish matrix, not just the observer dashboard. Mitigation: require the publish validation gates to pass before merge; after merge, verify the publish run is green end-to-end and confirm npm view @a5c-ai/babysitter-observer-dashboard dist-tags shows latest: 6.0.3.
  • Risk: npm package versions are immutable. If publish output is wrong, recovery is by retagging or publishing a newer version, not replacing 6.0.3. Mitigation: keep the root version bump and exact-version availability checks coupled with the dependency fix; run the documented post-merge smoke check with npx -y @a5c-ai/babysitter-observer-dashboard@latest.
  • Risk: a partial publish matrix failure can leave packages split until rerun. Mitigation: rely on publish-package-from-tag.mjs idempotency for already-published exact versions and rerun the workflow until all packages complete.

@a5c-ai

a5c-ai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Live-stack QA

Result: inconclusive. The workflow was dispatched but did not complete within the 20-minute QA wait window.

Run: https://github.com/a5c-ai/babysitter/actions/runs/31286811748

Job Status Conclusion
Build All in_progress pending
Compute Matrix completed success

Matrix requested:

[
  {"agent":"codex","model":"google-gemini31","mode":"interactive","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"claude","model":"foundry-gpt55","mode":"interactive","install":"bp","live":true,"process_mode":"create"},
  {"agent":"codex","model":"foundry-gpt55","mode":"bridged-hooks","install":"bp","live":true,"process_mode":"predefined"},
  {"agent":"claude","model":"foundry-gpt55","mode":"ni","install":"vanilla","live":true,"process_mode":"predefined"}
]

Notes:

  • Dispatch ran from staging with ref=refs/pull/1695/head; GitHub rejected using refs/pull/1695/head as the workflow dispatch ref directly.
  • At timeout, public API showed Compute Matrix passed and Build All still running.
  • Authenticated API polling hit the GitHub installation core rate limit; reset was reported for 2026-08-09T01:29:43Z.

@a5c-ai

a5c-ai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Live-stack QA

Result: blocked / not passed.

The live-stack workflow was dispatched for adversarial QA, but the GitHub Actions run stayed queued beyond the predefined 20-minute wait window, so no job-level pass/fail evidence is available yet.

Run: https://github.com/a5c-ai/babysitter/actions/runs/31286846958
Checkout ref: refs/pull/1695/head
Dispatch workflow ref: staging

Job Result
No jobs reported queued / timed out waiting

Matrix requested:

Agent Model Mode Install Process mode Live
codex foundry-gpt55 interactive bp predefined true
codex foundry-gpt55 interactive bp create true
claude foundry-gpt55 bridged-hooks bp predefined true
codex google-gemini31 ni vanilla - true

Notes:

  • The PR changes package manifests and lockfile entries for observer publish recovery, not live-stack adapter code.
  • Polling also hit the GitHub installation API rate limit during the wait; after reset, the run was still queued at 2026-08-09T01:30:45Z.
  • This is not passing QA evidence. Re-check or rerun once Actions runner capacity/API quota is available.

@YoavMayer

Copy link
Copy Markdown
Contributor Author

Thanks for the adversarial reviews — all four explicitly found no code-level blocker in the diff, and the blockers raised are all QA-infrastructure, so summarizing the evidence for a human decision:

1. The QA gate cannot currently pass for any PR. Five Live Stack dispatches were attempted against this PR overnight: two died on queue/rate-limits, and the three that ran failed on agent-matrix legs (codex/gemini interactive, bridged-hooks) — the same legs that fail on staging itself (the last 8 Live Stack runs across staging and agent-versions/* are all red, run list attached below). The one leg exercising the vanilla stack passed on this PR (Live Stack (vanilla, claude-code, non-interactive) → success, run 31286811748). The failures are chronic and branch-independent, not introduced here.

2. PR CI is still action_required — the fork-PR approval gate. I don't have push access; a maintainer needs to click "Approve and run" (@tmuskal).

3. QA dispatch can't check out fork branches by name — dispatches against refs/pull/1695/head got HTTP 422, and base-repo checkout of the branch name fails since the branch lives in the fork. Affects every fork PR; I'll file it as a separate issue.

4. Fresh 6.0.3 availability sweep (2026-08-09): every @a5c-ai/* workspace invoked by publish.yml returns E404 for stable 6.0.3 — zero collisions. Re-runnable in 30 seconds before merge.

Why this matters beyond the observer: the last successful Publish run on main was 2026-07-03, and since the #1413 merge every main push fails Validate Observer And Compiler on the missing @testing-library/dom — so no package in the monorepo can currently publish at all. This PR is the unbrick.

Reminder from the review's own risk note: the two commits are atomic by design — the dep fix alone (root still 6.0.2) would make a green pipeline silently dist-tag add the July-1 6.0.2 builds onto latest ecosystem-wide. Please don't cherry-pick them apart.

Recent Live Stack baseline (all failures, none from this PR):

2026-08-09 agent-versions/daily-2026-08-08  failure ×2
2026-08-09 staging                          failure ×5
2026-08-09 agent-versions/daily-2026-07-15  failure

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