Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,6 @@ All build tiers and v1 gates are `tested` (37 of 39 requirements): `model` → `
- **`bun test <single-file>` may exit 1 with zero failures** — the per-file coverage floor (bunfig.toml) judges partially-imported files. Exit 1 with 0 fails = coverage floor, not a test failure; gate on full `bun test` runs.
- **Internal imports**: upward reaches (anything needing `../`) use `#src/…`/`#scripts/…` (package.json `imports`); same-directory and downward stay relative, explicit `.ts` extensions. Enforced by `test/import-style.test.ts` (D-013).
- **Never run `biome migrate` unattended** (D-021). On this repo's v1 config it rewrites `"rules": { "recommended": true }` as `"rules": { "preset": "none" }`, which deletes the rule set instead of preserving it: `biome check .` then exits 0 on code containing `any`, `==` and unused vars, so the lint gate dies silently and CI stays green. The correct v2 spelling is `"preset": "recommended"`. After any biome config change, re-verify with a planted violation and check the **exit code**, not the printed summary.
- **TypeScript 7 ships `tsc` only** (D-022) — no `tsserver.js`, no programmatic `typescript` module API under `node_modules/typescript/lib`. Nothing in the repo imports it as a module, so gates and mutation runs are unaffected, but an editor set to "use workspace TypeScript version" finds no language server and silently falls back to its own bundled TypeScript. Expect the editor and the `typecheck` gate to be different compilers; when they disagree, `bun run typecheck` is the authority.
- **Dependency bumps: refresh ≠ range change.** Taking a newer build of an already-declared range is routine; requiring a version you previously did not is a decision. `bun update` conflates them — it rewrites `package.json` floors even for packages whose version did not move — so refresh with `bun update`, then `git checkout package.json && bun install` to keep the change lockfile-only. Range changes get their own entry in `DECISIONS.md`, their own PR, and a measurement (D-020, D-021).
- **CI (GitHub Actions)**: `.github/workflows/ci.yml` runs the gate set (`check-docs` → `lint` → `typecheck` → `demo-app:build` → full `bun test`) on PRs and main pushes; main pushes also upload `demo-app/dist/` + `coverage/` artifacts. Bun is pinned there (1.3.14) so the bunfig coverage-gate semantics stay as verified; bump the pin deliberately, in its own PR. A `main` ruleset requires the `gates` check (repo-admin bypass keeps direct pushes possible). Mutation testing stays out of CI (D-017).
16 changes: 16 additions & 0 deletions DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,19 @@ Append-only. Each decision has a stable never-reused `D-###` id, what was decide
**Obligations**: three deferred, none blocking. **(1)** `aedes` 1.x stays deferred until R-006 (WS fidelity) and R-007 (capture the browser application's `connect()`) have run, because both spikes measure `broker/`'s **current** Aedes defaults and the ws stack underneath them; moving that floor first would invalidate the thing being measured, and `aedes-server-factory` — last published 2021-06-28, four years before this entry and nearly three years before aedes 1.0 — is not a maintained path to 1.x either. **(2)** `@biomejs/biome` 2.5.6 as its own PR, carrying the hand-corrected config and the ~34 code changes. **(3)** `typescript` 7.0.2 as its own PR: it is a three-week-old major of the compiler that gates CI, so it earns a deliberate decision rather than a quiet range change, and the ~10x speedup is a real reason to take it soon.
**From**: a dependency review on 2026-08-01 covering all nine outdated packages; every behavioral claim above measured against the installed toolchain or the published tarballs, none taken from release notes.
**Folds into**: bun.lock, AGENTS.md (working notes)

### D-022: Take TypeScript 7 for the typecheck gate
**Date**: 2026-08-01
**What**: Raise the `typescript` devDependency from `^5.6.0` to `^7.0.2` — the native (Go) port, released 2026-07-08. This discharges D-021's third deferred obligation. The `typecheck` script, `tsconfig.json` and CI step are unchanged; only the compiler behind `tsc --noEmit` moves.
**Why**: The gate gets roughly 10x faster for no source change and no configuration change, and the repo's `tsconfig.json` uses nothing the native port lacks. The reason D-021 deferred it rather than declining it was that a three-week-old major of the compiler that gates CI deserves a deliberate decision, not a quiet range change — this is that decision, taken on measurement rather than on the speed claim.
**Measured (2026-08-01, installed toolchain, Bun 1.3.14, linux-x64)**:
- **The full gate set exits 0 under 7.0.2**: `check-docs`, `lint`, `typecheck`, `demo-app:build`, `bun test` (432 pass, 0 fail).
- **The gate is live, not silently narrowed.** A planted error in each `include` root exits 1 while the clean tree exits 0: a type mismatch in `src/`, a `strictNullChecks` violation in `src/`, a mismatch in `test/`, and a bad JSX element in `demo-app/`. This is the check that matters, because a fast pass and a skipped pass look identical from the exit code alone.
- **Both compilers agree on this tree**: 5.9.3 and 7.0.2 each exit 0 on the unmodified working tree, so the bump is not being bought with lost coverage.
- **Wall clock over 3 runs each: 5.9.3 = 1167/1138/1163 ms; 7.0.2 = 110/107/132 ms.**
- **No cross-platform hazard.** The 20 `@typescript/typescript-<platform>` packages are `optionalDependencies` carrying `os`/`cpu` constraints, so each host installs only its own, and all 20 are recorded in `bun.lock` — a darwin or win32 contributor resolves theirs from the same lockfile.
**Mitigations / notes**: **TypeScript 7 ships `tsc` and nothing else.** Its `lib/` contains `tsc.js`, `getExePath` and `version` — there is no `tsserver.js` and no programmatic `typescript` module API. Verified that this repo is unaffected: nothing under `src/`, `test/`, `scripts/`, `demo-app/` or `bin/` imports `typescript` as a module; `stryker.conf.json` configures no `checkers`, so mutation runs never load it either; and no `.vscode`/`.zed` setting pins a workspace `tsdk`. The consequence that does land is on editors: anyone whose editor is set to "use the workspace TypeScript version" will not find a language server under `node_modules/typescript/lib` and will fall back to the editor's own bundled TypeScript, which means the editor and the gate can be running different compilers. That is a per-developer setting, not a repo one, so it is recorded rather than worked around.
**Consequences for earlier entries**: discharges obligation (3) of D-021. Obligation (1) (`aedes` 1.x, behind R-006/R-007) and obligation (2) (`@biomejs/biome` 2.x, with the `biome migrate` landmine that entry records) both remain open and unaffected.
**Obligations**: none deferred.
**From**: the dependency review of 2026-08-01 (D-021), which measured the bump as viable and deferred it to its own PR for the deliberate decision.
**Folds into**: package.json, bun.lock, AGENTS.md (working notes)
44 changes: 42 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@
"mqtt": "^5.10.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.6.0"
"typescript": "^7.0.2"
}
}