Files
istosandClaude Fable 5 7df286ba2e Let the project define the Focus checks, resolved like prompts
What counts as a definition-of-done check was the origin project's
stack (pytest / lint-imports / frontend) frozen into core: emit.py
classified against inline literals and the Focus panel carried three
fixed rows with duplicated regexes. Per the three-layer law that is
project knowledge, so it now lives in one file: core/checks ships the
old rows as the default, and a checks file in manager/local/ replaces
it wholesale — the same filename-wins resolution as prompts.

- core/checks: '<label>: <command regex>' per line, self-documenting;
  read fresh on every use.
- emit.py classifies Bash commands against the resolved file (kind
  'check', the label carried into the summary) and judges pass/fail
  generically — counted results, broken totals, OK/FAILED verdict
  lines — since the hook payload carries no exit status. The runtime
  moved under a __main__ guard so the classifier is importable.
- config.checks() mirrors the parser (the bridge stays standalone) and
  httpd serves it in /api/state; the Focus panel renders one row per
  served entry, matching events with the same patterns — no fixed
  rows, no duplicated regexes.
- manager/local/checks gives bench its real definition (unittest), so
  the self-hosted board shows a check that can actually run.
- The default BOARD_AGENT_COMMANDS drops its pytest prefix: core no
  longer names any stack outside the shipped checks default, and a
  test walks manager/core to keep it that way.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 07:15:54 +02:00

19 lines
914 B
Plaintext

# Definition-of-done checks — the project half of the Focus view's
# CHECKS panel. One check per line:
#
# <label>: <regex matched against the commands agents run>
#
# The board never runs anything: the agent adapter classifies each
# command an agent runs against these patterns, and Focus shows the last
# matching run per row, judged pass/fail from the command's own output.
#
# Core ships this default; a file named `checks` in manager/local/
# replaces it WHOLESALE (same resolution as prompts — the local file
# wins by filename). The adapter and the browser read the same file, so
# a label edited here flows to classification and rendering alike; keep
# patterns in the regex dialect Python and JavaScript share. Read fresh
# on every event and request — edits apply without a restart.
pytest: \bpytest\b
lint-imports: \blint-imports\b
frontend: type-check|vue-tsc|\bnpm (run )?test\b|\bvitest\b