feat(bookclub): daily LLM composer with hard subject-dedup guard — fix the 5× repeated subject The picker dedups the SECTION against the sent-ledger (never repeats), but the SUBJECT came from a fixed 13-entry theme list matched first-hit that NEVER checked the ledger — so "the drift the green dashboard hides" shipped FIVE times (07-03/07/08/12/16) and read as the same email. compose-email.mjs (operator 2026-07-16: "the selector should be a prompt that writes out all the parts, including picking the section"): LOCAL qwen ($0, not gated by .thetacog/llm-pause — that flag blocks only the paid Claude lane, so this respects the 07-14 cost cut) picks among pick-passage's dedup-GUARANTEED unsent candidates (chosen by NUMBER, not by copying a long id) and writes a UNIQUE subject + why-today opener. HARD DEDUP GUARD: chosen section ∉ ledger AND chosen subject ∉ ledger, else retry once, else a DETERMINISTIC fallback (top unsent candidate + title-derived unique subject). The send NEVER blocks on the model and NEVER repeats — model up or down. Wired into the controller preview; send-daily already carries pinned.subject_line to the blast, so preview-subject == send-subject. render-email subjectFor is a second dedup SAFETY NET: even on the rare no-composed- pin send, the theme scan skips any hook already in the ledger and the fallback is made unique from the passage title. So NO path can repeat a subject. Guard: tests/ops/bookclub-compose.test.js — wired · $0/local (no claude) · dedup guard + deterministic fallback · behavioral: render-email never re-emits a used hook (hermetic temp ledger via BOOKCLUB_LEDGER override). Persona-Intent: the daily reader — should feel the email is freshly written for today, never a rerun; a repeated subject silently taxes that trust, so the fix is the never-repeat guarantee, not just a nicer hook. Originating-Terminal: 🎤 voice Relevant-Rooms: 🔨 builder, 🧭 navigator, ☕ network Story: Operator got what read as a repeat book-club email from the voice room; traced it to the subject-generation (navigator/tactics surface) not the section picker, and fixed it at the compose step with a guard so the audience (network) never sees a rerun. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2SmLaA9twdunCNda5Rjf6
npx thetacog-mcp attest-demoA,B1 ▸ B,C3 B.Tactics × C1.Operations.Grid → pmu-reef · pmu reef ballistic walk · 11 green blocksA2,A1 ▸ B1,A3 A3.Strategy.Fund × A2.Strategy.Goal → ~comms-email · email comms newsletter telegram · 9 amber blocksA2,B1 ▸ B1,B3 A3.Strategy.Fund × B2.Tactics.Deal → ~infra-hooks · hook pre-commit post-commit launchd · 9 amber blocksA2,C1 ▸ B1,C3 A3.Strategy.Fund × C2.Operations.Loop → ~testing-gate · test jest guard gate · 9 amber blocksB3,A ▸ C2,C C1.Operations.Grid × B.Tactics → ~comms-email · email comms newsletter telegram · 9 amber blocksB3,A1 ▸ C2,A3 C1.Operations.Grid × A2.Strategy.Goal → ~comms-email · email comms newsletter telegram · 9 amber blocksC1,B1 ▸ C3,B3 C2.Operations.Loop × B2.Tactics.Deal → ~comms-email · email comms newsletter telegram · 9 amber blocksB3,C1 ▸ C2,C3 C1.Operations.Grid × C2.Operations.Loop → ~comms-email · email comms newsletter telegram · 9 amber blocksA1,A3 ▸ A1,C3 A1.Strategy.Law × B3.Tactics.Signal → ~testing-gate · test jest guard gate · 7 green blocksB2,A ▸ B2,B1 B2.Tactics.Deal × A1.Strategy.Law → ~comms-email · email comms newsletter telegram · 7 green blocksB,C ▸ A1,A2 C.Operations × A1.Strategy.Law → comms-email · email comms newsletter telegram · 6 amber blocksB,B3 ▸ C,C3 C.Operations × C2.Operations.Loop → deployment · deploy vercel build push · 5 amber blocksA2,A ▸ B1,B A3.Strategy.Fund × B.Tactics → ~comms-email · email comms newsletter telegram · 5 amber blocksA,A ▸ B,B B.Tactics × B.Tactics → thermodynamics · thermodynamics entropy free-energy dissipation · 4 green blocksA,A1 ▸ B,A2 B.Tactics × A2.Strategy.Goal → mdx-validation · mdx validate forbidden character · 4 green blocksA1,A ▸ A2,C A2.Strategy.Goal × B.Tactics → ~comms-email · email comms newsletter telegram · 4 green blocksB2,B3 ▸ B2,C3 B2.Tactics.Deal × C2.Operations.Loop → ~infra-hooks · hook pre-commit post-commit launchd · 4 green blocksA,A3 ▸ C,B1 B.Tactics × B1.Tactics.Speed → delegation-mesh · delegate room bifurcate mesh · 4 amber blocksC,A ▸ C,B C.Operations × B.Tactics → ~patent-ip · patent uspto inventor provisional · 2 amber blocksC3,C2 ▸ C3,C3 C3.Operations.Flow × C3.Operations.Flow → ~comms-email · email comms newsletter telegram · 2 amber blocksC3,B C3.Operations.Flow × B.Tactics → ~comms-email · email comms newsletter telegram · 1 green block
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
| |||||||||||||||||||||||
|
A,A The lattice we build today is what next year's underwriter inherits.B,B Tactics is the choice of which leverage to pull at which beat.C,C Operations is the loop that runs whether anyone watches.A1,A1 EU AI Act Article 14 requires human-on-the-loop oversight, with the supervisor able to interrupt the system atA2,A2 The target is the cell coordinate the system MUST occupy by end-of-quarter.A3,A3 Every dollar builds either the floor (substrate that lifts future bets) or the ceiling (cap on the next round)B1,B1 Latency is the price of a missed beat.B2,B2 The deal sets the exchange rate between two value substrates.B3,B3 Signal-to-noise is the inverse cube of bandwidth — narrow the channel, the message arrives; broaden it, recipiC1,C1 Power flows where the grid lets it.C2,C2 Each iteration is a hypothesis tested against the ground truth of the world.C3,C3 Flow is the rate at which committed work crosses the finish line.feat(bookclub): daily LLM composer with hard subject-dedup guard — fix the 5× repeated subject The picker dedups the SECTION against the sent-ledger (never repeats), but the SUBJECT came from a fixed 13-entry theme list matched first-hit that NEVER checked the ledger — so "the drift the green dashboard hides" shipped FIVE times (07-03/07/08/12/16) and read as the same email. compose-email.mjs (operator 2026-07-16: "the selector should be a prompt that writes out all the parts, including picking the section"): LOCAL qwen ($0, not gated by .thetacog/llm-pause — that flag blocks only the paid Claude lane, so this respects the 07-14 cost cut) picks among pick-passage's dedup-GUARANTEED unsent candidates (chosen by NUMBER, not by copying a long id) and writes a UNIQUE subject + why-today opener. HARD DEDUP GUARD: chosen section ∉ ledger AND chosen subject ∉ ledger, else retry once, else a DETERMINISTIC fallback (top unsent candidate + title-derived unique subject). The send NEVER blocks on the model and NEVER repeats — model up or down. Wired into the controller preview; send-daily already carries pinned.subject_line to the blast, so preview-subject == send-subject. render-email subj scripts/bookclub/compose-email.mjs scripts/bookclub/render-email.mjs scripts/controller/bookclub-daily.sh tests/ops/bookclub-compose.test.js
| chain | ✅ reef sensed — 144 seeds → SimHash in 646ms · grid attached (input seed → SimHash sanity check) · ✅ on-chip 632.97ns/walk · 1.581ms · 7592337 walks/sec · 42 / 144 lit (measured on silicon, this commit) · ✅ triptych rendered · pipeline 585ms · render 265ms · 168 XOR-friction nodes |
| hardware root of trust | serial CXMF9VMM29 · UUID 43C33AB6… · attest MFkwEwYHKoZIzj0CAQYIKoZIzj0D… (ecdsa-p256-sha256 · hw-derived fallback, weaker than Secure Enclave) |
| gate (XOR+popcount) | 0.5380 ns / driven comparison · walk @ gate rate 154.9 ns |
| cache witness | L1 2.74 ns · DRAM 109.23 ns · miss ×39.9 |
| daemon binary | sha256 b409b4c1dedd815b… (the attested silicon path) |
| run receipt | run-2026-07-16T13-02-27-233Z-1a750268 · payload 3db96116b6b2a3a6… · band gold |
| timings | ingest 446.3ms · definer-walk+σ 822ms · render 265ms · pipeline 585ms · ingest = commit-scoped SENSING only (msg + changed files → lattice); deep seed authoring lives in the reef-self-loop, off the commit path |
| walks (this heatmap) | INTENT: 140 hops / 140 chip processes / 140 anchors lit, ended at A2,A3 · A3,B3 · B3,A3 (ply 7 — the definers-of-definers) · REALITY: 142 hops / 142 chip processes / 142 anchors lit, ended at A3,B3 (ply 7 — the definers-of-definers) · walks concentrate at block-heads by the ShortLex-ascending follow |
| per-stage | resolve 0ms · invariants 0.3ms · sense 446.3ms · sigma 0.3ms · binarize 0.1ms · project 18.4ms · xor 0.1ms · walk 55.1ms · claudbridge 48ms |
| walk start | A1,A1 (STABLE attractor) · 282 hops · maxPly 7 |
| σ — defined by its inputs | σ = (cos(intentCloud, realityCloud) − μ of 12 bit-shuffled-reality impostor walks) / sd · INPUTS: intent 21 claims @ θ 0.672 (msg + 0 docs + 1 tests) · reality 69 claims @ θ 0.703 (3 code) · walk topK 2 decay 0.5 ply≤8 budget 2500ms · seed-lib 8a4b87022885 — σ comparisons are only valid at equal inputs |
| σ raw | heat-cosine 0.0625 vs random 0.083 → σ_drift · noise · below zero — this read is noise, not a measurement |
| shortlex-3 projection | 256ms · intent zones 0/3/1713 (+222 cross) · reality zones 0/9/1882 (+259 cross) · zone 3 = candidate children, pre-ratchet |
| orthogonality (seed 144) | 144/144 unique · 143/144 openings · pairwise sim 0.367 · junk 0 |
| intent documents | bookclub-compose.test.js |
Produced on the chip by the running pipeline (scripts/pmu/pipeline.mjs → runPipeline → walk + xor), commit-scoped · on-chip per-walk 632.97ns (this commit). Recompute: node scripts/pmu/commit-triptych.mjs --commit 1ff397309
Commit artifacts (open on a computer — Gmail mobile won't follow file:// links; the inline images above are the phone-viewable form): reef grid · this triptych · the HDL — all three are also attached to this email.