Skip to content

refactor: modernize TypeScript and Biome policy - #44

Merged
tnunamak merged 188 commits into
mainfrom
review/typescript-biome-modernization
Jul 29, 2026
Merged

refactor: modernize TypeScript and Biome policy#44
tnunamak merged 188 commits into
mainfrom
review/typescript-biome-modernization

Conversation

@tnunamak

@tnunamak tnunamak commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Moves the checked-in code and tests to TypeScript where TypeScript can run them.
  • Updates the repository to TypeScript 7, Next 16.3 canary, Node 26 types, and the current Biome/Ultracite policy.
  • Adds checks for test discovery, retained JavaScript files, package builds, and lint exceptions.
  • Fixes Docker and Vercel build ordering so local builds and preview deployments start reliably.

Prior art checked

  • This is a maintenance change, not a product redesign. It keeps the existing runtime behavior and makes the build rules explicit.
  • Next 16.3 canary is required for TypeScript 7 today. It uses Next's TypeScript CLI option and should move to stable Next when that support is released.

Checks

  • PostgreSQL test receipt: 706 test files, 7,579 assertions, 0 failures, and 7 approved skips.
  • Package matrix: Node 22 passed 20/20 checks; Node 25 passed 18/18 checks.
  • Docker build and local stack passed. better-sqlite3 opened a database inside the running reference service.
  • A clean Vercel-style install and pnpm console:build passed. The Vercel preview is green.
  • DCO and git diff --check pass.

The 25 remaining JS/MJS files are documented and checked. Generated files and captured provider fixtures remain JavaScript by design. Lint exceptions are listed and checked; follow-up policy work is #43. This PR supersedes #28 and #31. It does not authorize a deployment or merge.

Assisted-by: AI

tnunamak added 30 commits July 22, 2026 23:42
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit cb41b1c94292094ea43e916a854e9af2765ae9fc)
(cherry picked from commit 305ddd58a554a08991686eda33a6408045ae2c3d)
…ration 0, bound recovery-first starvation

Fix A: the terminal fold's generation-match gate treated every NULL
manifest_generation stamp as historical, even for connections whose
durable generation has never advanced past 0 — the only generation
such pre-provenance history could ever belong to. The gate now accepts
NULL as generation-0 evidence exactly while the connection has never
advanced; a genuine transition (generation >= 1) still refuses NULL
and mismatched stamps forever. STREAM_FACTS_FOLD_LOGIC_VERSION bumps
3 -> 4 so every stored terminal map replays under the corrected rule
via the existing version-behind self-heal — no data migration.

Fix B: resolveRecoveryFirstMode's implicit-unscoped branch had no
forward bound, letting an unbounded non-pressure recovery backlog
starve forward (fact-carrying) collection indefinitely. Adds a
forwardEvidenceDebt input (debt = terminal facts not current, or aged
past max(4 * scheduleIntervalMs, 1h)) consumed at both the scheduler
dispatch governor and the controller's manual runNow seam, each
reading the connection's own durable evidence via a fail-closed probe.
Explicit recoveryOnly/scoped-resource precedence is unchanged.

Adds the OpenSpec change fix-pre-provenance-terminal-generation-semantics
with both requirements, SQLite/Postgres parity tests for the fold
generation transition and straddle cases, a recovery-decision truth
table, and dispatch-governor debt-bound cases.

A pre-existing, orthogonal defect was found and pinned (not fixed, out
of scope): a generation transition with zero new terminal events since
the boundary incorrectly reports terminal_facts.state=current instead
of preserving the transition's historical write. Reproduced with this
commit's changes fully reverted.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit e712d63779d9c649c51caf54642a3bb4d574988c)
…ero-new-event generation transition

Correction to the prior commit on this branch. The fold's write phase
defaulted an instance's generation-currency verdict to true whenever no
qualifying terminal event was read for it this pass
(`generationCurrentByInstance.get(instanceId) !== false`, true on a
missing map entry) — so a connection whose evidence had just been
durably marked historical by a genuine manifest-generation transition
(`terminal_facts_historical` / `manifest_generation_changed`), with no
new terminal events since the boundary, silently healed back to
`current` on the very next converged fold pass instead of preserving
the transition's write.

seedFoldState now seeds each participant's generation-currency verdict
from its own incoming terminal_facts_reason_code: false only for the
two genuine generation-refusal reasons (terminal_facts_historical,
manifest_generation_changed), true otherwise — including the
orthogonal terminal_fold_incomplete case (a still-in-progress budgeted
replay of a generation-CURRENT row), where seeding false would have
frozen the checkpoint and broken the bounded-resume convergence
contract (caught by
connector-summary-evidence-fold-budget-resume.test.js during
verification and fixed in the same pass).

Replaces the two "KNOWN BUG" assertions (SQLite + Postgres) in
spine-events-connector-instance-id-backfill.test.js with assertions for
the correct stale/terminal_facts_historical behavior.

No broader refactor. Re-ran only the discriminating fold/generation/
recovery test files (13 files, 167 tests, both backends) plus
typecheck, strict OpenSpec, git diff --check, and touched-file lint —
all clean, zero new findings. Did not repeat the full suite per
instruction.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit f4e436c8ad37541a61a419d7e6578785aaf10db7)
…, never vetoes recovery into a do-nothing tick

Fixes two P1 defects found by Fable's adversarial re-review of commits
395f1689/72bfb5b9 (PART 2, execution-confirmed repros).

P1-A: hasForwardEvidenceDebt read terminal_facts.as_of, which is
row.computed_at — the projection's own observation/repair timestamp,
refreshed by the very reconcileDirtyConnectorSummaryEvidence call each
probe site makes immediately before the read. This made the bound
unable to fire once evidence healed to `current` (e.g. via Fix A),
regardless of how stale the underlying terminal event actually was —
a no-op in the exact scenario that motivated Fix B. The predicate now
takes the whole evidence row and derives the newest per-stream
`evidence_as_of` from `stream_latest_facts` (stamped once at fold time
from the terminal event's own occurred_at, never refreshed by later
observation); a current-but-empty fact map is also debt. One canonical
shape threaded through all three probe sites (scheduler dispatch
governor, both scheduler wiring sites, controller runNow).

P1-B: the dispatch governor's debt branch only suppressed
recovery-only; `eligible` stayed gated by the failure-backoff/cooldown
check computed earlier. When the recovery cadence had elapsed but a
failure-backoff-inflated forward-walk interval had not — the exact
live deadlock shape the surviving legacy test documents — a debt-true
tick dispatched neither recovery nor forward. Debt now selects forward
only when forward dispatch is otherwise permitted; when it is not, the
governor falls back to recovery-only on its own independent cadence,
exactly as if no debt were present. The controller seam needed no
change (runNow has no separate forward-eligibility gate to bypass).

OpenSpec: rewrote the recovery-first requirement to state the corrected
predicate shape and the otherwise-permitted fallback; added a scenario
pinning the zero-new-event post-transition resting state
(stale/historical until a new-generation fact-carrying event, distinct
from a genuinely never-collected connection's checkpointed-empty
current state) and fixed the contradictory comment in
rowNeedsFoldParticipation; added a requirement spec-pinning the
existing fail-closed-to-no-debt probe-error degradation as an
observable-but-logged residual (no new escalation subsystem this
tranche, per explicit scope).

Tests: lifted both of the review's execution repros into permanent
regressions (dispatch-governor do-nothing case; a new
forward-evidence-debt-wired-probe.test.js exercising the real
reconcile-then-read pipeline old/fresh/empty-evidence, SQLite + real
Postgres); rewrote recovery-decision.test.js's hasForwardEvidenceDebt
unit cases against the real evidence-row shape (including a
multi-stream newest-wins case); repaired
controller-run-now-state-namespace.test.js's seedCurrentRecoveryConnection
fixture, which had fabricated a `current` evidence row with no backing
terminal event — the fold's own bootstrap logic wipes such a row, and
under the corrected predicate an empty fact map is debt, so the
fixture now seeds and folds a real terminal event.

Verification: two lifted repros, 13 discriminating files (14 with the
new probe file) run sequentially against a genuinely fresh, uniquely-
named ephemeral Postgres container (the shared dedicated test
container was stopped for the duration, never written, and restarted
unchanged afterward — no shared-DB mutation), tsc --noEmit, strict
OpenSpec validate, git diff --check, touched-file lint (11 findings,
identical in category/location to the pre-change baseline). No full
suite re-run per instruction.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 7868d1c3b383f8cd40ebb686ca335b2ba525e637)
…o the Collection Report read-side overlay

Fable's live residual diagnosis (PART 4, post-deploy audit against
7868d1c3) isolated a distinct, pre-existing read-layer defect that
produces the same runtime_evidence_missing symptom the landed
generation closure (e712d637/f4e436c8/7868d1c3) already fixed at the
store layer. resolveEffectiveStreamFacts (ref-control.ts) overlays a
classifying run's own per-stream facts onto the durable latest-attempt
store, and the classifying run unconditionally won for any stream it
attempted — even when its own fact does not prove durable coverage and
the stored fact already does. Both ChatGPT connections' most recent
terminal run is a run.failed whose own facts read not_staged for all
six streams; the durable store (healed by the landed fix) already
holds committed checkpoints for all six from the last succeeded run.
The classifying run's not_staged facts shadowed the stored committed
facts, so the served Collection Report read unknown/unmeasured even
though the store itself read complete — the same "connection-health
runtime_evidence_missing defect class" the fold's own
mergeEventStreamFacts monotonicity guard already defends against one
layer down.

resolveEffectiveStreamFacts now enforces the identical floor: a
classifying fact may shadow a stored fact for the same stream unless
the stored fact proves durable coverage (checkpoint committed or
disabled) and the classifying fact does not — in that case the stored
fact and its own provenance (evidence_as_of, run_id) are kept instead.
A classifying fact that itself proves durable coverage still replaces
the stored fact normally (forward progress unaffected); a stream with
no durably-proven stored fact is unaffected by the floor (a
never-proven stream keeps surfacing its newest, possibly unresolved,
attempt). Reuses the existing checkpointProvesStreamCoverage boundary
rather than inventing a new predicate. Rewrote the misleading doc
comment ("the classifying run wins for streams it attempted") to
describe the floor.

Two pre-existing tests in collection-report-projection.test.js had
pinned the buggy shadowing behavior as "existing behavior unchanged" —
both are the exact failed-preprogress shape (not_staged classifying vs.
committed stored) and now assert the corrected floor. Added: forward
progress (a newer proving classifying fact still replaces stored
proof), never-proven stream (an unresolved classifying attempt still
replaces an unresolved stored fact — the floor is not a green-wash),
and proof-predicate parity (a stored `disabled` checkpoint proves
durable coverage exactly like `committed` at this third site,
mirroring the store-layer fold guard and connector-coverage-policy.ts's
checkpointProvesCoverage).

Also closed the incidental latent P3 Part 4 flagged: deriveGapFreeStreamCoverageCondition
treated an undefined (not null) considered denominator as a known
denominator, which could read a zero-collected fact as complete.
Unreachable via the typed read path (readRuntimeCollectionFact always
normalizes to number | null) but a one-line defensive `?? null`
normalization with a direct test closes it without new abstraction.

OpenSpec: extended fix-pre-provenance-terminal-generation-semantics
with an ADDED requirement for the read-side floor (three scenarios:
failed-classifying-cannot-unprove, forward-progress-unblocked,
never-proven-not-frozen), updated the proposal's Why/What
Changes/Impact, and added tasks 2A/2B.

Hygiene correction (independent LAND gate): two comments cited a
stream-facts-checkpoint-proof-parity.test.js that does not exist in
this repo — one pre-existing (connector-summary-read-model.ts, the
factCheckpointProvesDurableCoverage docstring) and one introduced by
this change (collection-report-projection.test.js, the proof-predicate
parity test). Both now cite the tests that actually pin the
committed/disabled checkpoint-proof boundary at each layer:
connector-summary-stream-facts.test.js's "monotonic guard" cases
(store layer) and connector-coverage-policy.test.js (coverage-
derivation layer). No behavior change, no new test file.

Verification: focused tests only (226 passing across
collection-report-projection, collection-report-projection-e2e,
connector-coverage-policy, slack-collection-report,
stream-evidence-shipped-manifests, ref-connectors-connection-projection,
ref-connectors-local-coverage-green, connection-health-acceptance —
all SQLite, no Postgres/live/shared DB touched), tsc --noEmit, strict
openspec validate, touched-file lint (16 pre-existing findings,
identical count/category to the unmodified baseline — zero new), git
diff --check. The hygiene correction re-ran only the directly named
parity tests (connector-summary-stream-facts.test.js,
connector-coverage-policy.test.js, collection-report-projection.test.js
— 94 passing) plus git diff --check. No process, database, or
credentials touched; no pushes/deploys.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 9b9d803ec21fc2b0b333c449f7298e71aa934cbc)
…tates the page

Saved live evidence (run_1784062643752) showed the USAA transactions
export ladder losing its page before a durable structural fixture could
be captured. Reading driveExport's dialog-not-open branch found the
concrete cause for that one phase: openExportDialog pressed Escape to
dismiss the dialog before its caller ran the checkpoint capture, so the
capture could observe an already-mutated surface. Thread options into
openExportDialog and capture before Escape instead of after return.

Added a mutation-grade test that fails against the pre-fix call order
(Escape before capture) and passes against the fix. No change to
export_affordance_missing classification, other checkpoint labels, or
Chase, which required no code change (its parse-first fix is already
correct and tested; only live post-deploy acceptance evidence is
missing).

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 8ebd11911d3f1daec0bec18d38e8cce860171a74)
…chment and Amazon order-item recovery

Live-instance investigation on pdpp-postgres-1 found the two already-landed
recovery changes (fix-gap-recovery-page-starvation, add-connector-neutral-
recovery-governor) correctly implemented but with two residual defects
keeping real work stranded:

1. Gmail attachments: a subset of pending gaps pinned past the quarantine
   no-progress threshold, untouched for days while the rest of the backlog
   kept cycling. The aging-bucket selection rank (attempt_count - age_bonus,
   age_bonus capped at 8 buckets) has no ceiling on attempt_count, so a row
   repeatedly re-attempted past the quarantine threshold sinks to a
   permanently-worsening rank and is never selected again — which also means
   it can never reach quarantine evaluation. Fixed by clamping the
   attempt_count term at the quarantine threshold in both SQLite and
   Postgres listPendingGaps ORDER BY.

2. Amazon order_items: health stuck degraded/partial indefinitely despite
   the recovery governor reporting zero pending work: the connector's
   forward walk re-fetched detail for every listed order on every run
   (current year never freezes), burning its per-run budget on already-
   covered orders instead of new ones. Fixed by tracking hydrated order ids
   in the orders STATE cursor and skipping already-covered orders.

Both fixes are additive, proven mutation-resistant (each new test fails on
the pre-fix code), and pass full verification.

Revision (independent gate review, same branch, same design): an
adversarial review found the first-cut Amazon fix had a confirmed data
regression — the already-hydrated skip still let the order flow through the
existing orders-stream fingerprint gate with detail:null, silently
downgrading already-good enriched records (recipient/payment/status_detail
nulled) on the very next run. The proof was also effectively permanent (no
re-hydration after a real list-surface change) and unscoped by wantsItems
(an orders-only run could falsely mark order_items covered). The review also
found the Postgres half of the Gmail rank-clamp fix had zero test coverage
(the live incident instance runs Postgres) and the all-frozen trailing-STATE
guard's comment overclaimed what it covered.

This revision closes all of that:
- Promotes the known-hydrated store to Record<orderId, listSurfaceFingerprint>
  (reusing the existing recordFingerprint primitive). A fingerprint match
  skips the fetch AND skips re-emitting either stream entirely (no downgrade
  possible — nothing is re-emitted). A fingerprint mismatch invalidates the
  entry and fully re-hydrates both streams, so detail-driven fields never go
  stale behind a permanent proof.
- Gates the forward-walk write on wantsItems, mirroring the recovery pass's
  existing scope gate, so an orders-only run can never fabricate order_items
  coverage.
- Adds the Postgres twin of the rank-clamp regression test (dedicated
  throwaway Postgres container, live database untouched), independently
  verified to fail when only the Postgres clamp is reverted while the
  SQLite twin stays green.
- Replaces the years.length===0 trailing-STATE guard with an
  ordersStateEmitted flag (extracted as the pure, testable
  shouldEmitTrailingOrdersState), correctly covering "every planned year was
  frozen" (years.length > 0, loop never emits) which the old guard missed.
- Adds mutation-grade regressions for every fix above, each independently
  verified to fail pre-revision and pass post-revision.
- Recovery-path hydrations no longer fabricate known-hydrated proof (the
  recovery path has no list-page row to fingerprint against); the next
  forward walk establishes real proof normally.

Updates fix-gap-recovery-page-starvation and add-connector-neutral-recovery-
governor OpenSpec changes: corrected proof semantics, new scenarios, the
near-miss on record, and task sections for both the original diagnosis and
the gate-review revision.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 5b2b0d55fa5b05ab53577a0f030fbc1d63ea4916)
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
…e promotion

pendingBrowserSurfaceLaunches is an in-memory Map cleared on every process
restart. A waiting_for_browser_surface lease queued before a restart has no
surviving Map entry, so promoteBrowserSurfaceLease fell through to an empty
options object and runNow defaulted connectorInstanceId to connector_id —
resolving credentials and sync state against the wrong (default) connection.

Restore connectorInstanceId from the persisted lease's surface_subject_id
(falling back to connector_id for connector-wide runs), mirroring the
existing inverse encoding in acquireInitialBrowserSurfaceLease.

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Compose the TypeScript 7 and Next.js 16.3 canary upgrade with the Node 26 type declarations and test annotations it requires.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit cee333c5f2e3cdfcd6270d43f39c4c3b93e0d648)
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added 6 commits July 25, 2026 16:09
…-health-audit .mjs target

reference-implementation/test/fleet-health.test.js and
reference-implementation/server/index.js both import
scripts/stream-health-audit/audit.mjs, which the merged root-script
migration deleted (renamed to audit.ts). Neither file existed yet on the
root migration branch's own history, so its own caller-edge sweep could
not have found them; they only surface now that both branches are
integrated. Both files already import other .ts modules directly,
confirming they already run under --import tsx.

Assisted-by: Claude <noreply@anthropic.com>

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
mcp-server's own separate TypeScript migration (already on this branch's
history before this reconciliation) renamed packages/mcp-server/test/
*.test.js to *.test.ts and smoke-stdio.mjs to smoke-stdio.ts, but
test-accounting.manifest.json's mcp-server suite entry was never updated
in lockstep -- confirmed byte-identical on pre-merge HEAD (0122bab), so
this is a pre-existing defect unrelated to the root-script reconciliation,
surfaced only because this session needed a full pnpm test-accounting:inventory
run to prove the merge didn't regress selection authority.

Assisted-by: Claude <noreply@anthropic.com>

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
…t gate

1. scripts/check-railway-template-artifacts.test.ts (Blocker 1): the merge's
   modify/delete conflict resolution took the root branch's .ts rewrite
   verbatim and silently reverted CURRENT's (0122bab) GHCR org rename
   (vana-com -> pdp-connect). Ported CURRENT's fix onto the .ts file:
   GHCR_VANA_COM_RAILWAY_CORE_PATTERN -> GHCR_PDP_CONNECT_RAILWAY_CORE_PATTERN,
   pattern updated to /ghcr\.io\/pdp-connect\/pdpp\/railway-core/. 10/10 tests
   now pass in this file (previously 7/10).

2. scripts/test-accounting/inventory.ts EXECUTABLE_SMOKES (Blocker 2): the
   prior mcp-server manifest-glob fix restored 22 of 23 mcp-server test
   files, but packages/mcp-server/test/smoke-stdio.ts was still classified
   helper-or-fixture (EXECUTABLE_SMOKES still held the deleted .mjs name),
   so it was include-matched but never planned or executed -- silently, since
   the suite as a whole no longer selects zero files. Repointed
   EXECUTABLE_SMOKES at the .ts path and fixed the now-vacuous assertion in
   inventory.test.ts:236 that classified a path which no longer exists.

   Added validateIncludeGlobsClassifyExecutable, a fail-closed oracle wired
   into checkInventory's --check path: every suite's include list (as a
   whole) must match >=1 tracked file, and every include-matched file must
   classify executable. Scoped per-suite rather than per-glob so ri-default's
   deliberate multi-extension (.js/.mjs/.ts) future-proofing globs -- which
   legitimately match zero files today -- do not false-positive. Three new
   regression tests reproduce the exact defect shape (misclassified
   include-matched file, fully-dark suite, and the multi-extension
   non-regression case) plus updated the pre-existing "empty suite" test's
   expected message to match the oracle's earlier, more specific fail-closed
   point.

3. .releaserc.yaml (Blocker 3): publishCmd still invoked the deleted
   scripts/semantic-release-github-output.mjs with a bare node invocation.
   Fixed to `node --import tsx scripts/semantic-release-github-output.ts`
   (needs the loader since there is no other .ts import in that spawn to
   carry it). Live release-time ERR_MODULE_NOT_FOUND avoided.

Also fixed the 3 cosmetic stale-.mjs-name references the gate flagged
(non-blocking, folded in per its own recommendation): the usage comment in
packages/mcp-server/test/smoke-stdio.ts, and two apps/console test file
doc-comments referencing scripts/manual-action-stream-smoke.mjs.

Mechanically swept all 78 .mjs/.cjs files deleted between the merge base and
HEAD against every tracked file including dotfiles (not just the migration's
own boundary) for stale executable references -- confirmed zero remain
outside historical prose in two openspec/changes/**/*.md|json files.

Assisted-by: Claude <noreply@anthropic.com>

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Biome's useTopLevelRegex flagged the three inline regex literals added in
the prior commit's new fail-closed-oracle regression tests. Hoisted to
named module-level constants, matching this file's existing pattern.

Assisted-by: Claude <noreply@anthropic.com>

Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Complete the repository TypeScript migration, restore behavior lost in the Biome conversion, make test accounting and retained runtime boundaries fail closed, and commit canonical generated artifacts.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
pdpp Ready Ready Preview Jul 28, 2026 10:48pm

Request Review

@tnunamak
tnunamak force-pushed the review/typescript-biome-modernization branch from 5fc3627 to a0e612a Compare July 28, 2026 21:16
@tnunamak tnunamak changed the title modernize TypeScript and Biome policy refactor: modernize TypeScript and Biome policy Jul 28, 2026
tnunamak added 2 commits July 28, 2026 16:22
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 151e830ed252f1c0a09f08d2f0c1653548b2427a)
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
(cherry picked from commit 531aa7d71fe13d9c975821a8dc36623cabb05be1)
Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added 2 commits July 28, 2026 17:09
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>

Assisted-by: AI
@tnunamak
tnunamak merged commit 54fab87 into main Jul 29, 2026
15 of 16 checks passed
@tnunamak
tnunamak deleted the review/typescript-biome-modernization branch July 29, 2026 01:11
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