spec(crm-story-reel): v22 -- a client's reel carries the client's call - #5811
Conversation
…ions, the widget call, RU+EN The owner's hook reel of 2026-10-03 becomes TEMPLATE_HOOK_STUDIO: the source photo, four studio shots, a hook first, the person's own voice, captions, the pause and a call to @t27ai_bot. English lines live here; the host keeps the Russian ones. The CRM lists templates from the server and every line stays editable before the press. Every story reel carries yellow word-by-word captions heard from each clip's own soundtrack; a line whose word count matches is shown as written. The pause draws the call the way the reel widget does. 44/44 pass, 0 vacuous; controls on line_fits_chars and cta_card_shown caught. Closes #5691 Closes #5692 Closes #5693 Closes #5694 Refs #5690 phi^2 + 1/phi^2 = 3 | TRINITY Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tudio The writer of a topic reel was told "one NEW setting per scene, never repeat the background", so every reel the owner pressed for herself, and every reel a seller ordered by a topic alone, put the person in invented places and paid a still and a face check per scene -- while a seller's template stayed in the studio. NEW_SETTING_EACH_SCENE is now false. WRITER_WRITES_SETTINGS=false: the writer is asked for lines only. WRITER_SETTING_DROPPED=true: a place it returns anyway is dropped by code before the job keeps its scenes, not left to the prompt. setting_drawn(from_writer, has_setting): a place is drawn only when a caller names it in a script of their own. 45/45 pass, 0 of 45 vacuous; 48/48 negative controls caught, five new ones on setting_drawn and the three constants. Closes #5765 Refs #5697 phi^2 + 1/phi^2 = 3 | TRINITY Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v22: a reel made for a client never carries the house's mark. The template's call and button stay on the house's own reel (HOUSE_CALL_ON_CLIENT_REEL, HOUSE_BUTTON_ON_CLIENT_REEL false). call_from and profile_call_from: the seller's word for this reel, else hers -- story_reel.cta, approved_cta, the default. button_from: the seller's, her kept card, her profile, or none. word_taken and house_word_replaced: a given call or button naming the house (HOUSE_MARKS) is replaced by hers and said in the answer. last_line_way: the template's last line ends with her call when it fits; TEMPLATE_LINES_KEPT lines stay the template's story. voice_of: a client turn speaks her voice; a client turn naming another client is refused before any spend. VERSION 22, seal resealed. Closes #5802 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
|
Host PR: gHashTag/999-multibots-telegraf#3563 (head c13fcdf0e). Vendored crm-story-reel.t27 is byte-identical. 113/113 mutants killed, 70/70 controls. Merge order: this, then 999#3563. These reds are not from crm-story-reel.t27:
🤖 Generated with Claude Code |
|
Reviewer bee: not merged. The call and the button are right, but a client's template reel still SPEAKS the house. What must change:
What I verified and you can keep: VERSION 22 = the last dated note; ASCII; TRINITY lines; module. |
The refused v22 kept TEMPLATE_LINES_KEPT = 3 template lines unchecked, so a client's template reel said "This isn't me talking. This is Trinity." in her own voice and her template list showed it. That contradicted split-reel v7. line_way and line_names_house: no line of a client's reel names the house -- template lines, lines the agent, the writer or a seller wrote or edited, captions and the end card -- unless it is the person's own words typed this turn. Every template line on her reel is its house-free client version, the first as much as the last (CLIENT_VERSION_NAMES_HOUSE false), and a client's list shows only those (CLIENT_LIST_HOUSE_FREE). Any other line naming the house is refused before anything is spent (charged, REFUSED_BEFORE_SPEND). TEMPLATE_LINES_KEPT is gone. Tests cover every path; the host carries the control "template line naming the house kept on a client reel". VERSION stays 22; seal resealed. Merges master (split-reel v7). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR DashboardGenerated at: 2026-10-03 22:18:38 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
|
Reviewer bee: not merged. Re-review at df8c144. The rule is right now, and every check I ran passes:
What must change:
Non-blocking: L1 TRACEABILITY is red because df8c144 has no |
Round 3 review of #5811: "the person's own words" was judged on her whole message, so once a seller named the bot anywhere ("Trinity, make Masha a reel"), every house name on the client's reel passed. Sellers address the bot by name, so that was the common case. own_words and line_from: a line naming the house is hers only when the whole line, or each house name in it with up to OWN_WORDS_REACH (2) of the line's words either side, is in what she typed this turn -- case, punctuation and spaces aside. NAMING_THE_BOT_LENDS false: her message naming the house lends no line anything. Vectors: "Trinity, make a reel" + "This is Trinity" is refused; "at the end let it say: Write to Trinity" + "Write to Trinity" stands. The header and the line_way comment say what own words means. charged is the same body as split-reel v7's. A `use a::b;` still generates no import (#5718), so it is blessed in tools/duplicate_bodies_baseline.txt (charged 2), the documented way. VERSION stays 22; seal resealed. Refs #5802 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-10-03 23:14:01 UTC
Summary
Seal Status
|
What
specs/automation/crm-story-reel.t27v21 -> v22. Branched on v21 (#5766, merged).masteris merged in, now with split-reel v7 (#5785,62c105ed2).The hole. The owner, 2026-10-03: a reel made for a client ended with the house's call, not hers. Two roads in the 999 render did this:
crm_story_reelwith a template (v20). The press took the template's call ("Write to Trinity") and button (@t27ai_bot) over her approved call, and the template spoke the house's name aloud.story_reelwithfor_lead. The call was whatever the agent wrote, the end card came only from the arguments, and in a client turn with nofor_leadthe reel spoke the seller's clone.Round 2: the leak the first v22 left (reviewer, "not merged")
The first v22 kept
TEMPLATE_LINES_KEPT = 3template lines unchanged and checked only the last. A client's template reel then said "This isn't me talking. This is Trinity." in her own voice, and her template list showed it. That contradicted split-reel v7.TEMPLATE_LINES_KEPTis gone.The rule: no line of a client's reel names the house -- template lines, lines the agent, the writer or a seller wrote or edited, so no caption either, and no call or button on the end card -- unless it is the person's own words typed this turn.
line_way(names_house, own_reel, from): on a client's reel a template line becomes its CLIENT VERSION (LINE_CLIENT_VERSION), the first as much as the last. A written or edited line naming the house isLINE_REFUSED. A line from the person's own words this turn (LINE_FROM_PERSON) is kept. The house's own reel keeps every line.line_names_house(way, names_house): what ends up spoken.HOUSE_LINE_ON_CLIENT_REEL = falseandCLIENT_VERSION_NAMES_HOUSE = false.CLIENT_LIST_HOUSE_FREE: a client's template list shows only the client versions.charged(refused)andREFUSED_BEFORE_SPEND: a refusal comes before the charge, so a refused press costs nothing, as split-reel v7 refuses it.HOUSE_MARKS= 5 (bot as spoken, delivery bot, brand, product, plus the Russian spelling host-side). The wording of the client versions stays in the host; the spec holds only the property.Round 3: "own words" is judged line by line (reviewer, on
df8c144ad)Round 2 read "the person's own words" off her whole message. Once a seller named the bot anywhere, every house name passed -- and sellers address the bot by name, so this was the common case. Probe: "Тринити, сделай Маше рилс по шаблону" kept the agent's "Это Тринити говорит за меня." on the press, and
story_reelfor_lead let "Напиши Тринити" through.own_words(line_in_said, phrase_in_said, said_names_house)andline_from(own): a line naming the house (caption, call or end card) is hers only when that line -- the whole line, or each house name in it with up toOWN_WORDS_REACH(2) of the line's words either side -- is in what she typed this turn, read as words (case, punctuation and spaces aside).NAMING_THE_BOT_LENDS = false: her message naming the house anywhere lends no line anything.OWN_SAID_ADDRESS_EN"Trinity, make a reel" +OWN_LINE_ADDRESS_EN"This is Trinity" -> refused, nothing charged;OWN_SAID_QUOTE_EN"at the end let it say: Write to Trinity" +OWN_LINE_QUOTE_EN"Write to Trinity" -> kept.line_waycomment now say what "own words" means.return said_names_house && NAMING_THE_BOT_LENDS;->return said_names_house;), caught, plus four more on the rule.The duplicate
charged: blessed, the documented wayfn chargedhas the same body as split-reel v7's. Reuse is not possible yet: ause a::b;still generates no import (#5718, open; re-filed from #4610), so no spec can call another spec's function. Asdocs/now/2026-10-02-duplicate-body-ratchet-green-on-master.mdand #4497 did for seven cross-file copies, the copy is recorded intools/duplicate_bodies_baseline.txtin the same commit: one row,charged 2(python3 tools/dupe_scan.py --bless). The spec comment abovechargedsays so.Kept from round 1:
call_from/profile_call_from,button_from,word_taken/house_word_replaced,last_line_way(the last line ends with her call when it fits), andvoice_of.VERSION stays 22 (the PR had not merged); the v22 header note is extended, not re-dated. The round-3 commit
78f6d5567carriesRefs #5802; no force-push.Checks (from output)
t27c test-report --verbose: pass 55, FAIL 0, rate 100.0%.t27c validate-vacuity --specs-dir specs/automation:TOTAL over 18 specs: tests=275 vacuous=0 (0.0%).t27c seal --save, thent27c validate-seals --pr-files specs/automation/crm-story-reel.t27:OK specs/automation/crm-story-reel.t27 (seal match).python3 tools/dupe_scan.py --self-test: ok, 11 shapes;python3 tools/dupe_scan.py:ok: no new duplicate body, and none of the known groups grew.(rc 0).tri spec-check:== spec-check green -- crm-story-reel.t27: 55/55, 0 of 55 vacuous, 84/84 controls, including "template line naming the house kept on a client reel" and "message-level own-words".7dfce95f9):-- 129 of 129 killed --, rc 0, including "v22: any mention of the bot lends the name" and "her whole message is read, not the line (round 2 rule)". Host vitest 4 files: 203 passed.Host: gHashTag/999-multibots-telegraf#3563. The house-name detector, and now the line-level own-words reading, live in ONE shared module there,
apps/vibee-editor/render/src/house-names.ts, which split-reel's #3560 imports.Closes #5802.
🤖 Generated with Claude Code