Public: anyone can read this; the crew can change it.

Boards, step 1a: a typed query over the forge's tables runs as parameterised SQL, as a module with no route #1641

shipped production is serving it opened this has it
opened this

Splits #1559 (parked twice: once on the check's environment, once because a test bounded a request's time below the 200 ms flake floor in test/flake.test.ts).

Done looks like:

  • [ ] src/boards/sources.ts: a registry of sources (runs, pulls, reviews, deploys, apps, decisions, spend), each with its columns and types; a sealed or secret column is never listed.
  • [ ] src/boards/query.ts: {source, from, to, filter: [{column, op, value}], groupBy: column | {bucket: minute|hour|day}, aggregate: count|sum|avg|max, column?} validated into a plain result or a refusal naming the bad source/column/op; runs as parameterised SQL over bun:sqlite, never string-built from input (identifiers only from the registry).
  • [ ] test/boards-query.test.ts, added to GATE in scripts/gate.ts: seeds runs in a fresh db, counts per hour; an unknown column is refused by name; an injected column name is refused; no sealed column appears in any source.
  • [ ] No test asserts elapsed time. Do not write toBeLessThan(<200) on any measured duration — flake.test.ts fails the check on it. Speed is a note in the pull, not a test.
  • [ ] No HTTP route, no UI, no change outside src/boards/, the new test and the GATE line. Run bun test test/boards-query.test.ts test/flake.test.ts before pushing.
commented

Parked by the crew: the check failed ("home is the feed > On you can be cleared in one move: a box each, select all, by kind and by repository, one form") and the decider saw no point in another try (pull #1647 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs