chore(ci): add OS x tfjs-backend matrix (test-core + test-tfjs split)#113
Merged
Conversation
…-tfjs)
- `test` job split into `test-core` (full vitest, OS matrix only) and
`test-tfjs` (tfjs adapter slice, OS x cpu|wasm matrix). `fail-fast:
false` on both so platform-specific failures don't suppress each
other. Coverage runs on ubuntu-latest only — identical report across
OSes; v8 instrumentation triples runtime on the others for no signal.
- `tests/setup/tfjsBackend.ts` exports `TEST_BACKEND` derived from
`process.env.TFJS_BACKEND` (cpu | wasm; default cpu).
`tests/setup/tfjsBackendSetup.ts` is wired in vite.config as a
vitest setupFiles entry — side-effect-imports the matching tfjs
backend package + activates it via `tf.setBackend` BEFORE any test
file's static imports run, so `wasm` matrix cells don't pull cpu
in via the historical `import '@tensorflow/tfjs-backend-cpu'`.
- `TfjsReasoner.test.ts` and `learningMode.train.test.ts` use
`TEST_BACKEND` in `beforeAll` and inject `backend: TEST_BACKEND` via
thin `newReasoner` / `fromJSONReasoner` helpers so the constructor's
"requested backend must match active backend" guard passes on every
matrix cell. The single `new TfjsReasoner({..., backend: 'webgl'})`
case that asserts the throw path is left as-is.
- `webgl` deliberately dropped — its factory throws on first use in
headless Node and a real GPU runner is out of scope.
- `build` / `ci-gate` `needs:` updated from `test` to
`test-core, test-tfjs`. No `src/` library change.
Plan row 4 marked shipped in
docs/plans/2026-04-25-comprehensive-polish-and-harden.md, mirroring
row 3's section-B "What's already shipped" pattern.
Owner
Author
|
@codex review |
size-limit report 📦
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: df1d8c24eb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
`tests/examples/learningMode.train.test.ts` runs the demo's `mountCognitionSwitcher` flow, whose probe loop seeds `cpu` first and promotes the persisted backend afterwards. Under `TFJS_BACKEND=wasm` the suite still exercises the cpu-fallback path (no localStorage seed in beforeEach), so the wasm cell added zero new coverage versus cpu — it just doubled runtime on a cpu-by-design suite. Reasoner-level wasm coverage already lives in the three `tests/unit/cognition/adapters/Tfjs*.test.ts` files, which the matrix-selected backend genuinely flows through. Test-core still runs the demo file once on every OS cell via the default `npm test`.
Owner
Author
|
@codex review |
|
Codex Review: Didn't find any major issues. Hooray! ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
This was referenced Apr 25, 2026
Luis85
added a commit
that referenced
this pull request
Apr 26, 2026
## Summary
Doc-audit pass over `docs/plans` + `docs/specs`. Three things land
together:
- **`docs/archive/{plans,specs}/`** — new home for plans whose roadmap
rows have all shipped (or whose goals were folded into a successor)
and specs whose design is now reflected in code. Includes a
`README.md` explaining the policy; `CLAUDE.md` documents the
convention.
- **`git mv` 23 plans + 3 specs into the archive.** The active live
set is now the comprehensive polish-and-harden plan plus three
specs (post-tfjs improvements, mvp-demo, vision), each with a
refreshed status banner.
- **Refresh the live comprehensive plan** against current `develop`:
- PR column updated for rows 16/19/20/3/4/22 (now shipped via
PRs #91 / #98 / #104 / #110 / #113 / #111).
- New "Post-roadmap follow-ups" section covers PRs #92 → #125
(review-bot infra, tracker findings, demo + tfjs hotfixes,
tooling).
- Stale prose-baked counts dropped (size budgets now reference
`package.json#size-limit` only).
- Coverage-thresholds section gains a pointer to the sticky PR
comment shipped in PR #124.
## Other doc fixes
- `README.md`: drop the unverifiable "Phase A milestones (M0–M15) are
all green" claim — the milestones don't exist as documented IDs
anywhere; replace with a pointer to the live polish plan.
- `vision.md`: refresh cadence note (was pinned to 2026-04-19 + "next
review at 1.0").
- `2026-04-24-post-tfjs-improvements.md`: mark recommended-order items
that have shipped (PRs #61, #76, #77, #83, #84, #91, #94, #96,
#104, #113), link the active roadmap as the heir.
- `mvp-demo.md`: status banner explaining where active polish work is
now tracked.
## Mechanical
- Update inline cross-refs in `CLAUDE.md`, `eslint.config.js`,
`src/agent/{Agent,AgentModule}.ts`, `tests/unit/exports.test.ts`,
and `docs/daily-reviews/2026-04-25.md` to point at the new
`docs/archive/` paths so links keep resolving.
No code change beyond comment-path updates.
## Test plan
- [x] `npm run verify` green (`format:check` + `lint` + `typecheck` +
`test` + `build` + `docs`). 523 tests pass; the 2 lint warnings
are pre-existing (`CognitionPipeline.invokeSkillAction` complexity
+ `scoreFailure` param count) and on the ratchet menu.
- [x] `git ls-files docs/archive/` shows the moved files; renames are
preserved (`git log --follow` works for any moved file).
- [ ] Codex review: clean, no blockers.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Luis Mendez <hallo@luis-mendez.de>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced Apr 27, 2026
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.
Summary
Row 4 of the polish + harden roadmap (
docs/plans/2026-04-25-comprehensive-polish-and-harden.md).testjob in.github/workflows/ci.ymlinto two:test-coreruns the full vitest suite across the OS matrix (ubuntu-latest,macos-latest,windows-latest). Coverage runs on ubuntu only — identical report across OSes; v8 instrumentation triples runtime on the other cells for no extra signal.test-tfjsruns only the four tfjs-touching test files (TfjsReasoner.test.ts,TfjsLearner.test.ts,TfjsSnapshot.test.ts,learningMode.train.test.ts) under the OS × backend matrix = 3 × 2 = 6 cells (cpu,wasm).strategy.fail-fast: falseon both so a windows-only flake or a wasm-only kernel issue does not suppress unrelated cells.tests/setup/tfjsBackend.tsexportsTEST_BACKENDderived fromprocess.env.TFJS_BACKEND(defaultcpu).tests/setup/tfjsBackendSetup.tsis wired invite.config.tsas a vitestsetupFilesentry and side-effect-imports the matching@tensorflow/tfjs-backend-*package + callstf.setBackend(...)+tf.ready()BEFORE any test file's static imports run.backend: TEST_BACKENDinto everynew TfjsReasoner(...)/TfjsReasoner.fromJSON(...)via localnewReasoner/fromJSONReasonerhelpers, so the constructor's "requested backend must match active backend" guard passes on every matrix cell. The single explicitbackend: 'webgl'mismatch test is left untouched.Matrix shape chosen
Shape (b) from the row-4 brief — split
test-core(OS-only) fromtest-tfjs(OS × backend). The full vitest suite has zero opinion about the tfjs backend axis (it always imports@tensorflow/tfjs-backend-cpustatically); running it under the backend axis would burn 2× runtime for no extra signal.Cell count: 3 OSes (test-core) + 6 cells (test-tfjs) = 9 total runner invocations on each push, vs 1 today.
Cost: ~1 extra runner-minute per push (matches roadmap estimate). The tfjs slice is small enough that the wasm cells finish in ~1s each.
Out of scope
webgldeliberately dropped — its factory throws on first use in headless Node and a real GPU runner is beyond row-4 scope. The activation-baseddetectBestBackendchain insrc/(which already covers webgl gracefully) is unchanged.src/library change. The env-var wire lives entirely undertests/setup/.Dependencies
feat/tfjs-detect-backend-and-picker) already shippedTfjsReasoner.probeBackend/detectBestBackend, so the matrix defends a real consumer surface (the demo's backend picker).vite.config.tsandpackage.jsonrespectively. Expect a 1-line plan-table merge conflict here when one of those merges first; resolution is to order rows numerically and re-verify.Test plan
npm run verifygreen locally on develop-basenpx vitest run tests/unit/cognition/adapters/TfjsReasoner.test.ts— 23/23 passing under default cpuTFJS_BACKEND=wasm npx vitest run tests/unit/cognition/adapters/TfjsReasoner.test.ts— 23/23 passingTFJS_BACKEND=wasm npx vitest run tests/examples/learningMode.train.test.ts— 25/25 passingnode scripts/bump-actions.mjs— confirmed no new unpinned action referencesci-gatecorrectly aggregatestest-core+test-tfjs(replaces previoustestneed)