Files
krow_talent_app/MIGRATION_BASELINE.md
Aravind e676d259b2
Some checks failed
CI / check (push) Failing after 5m5s
docs: finalize TypeScript migration documentation
The migration is done and the documentation had not caught up. Two files,
no source changes.

README.md. Twenty-seven references still named modules by their old
extension — `main.jsx`, `krowHooks.js`, `AuthContext.jsx` and the rest.
Every one was checked to resolve under its new extension before being
touched. `store.js` is deliberately NOT among them: that file does not
exist under any extension, having been deleted when the transport moved
to HTTP, so "correcting" it to `.ts` would have replaced a visibly stale
reference with a plausible-looking false one. It stays as it is, with the
rest of that architecture section, for a separate pass.

Also: the assertion count 1691 -> 1693, since recapturing the baselines
replaced one check with three; and the Owliver skill count 18 -> 19,
which had been wrong since `create-employee-role` was added.

The "Known-failing checks" section is now "Check status", and the
rewrite is the part worth reading. It claimed two failures that no longer
exist, and my first attempt at replacing it merged two unrelated
histories into one sentence. They are now separate, because they are:

  - The 834/835 suite failure was `the seeded overtime climb is found`.
    It asserted against the live calendar — the oldest week in the window
    thinned as the week wore on and inflated the baseline every later
    week was compared against — so the climb was reported Sunday through
    Thursday and vanished on Friday and Saturday. That is a product
    defect, not a flaky assertion, and it was fixed in
    `src/lib/attendance.ts` at `88c412f` by dropping a leading week
    rostered well below the usual, only from the front so that a genuine
    collapse in the middle is still a finding.
  - The 59 type errors were resolved by this migration.
  - `the backend fixture is in step with this seed` failed for its own
    reasons and is recorded because it is easy to confuse with the first.
    Fixed at `3ddacf2` by teaching the generator to emit the `users`
    array the Go seeder reads, rather than by overwriting the fixture.

All three pass. The heading is kept rather than deleted so the absence of
failures is stated rather than merely implied.

MIGRATION_BASELINE.md is appended to, never edited: 68 lines added, zero
removed, and its first 141 lines are byte-identical to the previous
commit. The 2026-09-11 measurements — 71 errors, 1641/1642, 302 files
linted — are the thing the migration was checked against, so bringing
them up to date would destroy the comparison rather than update it. The
new dated entry is the other end of it, and records how the three items
that document left open were each closed.

  typecheck   0 errors
  lint        exit 0, 0 errors, 289 warnings
  npm test    1693/1693
  build       exit 0, bundle 74d17e2d… unchanged
  seed:check  in step
  owliver     matches the baseline

No file under `src/` changed, which is why the bundle hash cannot move.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HBG1wnuRfJKCstGB8Fekr8
2026-09-20 15:52:12 +05:30

10 KiB

TypeScript migration — baseline

The state of this repository immediately before the first source file was renamed, measured rather than assumed. Everything the migration does is checked against these numbers; a figure that moves without a phase claiming it is a regression.

Measured on 2026-09-11, on main with a clean tree, before any change in Milestone 1.

The numbers

Check Command Baseline
Types npm run typecheck FAILS — 71 errors across 27 files
Lint npm run lint PASSES, exit 0
Lint (with warnings) npx eslint . 289 problems — 0 errors, 289 warnings
Files linted npx eslint . --format json 302
Behaviour npm test 1641 / 1642 checks passed
Build npm run build succeeds
Owliver, via the suite npm test section 21 all green — schema, skills, routes, and per-context skills, suggestions, prompts and intent routing
Owliver, standalone node scripts/owliver-baseline.mjs FAILS — pre-existing, see below

The 71 type errors, by code

Code Count What it is
TS2339 38 Property does not exist on an inferred type
TS2741 9 Missing required prop in JSX
TS2353 9 Unknown property in an object literal
TS2345 6 Argument type mismatch
TS2554 2 Wrong argument count
TS2362 / TS2363 4 Arithmetic on a non-number
TS2739 / TS2559 / TS2349 3 Missing props / no common props / not callable

These are pre-existing. They were not introduced by the migration and the migration is not obliged to fix them; they are the backlog it has to avoid adding to. Six of them are import.meta errors that Phase 1 resolves as a side effect of configuring vite/client.

Note that npm run typecheck is not run by CI (.github/workflows/ci.yml runs lint, test, build and the seed check). That is how 71 errors accumulated without anyone seeing them. Wiring it in is the last phase of the migration, not the first — it cannot be a gate until it is green.

The standalone Owliver script is already broken

node scripts/owliver-baseline.mjs fails before any of this began — verified by stashing every change and running it on a clean main, where it fails identically. It is not caused by the migration.

Failed to scan for dependencies from entries:
  index.html
  scripts/__baseline__/activity-page.pre-migration.html
  … the other seven snapshots …
  ✘ [ERROR] The server is being restarted or closed. Request is outdated [plugin vite:dep-scan]
Owliver behaviour has DRIFTED from the baseline.

Two things are going on, and neither is a real drift. Vite's dependency scanner treats every *.html under the project root as an entry point, so the eight captured SSR snapshots in scripts/__baseline__/ are scanned as if they were pages of the app. The script then calls server.close() as soon as captureBaseline returns, while that scan is still running, and the scan reports that it was cancelled. The capture comes back incomplete and the comparison calls it drift.

The coverage itself is not lost. skill-check.mjs imports the same captureBaseline and the same BASELINE_PATH and asserts against them in section 21, and it does enough other work afterwards that the scan finishes. Run npm test and the whole section is green:

── Owliver behaviour baseline ──
[  ok  ] baseline schema matches — expected 1, got 1
[  ok  ] every skill that existed before the agent layer still registers — 23 kept, 1 added since
[  ok  ] every route that resolved before resolves the same way — 18 unchanged
[  ok  ] controlCenter: keeps every skill it had — 7 skill(s), unchanged
…per context: page key, skills, suggestions, prompts, intent routing

So npm test is the Owliver drift check for the duration of the migration, and the standalone script is a convenience wrapper that needs repairing on its own terms — excluding scripts/__baseline__ from the scan, or awaiting the optimizer before closing. That repair is not part of the migration: it changes a script's behaviour, and this milestone's whole claim is that it changed none.

The one failing check

1641/1642 checks passed

Failed:
  - the backend fixture is in step with this seed (stale — run `npm run seed:fixture`)

scripts/__baseline__ is intact and owliver-baseline.mjs matches; this is not an Owliver failure. seed/fixtures/seed.json in the sibling krow-backend checkout has drifted from src/api/seed.js.

This failure predates the migration and is unrelated to it. It is recorded here so that it is never mistaken for something the migration caused, and it is deliberately left alone — regenerating the fixture would write into another repository and change what the backend seeds, which is a product change wearing a migration's clothes. Fix it separately, on its own terms.

What "unchanged" means for the Owliver / agent flow

The agent flow is ~112 files and 38% of the codebase, and it is converted last, by rename and type annotation only. The evidence that it still behaves identically is already in the repository and needs nothing new:

  • npm test — 1642 checks covering skill discovery, routing, context resolution and SSR-rendered markup.
  • scripts/__baseline__/owliver-baseline.json — contexts, skill ids and routes.
  • scripts/__baseline__/*.pre-migration.html — eight pages of byte-level SSR output.
  • node scripts/owliver-baseline.mjs — the drift check.
  • CI's FLOOR = 900 — fails if the suite silently shrinks.

These artifacts are read-only for the duration of the migration. If the baseline drifts, revert the change. Regenerating it to clear a red check records the regression instead of catching it, which is worse than having no baseline — owliver-baseline.mjs says as much in its own header.

src/agents/**/*.md and src/skills/**/*.md are likewise untouched throughout: they are the definitions the flow is built from, not code being migrated.

How to re-measure

npm run typecheck; echo "exit=$?"
npm run typecheck 2>&1 | grep -c "error TS"
npm run lint; echo "exit=$?"
npx eslint . --format json | python3 -c "import json,sys;print(len(json.load(sys.stdin)))"
npm test
node scripts/owliver-baseline.mjs
npm run build
git diff --stat -M

2026-09-20 — closing addendum: the migration is complete

Everything above this line is the record as measured on 2026-09-11 and is left exactly as it was written. The numbers in it describe main before the first rename; they are the thing the migration was checked against, so correcting them to today's figures would destroy the comparison rather than update it. What follows is the other end of that comparison.

Final state, measured on the ts-migration branch

Check Command 2026-09-11 baseline Now
Types npm run typecheck FAILS — 71 errors / 27 files 0 errors, 321 files in the program
Lint npm run lint PASSES, exit 0 PASSES, exit 0
Lint (with warnings) npx eslint . 0 errors, 289 warnings 0 errors, 289 warnings
Behaviour npm test 1641 / 1642 1693 / 1693
Build npm run build succeeds succeeds
Bundle dist/assets/index-*.js — 74d17e2d5cafdd6f88eaf6d89ffdab11
Owliver, standalone node scripts/owliver-baseline.mjs FAILS — pre-existing matches the baseline
Backend fixture npm run seed:check FAILS — stale in step

No .js or .jsx remains under src/: 103 .ts, 216 .tsx and 2 .d.ts. src/agents/**/*.md and src/skills/**/*.md are untouched, as promised.

The three items this document left open, and where they were closed

The standalone Owliver script. Recorded above as failing before any of this began, verified by running it on a clean main. The byte-exact comparison was reporting one real difference: the baseline held 23 skills and the runtime resolved 24, because create-employee-role was added after the baseline was last written and nobody recaptured it. npm test tolerated it — its check asserts only that nothing was removed, and read "23 kept, 1 added since" — so the drift was visible only to the stricter script. Refreshed in 34505d7: three inserted lines, no deletions, routes byte-identical at 18 and all eleven contexts unchanged. The check now reads "24 kept, 0 added since".

The backend seed fixture. Recorded above as predating the migration and deliberately left alone. It stayed that way for good reason: the generator was a version behind the seeder and emitted no users key, so regenerating would have dropped employer@krow.app from every fresh seed and left nobody to sign in as to reach the employer console. Fixed in 3ddacf2 by teaching the generator to emit the key, not by overwriting the fixture — with that change the generator reproduces the committed fixture byte for byte, so seed.json in the sibling repository was never written to at all.

The HTML render baselines. Recorded above as read-only for the duration of the migration, and that held: they were untouched through every phase. Three of them — Hired History, Analytics and Candidates — were recaptured in 878a235, after the migration, because a parallel feature removed demo data those files had captured while it was still in effect. They are renamed *.render.html, since a file called pre-migration holding post-feature markup is a lie in the filename. The other five still hold genuine pre-migration markup, still pass, and keep the name. One check that could no longer be satisfied was replaced by three that read the render directly; scripts/__baseline__/README.md has the detail.

Commits

3ddacf2  fix(seed): emit the users array the backend seeder reads
878a235  test(baseline): recapture the three HTML baselines that held invented people
34505d7  chore: refresh owliver baseline

Strictness remains as debt rather than a blocker: strict: true reports 4438 errors, noImplicitAny 3317 and strictNullChecks 1794, while the committed configuration reports none. None of it affects emitted output — the production bundle hash is unchanged — so it is hardening work, not migration work.