Skip to content

spec(automation): crm-story-reel -- lead magnet 2 from the client's face and own voice - #4850

Merged
gHashTag merged 1 commit into
masterfrom
claude/loving-mccarthy-llkh92
Sep 27, 2026
Merged

gHashTag merged 1 commit into
masterfrom
claude/loving-mccarthy-llkh92

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Pull Request Checklist

  • PR title follows semantic convention: spec(automation): ...
  • PR body includes Closes #4849
  • A docs/now/2026-09-27-crm-story-reel-lead-magnet-2-from-the-client-s-face-and-own.md entry is added (written with tri now add ... --closes 4849)
  • Tests added: 11 braced test blocks, executed by t27c test-report (11/11 pass)
  • Spec added → seal saved: .trinity/seals/automation_automation::crm_story_reel.json

Description

Closes #4849

This is the spec of record for the CRM story reel in 999-multibots-telegraf, lead magnet #2. It is a short vertical reel about the client's own business, built from:

  • the client's avatar (the face);
  • a clone of the client's own voice notes (the voice).

The reel is three scenes with a new setting in each and one line per scene in that voice. The scenes are lip-synced, cut together, and end on a pause with the call to action.

What the spec fixes, as constants plus pure functions that the tests exercise:

  • Who qualifies: FACE_REQUIRED and VOICE_REQUIRED, nothing else. The clone is made only from the client's own voice notes and is kept per seller.
  • Cost to the caller:
    • 8 tokens per still (Kie google/nano-banana-edit);
    • 12 per line (Replicate minimax/speech-02-turbo with the clone);
    • 16 per second of lip-sync (kie/kling/ai-avatar-standard);
    • 2 per cut.
    • price_estimate(3, 13) == 270, and that estimate is named to the caller before the press. VOICE_ON_KIE = false: Kie has no voice cloning, so the voice step has no fallback.
  • The job: story_jobs rows with BEAT_MS < DEAD_MS < SWEEP_MS, JOB_ATTEMPTS = 3, and PAID_WORK_REDONE_ON_RESUME = false.
  • Delivery:
    • nothing is sent without the owner's press;
    • there is one pressable card per person, and a card never displaces one the owner has not answered;
    • a reel the client asked for herself never goes to a group;
    • a render requested through the service key waits for approval in the feed.
    • AUTOPILOT_SENDS_CARD = false is stated plainly as not wired yet.

Why it matters: the owner has said that t27 is the language everything is eventually rewritten in. Until now, 999 has cited specs only in comments, so nothing failed when code and spec disagreed. This is the first spec the host generates from: t27c gen-ts output is vendored into the host, and the host imports its numbers from it. The host PR that does this follows.

Changes

  • specs/automation/crm-story-reel.t27: the new spec.
  • .trinity/seals/automation_automation::crm_story_reel.json: its seal.
  • docs/now/2026-09-27-crm-story-reel-lead-magnet-2-from-the-client-s-face-and-own.md: the entry.

Testing

cargo build --release -p t27c -p tri        # t27c 0.4.0
T=./target/release/t27c
$T parse specs/automation/crm-story-reel.t27            # ok
$T spec-status specs/automation/crm-story-reel.t27      # IMPLEMENTED
$T test-report specs/automation/crm-story-reel.t27      # 11 tests, 11 pass (Zig 0.16.0)
$T validate-vacuity --top 700 | grep crm-story-reel     # 11 tests, 0 vacuous
$T gen-ts specs/automation/crm-story-reel.t27           # 117 lines of typed declarations

The tests can fail: in a negative control I broke two asserts on purpose (price_estimate(3, 13) == 271, card_may_show(1)), and test-report reported 2 FAIL. The file was then restored.

Review Notes

On this checkout, four spec gates are already red on master without this PR. I ran each one with the three new files moved aside and again with them in place, and compared the output:

Gate Without this PR With this PR Difference
published_figures.py --check rc=1 (9 figures drifted) rc=1 test blocks 13473 → 13484 (+11), already drifting
check_seal_coverage.py rc=1 rc=1 identical output
check_seal_currency.py rc=1 (hundreds of stale seals) rc=1 +1 current seal (this one)
check_specs_generate.py rc=1 (a Pipe token in another spec) rc=1 identical output

tri mods orphan --gate is clean. check_catalog_count.py and check_catalog_integrity.py are OK. The dupe_scan.py errors name other functions (bytes_eq, digest_for, …) and none from this spec.


φ² + 1/φ² = 3 | TRINITY

🤖 Generated with Claude Code

https://claude.ai/code/session_01ScHVrGSr6zZUdwkdC8DR9k


Generated by Claude Code

…ace and own voice

Closes #4849

specs/automation/crm-story-reel.t27 (module automation::crm_story_reel) is
the spec of record for the story reel of 999-multibots-telegraf: who
qualifies (a face and a voice, nothing else), what each step costs the
caller (8 / 12 / 16 per second / 2 tokens, 270 per reel, named before the
press), how the job survives a redeploy (story_jobs, heartbeat, sweep, paid
work never redone), and where the reel goes (one press of the owner, one
pressable card per person, never displacing an unanswered one, never into a
group on the client's own press; a service render waits for approval in the
feed).

It is the first spec the host generates from: `t27c gen-ts` of this file is
vendored into the host and the host imports its numbers from it.

Checked with the real compiler (t27c 0.4.0 from bootstrap, Zig 0.16.0):
parse ok, spec-status IMPLEMENTED, test-report 11/11 pass, validate-vacuity
0 of 11 vacuous; a negative control with two asserts broken on purpose gives
2 FAIL. Seal saved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ScHVrGSr6zZUdwkdC8DR9k
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-27 03:26:27 UTC

Summary

Status Count
Total Open PRs 37
PRs with Failing Checks 33
PRs with All Checks Green 4
READY 3
FAILING 33
PENDING 0
NO CHECKS YET 0

These columns do not partition: 3 + 33 + 0 + 0 = 36, and there are 37 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=403499176a5d != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

Copy link
Copy Markdown
Owner Author

Seven checks are red on this PR, and all seven are red on master without it. They are the same set that was red on #4846, the last PR merged before this one:

Check #4846 (merged) this PR
gate-topology failure failure
spec-guards failure failure
Documented t27c subcommands exist failure failure
Corpus ratchet (expected-failure ledger) failure failure
duplicate-bodies failure failure
coverage failure failure
emit-bitexact failure failure

I ran the spec gates behind them locally, once with this PR's three files moved aside and once with them in place, and diffed the output (table in the PR description). The only differences are +11 test blocks (the pin was already drifting) and +1 current seal. dupe_scan names other functions (bytes_eq, digest_for, forwardPass, session_status_str, shift_ir). No fix for the base failures exists yet, and none of them is in this PR's files.

L1 traceability, the linked issue, NOW freshness, parse-ratchet and the GitGuardian scan are green.


Generated by Claude Code

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.

spec: crm-story-reel.t27 -- lead magnet #2 (face + own voice), generated into the host via gen-ts

2 participants