Garry Tan and Claude Opus 4.7
9f0bdca443
cycle: calibration_profile phase + shared voice gate across surfaces (T6)
...
The calibration narrative layer. Reads TakesScorecard, asks an LLM to
write 2-4 conversational pattern statements ("right on tactics, late on
macro by 18 months"), passes them through the voice gate, derives active
bias tags, writes the row to calibration_profiles. This is the read-side
that E1 (think anti-bias rewrite), E3 (contradictions join), E6
(dashboard), and E7 (real-time nudges) all consume.
Voice gate (D24 — single function, multiple surfaces):
ALL five calibration UX surfaces import the same gateVoice() function
from src/core/calibration/voice-gate.ts. Mode parameter
('pattern_statement' | 'nudge' | 'forecast_blurb' | 'dashboard_caption'
| 'morning_pulse') drives surface-specific tuning via the rubric the
gate ships to its Haiku judge. NO forked implementations — voice
rubric drift would defeat the gate.
Each mode's rubric explicitly forbids preachy / clinical / corporate
voice; a structural test pins this. Anchors the cross-cutting voice
rule from /plan-ceo-review D2-D8.
Fallback policy (D11):
Up to 2 generation attempts (configurable). On both rejects → fall back
to a hand-written template from src/core/calibration/templates.ts.
Templates are intentionally short and a little "robotic" — they're the
safety net, not the destination. voice_gate_passed=false +
voice_gate_attempts get persisted on the calibration_profiles row so
the operator can review the failing examples and tune the rubric over
time. Suppressing the surface silently is NEVER an option — that's how
voice quality silently degrades.
parseJudgeOutput defaults to 'academic' on parse failure (NEVER passes
pass-through) so a Haiku output garble falls through to the template
rather than letting unverified text reach the user.
calibration_profile phase:
Extends BaseCyclePhase. Cold-brain skip: <5 resolved takes → no row
written, no LLM call. Otherwise: scorecard via engine.getScorecard()
→ patterns via voice-gated generator → bias tags via separate
generator (best-effort; failure logs warning, phase continues).
The DB INSERT lands in the v67 calibration_profiles row with
source_id, holder, the patterns, voice gate audit fields, active bias
tags, and grade_completion (F1 fix — partial-grade state surfaces to
the dashboard "60% graded" badge).
Budget gate at $0.50/cycle default (mostly Haiku). Below-budget
before-LLM-call check returns status='warn' without writing the row.
Per-domain scorecards are a placeholder for v0.36.0.0 ship state —
the F12 batchGetTakesScorecards() engine method that powers per-domain
rendering lands in Lane C alongside the CLI/MCP surface.
Architecture:
parsePatternStatementsOutput is tolerant of LLM emitting numbered
lists / bulleted lines despite the prompt asking for plain lines.
Caps at 4 patterns + drops excessively long lines (>200 chars).
parseBiasTagsOutput lowercases input + drops non-kebab-case tokens
(defends against the LLM emitting "Over-Confident Geography" with
spaces or capitals). Caps at 4 tags.
Tests: 43 cases across two new test files.
voice-gate.test.ts (24): parseJudgeOutput (7), gateVoice happy path
(3), fallback path (5), mode parity (2), templates (7).
calibration-profile.test.ts (19): parsers (10), pickFallbackSlots
(3), phase integration (6 — cold-brain skip, happy path, voice gate
fallback, grade_completion plumbed through, bias-tags failure
non-fatal, source_id scope reaches INSERT).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-17 16:19:27 -07:00
..
2026-05-15 06:48:36 -07:00
2026-05-11 22:54:35 -07:00
2026-05-14 19:13:14 -07:00
2026-05-17 15:57:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-12 14:33:29 -07:00
2026-05-17 14:02:45 -07:00
2026-05-17 08:32:03 -07:00
2026-05-15 06:48:36 -07:00
2026-05-10 20:06:31 -07:00
2026-04-29 23:46:36 -07:00
2026-05-07 21:52:58 -07:00
2026-05-10 20:06:31 -07:00
2026-05-11 19:25:48 -07:00
2026-05-02 08:41:11 -07:00
2026-05-11 22:54:35 -07:00
2026-05-06 21:14:34 -07:00
2026-04-18 16:57:38 +08:00
2026-04-21 18:35:45 -07:00
2026-05-14 21:06:42 -07:00
2026-05-08 13:25:48 -07:00
2026-05-08 13:25:48 -07:00
2026-04-11 21:25:44 -10:00
2026-04-14 19:41:34 -10:00
2026-04-22 01:34:22 -07:00
2026-05-14 19:13:14 -07:00
2026-05-14 19:13:14 -07:00
2026-05-07 21:52:58 -07:00
2026-05-14 20:15:29 -07:00
2026-04-30 20:47:32 -07:00
2026-05-07 21:52:58 -07:00
2026-05-10 20:50:40 -07:00
2026-05-02 22:01:05 -07:00
2026-04-20 23:14:38 +08:00
2026-04-29 10:12:10 -07:00
2026-05-10 20:06:31 -07:00
2026-04-21 11:51:32 -07:00
2026-05-17 16:19:27 -07:00
2026-04-25 12:25:34 -07:00
2026-05-10 13:20:07 -07:00
2026-05-02 08:41:11 -07:00
2026-05-11 19:25:48 -07:00
2026-04-09 12:25:04 -10:00
2026-05-14 21:06:42 -07:00
2026-04-25 12:25:34 -07:00
2026-05-14 19:13:14 -07:00
2026-04-25 12:25:34 -07:00
2026-05-11 22:54:35 -07:00
2026-04-29 23:46:36 -07:00
2026-05-09 19:47:56 -07:00
2026-05-07 13:41:46 -07:00
2026-05-09 19:47:56 -07:00
2026-05-02 08:41:11 -07:00
2026-05-07 10:03:38 -07:00
2026-05-09 20:46:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-05-14 19:50:50 -04:00
2026-05-13 13:14:58 -04:00
2026-05-09 22:58:19 -07:00
2026-05-13 13:14:58 -04:00
2026-04-06 16:50:15 -07:00
2026-05-08 13:25:48 -07:00
2026-04-26 15:49:48 -07:00
2026-05-11 21:49:57 -07:00
2026-05-06 20:39:56 -07:00
2026-05-06 20:39:56 -07:00
2026-05-06 20:39:56 -07:00
2026-04-29 22:13:05 -07:00
2026-05-09 16:57:47 -07:00
2026-04-30 01:23:29 -07:00
2026-05-08 17:07:51 -07:00
2026-05-09 20:46:34 -07:00
2026-05-11 23:02:03 -07:00
2026-05-09 20:46:34 -07:00
2026-04-14 19:41:34 -10:00
2026-05-08 13:25:48 -07:00
2026-04-22 16:24:23 -07:00
2026-05-03 20:41:39 -07:00
2026-04-29 22:21:07 -07:00
2026-04-20 21:54:36 +08:00
2026-04-26 15:49:48 -07:00
2026-05-10 18:59:11 -07:00
2026-05-07 22:56:22 -07:00
2026-05-13 13:14:58 -04:00
2026-05-17 14:27:31 -07:00
2026-04-30 01:23:29 -07:00
2026-05-02 22:01:05 -07:00
2026-05-13 13:14:58 -04:00
2026-04-20 21:54:36 +08:00
2026-05-14 19:13:14 -07:00
2026-05-07 21:52:58 -07:00
2026-05-14 21:22:10 -07:00
2026-05-06 20:58:19 -07:00
2026-05-15 18:54:36 -07:00
2026-05-07 21:52:58 -07:00
2026-04-11 00:01:09 -10:00
2026-05-07 10:03:38 -07:00
2026-05-10 06:34:40 -07:00
2026-04-14 19:41:34 -10:00
2026-05-11 23:02:03 -07:00
2026-05-17 08:51:33 -07:00
2026-05-17 08:51:33 -07:00
2026-04-25 12:25:34 -07:00
2026-05-01 09:02:43 -07:00
2026-05-01 09:02:43 -07:00
2026-05-01 09:02:43 -07:00
2026-05-13 13:14:58 -04:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-01 09:02:43 -07:00
2026-05-16 13:19:04 -07:00
2026-05-01 09:02:43 -07:00
2026-05-01 09:02:43 -07:00
2026-05-13 13:14:58 -04:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-12 14:33:29 -07:00
2026-04-13 21:03:40 -10:00
2026-05-17 14:27:31 -07:00
2026-05-02 22:01:05 -07:00
2026-05-11 19:25:48 -07:00
2026-05-11 19:25:48 -07:00
2026-05-09 20:46:34 -07:00
2026-04-29 10:12:10 -07:00
2026-05-10 06:34:40 -07:00
2026-05-06 21:14:34 -07:00
2026-05-09 20:46:34 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-17 08:51:33 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-10 12:49:14 -07:00
2026-05-10 20:06:31 -07:00
2026-05-10 12:49:14 -07:00
2026-05-10 12:49:14 -07:00
2026-05-11 19:25:48 -07:00
2026-05-11 19:25:48 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-04-20 07:30:00 +08:00
2026-04-14 21:40:48 -10:00
2026-04-25 12:25:34 -07:00
2026-05-17 08:51:33 -07:00
2026-04-09 10:17:13 -07:00
2026-04-13 07:49:13 -10:00
2026-04-16 23:03:15 -07:00
2026-04-13 07:49:13 -10:00
2026-04-23 19:34:27 -07:00
2026-05-12 14:33:29 -07:00
2026-04-29 23:46:36 -07:00
2026-04-29 23:46:36 -07:00
2026-04-26 20:45:05 -07:00
2026-04-29 23:26:25 -07:00
2026-04-26 20:45:05 -07:00
2026-04-29 23:46:36 -07:00
2026-05-14 19:13:14 -07:00
2026-05-17 08:00:29 -07:00
2026-05-17 16:12:34 -07:00
2026-05-17 16:08:20 -07:00
2026-04-18 18:16:18 +08:00
2026-04-29 22:13:05 -07:00
2026-05-09 22:58:19 -07:00
2026-05-01 09:02:43 -07:00
2026-05-13 13:14:58 -04:00
2026-05-14 20:51:11 -07:00
2026-05-11 22:54:35 -07:00
2026-05-07 10:03:38 -07:00
2026-05-14 20:51:11 -07:00
2026-04-12 07:48:47 -10:00
2026-04-25 12:25:34 -07:00
2026-05-07 22:56:22 -07:00
2026-04-18 16:57:38 +08:00
2026-05-13 13:14:58 -04:00
2026-05-11 19:25:48 -07:00
2026-04-16 23:03:15 -07:00
2026-04-22 01:34:22 -07:00
2026-05-13 13:14:58 -04:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-05-11 21:49:57 -07:00
2026-04-26 20:45:05 -07:00
2026-04-11 21:25:44 -10:00
2026-05-07 13:41:46 -07:00
2026-05-07 19:49:46 -07:00
2026-04-26 20:45:05 -07:00
2026-04-24 00:08:54 -07:00
2026-05-09 19:47:56 -07:00
2026-05-07 22:56:22 -07:00
2026-05-04 21:11:15 -07:00
2026-05-01 09:02:43 -07:00
2026-05-17 08:00:29 -07:00
2026-05-13 13:14:58 -04:00
2026-05-08 13:25:48 -07:00
2026-05-14 21:22:10 -07:00
2026-04-26 20:45:05 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 20:46:34 -07:00
2026-05-09 20:46:34 -07:00
2026-05-11 22:54:35 -07:00
2026-04-18 16:57:38 +08:00
2026-04-18 16:57:38 +08:00
2026-04-18 18:16:18 +08:00
2026-04-19 07:14:24 +08:00
2026-04-22 01:34:22 -07:00
2026-04-20 07:30:00 +08:00
2026-04-29 23:46:36 -07:00
2026-04-22 01:34:22 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-26 20:45:05 -07:00
2026-05-07 10:03:38 -07:00
2026-05-11 19:25:48 -07:00
2026-05-10 06:34:40 -07:00
2026-04-22 01:34:22 -07:00
2026-04-24 01:09:28 -07:00
2026-04-29 23:06:16 -07:00
2026-05-10 20:06:31 -07:00
2026-05-02 22:01:05 -07:00
2026-05-02 22:01:05 -07:00
2026-05-10 13:33:05 -07:00
2026-05-03 20:41:39 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 19:47:56 -07:00
2026-05-14 20:15:29 -07:00
2026-05-14 20:15:29 -07:00
2026-05-14 19:13:14 -07:00
2026-04-30 01:23:29 -07:00
2026-05-07 21:52:58 -07:00
2026-05-17 14:02:45 -07:00
2026-05-06 21:14:34 -07:00
2026-05-07 10:03:38 -07:00
2026-05-03 20:41:39 -07:00
2026-04-25 12:25:34 -07:00
2026-04-08 23:26:11 -10:00
2026-05-09 20:46:34 -07:00
2026-05-14 21:22:10 -07:00
2026-04-12 17:38:48 -07:00
2026-04-23 19:34:27 -07:00
2026-05-02 08:41:11 -07:00
2026-04-20 07:30:00 +08:00
2026-04-21 18:35:45 -07:00
2026-05-09 20:46:34 -07:00
2026-05-03 20:16:15 -07:00
2026-05-11 19:25:48 -07:00
2026-04-29 23:46:36 -07:00
2026-04-30 20:47:32 -07:00
2026-05-17 16:03:42 -07:00
2026-05-15 18:54:36 -07:00
2026-04-12 13:23:55 -10:00
2026-05-14 19:13:14 -07:00
2026-04-25 12:25:34 -07:00
2026-05-13 13:14:58 -04:00
2026-05-13 13:14:58 -04:00
2026-05-07 10:03:38 -07:00
2026-05-07 21:52:58 -07:00
2026-05-07 21:52:58 -07:00
2026-04-16 23:03:15 -07:00
2026-04-22 01:34:22 -07:00
2026-04-22 01:34:22 -07:00
2026-05-11 23:20:17 -07:00
2026-05-11 23:20:17 -07:00
2026-05-07 21:52:58 -07:00
2026-05-07 21:52:58 -07:00
2026-05-03 20:16:15 -07:00
2026-04-23 19:34:27 -07:00
2026-04-25 12:25:34 -07:00
2026-05-11 22:54:35 -07:00
2026-04-19 07:14:24 +08:00
2026-05-10 13:20:07 -07:00
2026-04-11 21:25:44 -10:00
2026-04-25 12:25:34 -07:00
2026-05-15 06:48:36 -07:00
2026-04-21 18:35:45 -07:00
2026-05-10 13:20:07 -07:00
2026-04-24 01:39:58 -07:00
2026-05-17 08:00:29 -07:00
2026-05-06 16:32:11 -07:00
2026-05-08 13:25:48 -07:00
2026-04-30 23:17:54 -07:00
2026-04-23 19:34:27 -07:00
2026-05-07 21:52:58 -07:00
2026-04-29 23:46:36 -07:00
2026-05-17 14:02:45 -07:00
2026-04-27 22:59:08 -07:00
2026-05-06 21:14:34 -07:00
2026-05-07 10:03:38 -07:00
2026-04-25 12:25:34 -07:00
2026-04-16 23:03:15 -07:00
2026-05-15 06:48:36 -07:00
2026-05-13 13:14:58 -04:00
2026-05-12 14:33:29 -07:00
2026-04-18 18:16:18 +08:00
2026-04-29 23:46:36 -07:00
2026-04-30 20:47:32 -07:00
2026-05-07 13:17:27 -07:00
2026-05-14 20:15:29 -07:00
2026-04-09 10:17:13 -07:00
2026-04-23 19:34:27 -07:00
2026-04-22 02:07:00 -07:00
2026-05-06 20:39:56 -07:00
2026-04-18 16:57:38 +08:00
2026-04-30 23:17:54 -07:00
2026-04-23 19:34:27 -07:00
2026-05-02 08:41:11 -07:00
2026-04-14 19:41:34 -10:00
2026-05-11 22:54:35 -07:00
2026-05-14 20:51:11 -07:00
2026-05-14 19:13:14 -07:00
2026-04-29 22:21:07 -07:00
2026-05-14 19:13:14 -07:00
2026-05-06 21:14:34 -07:00
2026-05-06 21:14:34 -07:00
2026-04-22 16:24:23 -07:00
2026-05-06 11:54:06 -07:00
2026-05-09 22:58:19 -07:00
2026-05-03 20:41:39 -07:00
2026-04-22 16:24:23 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-05-17 14:02:45 -07:00
2026-04-13 07:49:13 -10:00
2026-05-17 08:51:33 -07:00
2026-04-21 21:14:17 -07:00
2026-04-21 21:14:17 -07:00
2026-04-22 01:34:22 -07:00
2026-05-08 17:07:51 -07:00
2026-04-22 01:34:22 -07:00
2026-04-09 10:17:13 -07:00
2026-05-17 14:27:31 -07:00
2026-05-06 11:54:06 -07:00
2026-05-14 21:06:42 -07:00
2026-04-25 12:25:34 -07:00
2026-04-29 22:53:41 -07:00
2026-04-25 12:25:34 -07:00
2026-05-09 20:46:34 -07:00
2026-04-29 22:53:41 -07:00
2026-04-25 12:25:34 -07:00
2026-05-09 21:18:53 -07:00
2026-05-17 14:02:45 -07:00
2026-05-10 06:34:40 -07:00
2026-05-07 23:07:00 -07:00
2026-05-09 20:46:34 -07:00
2026-05-07 23:07:00 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-09 20:46:34 -07:00
2026-05-07 23:07:00 -07:00
2026-05-10 06:34:40 -07:00
2026-05-11 23:20:17 -07:00
2026-05-10 18:59:11 -07:00
2026-05-17 14:02:45 -07:00
2026-05-06 21:14:34 -07:00
2026-05-13 13:14:58 -04:00
2026-04-29 23:46:36 -07:00
2026-04-14 19:41:34 -10:00
2026-05-07 21:52:58 -07:00
2026-04-20 23:14:38 +08:00
2026-05-04 21:11:15 -07:00
2026-04-25 12:25:34 -07:00
2026-05-08 13:25:48 -07:00
2026-05-11 22:54:35 -07:00
2026-05-09 20:46:34 -07:00
2026-05-08 13:25:48 -07:00
2026-04-19 18:23:02 +08:00
2026-05-07 21:52:58 -07:00
2026-05-08 13:25:48 -07:00
2026-05-17 16:19:27 -07:00
2026-05-07 13:41:46 -07:00
2026-05-13 12:21:21 -04:00
2026-04-22 01:34:22 -07:00
2026-05-06 21:14:34 -07:00
2026-05-12 14:33:29 -07:00
2026-05-12 14:33:29 -07:00
2026-05-14 21:06:42 -07:00
2026-05-06 11:54:06 -07:00
2026-04-20 07:30:00 +08:00
2026-04-09 10:17:13 -07:00
2026-05-06 11:54:06 -07:00