Skip to content

spec(crm-client-workspace): v6 -- client work carries the client's marks - #5893

Open
gHashTag wants to merge 4 commits into
masterfrom
claude/crm-client-workspace-v6-client-marks
Open

gHashTag wants to merge 4 commits into
masterfrom
claude/crm-client-workspace-v6-client-marks

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Closes #5892

What

specs/automation/crm-client-workspace.t27 v6: client work carries the client's marks.

The owner, 2026-10-03, on a client's reel that ended with his call to action: why does it make my CTA and not the client's?

On client work the caller id is the seller's. A prompt keyed on the caller therefore gave a client's content the house's Blogger brief (the house blog, the house offer and the house triptych). It also gave it the seller's 30-day plan and post voice.

What v6 adds

  • content_for(face_of, seller_sweep): a turn is client work when it carries either mark, never because of the caller id.
  • blogger_brief_is_house(client_work): on client work the Blogger gets the client's brief.
  • seller_plan_in_prompt(seller_soul, client_work): the seller's plan and post voice go only into his own turns. His SOUL still speaks the words sent in his name (SELLER_SOUL_SPEAKS_HIS_OWN_WORDS).
  • CLIENT_CONTENT_FROM: what the seller said about this client, else the client's profile and plan, else a neutral default.
  • VERSION is 6, with a matching header note.

Review round 2 (head 1219feb0a)

The host review found two more house marks on client work. Both are now rules in this spec.

  • story_card_from(client_work, card_given, call_given) decides which end card a client's story reel stands on (CLIENT_STORYREEL_NO_HOUSE_PALETTE):
    • STORY_CARD_HERS: her own card, with missing colours completed from the neutral pair.
    • STORY_CARD_NEUTRAL: a call with no card gets the neutral card.
    • STORY_CARD_NONE: neither gives no card.
    • STORY_CARD_AS_GIVEN: the seller's own work goes as given.
    • The neutral pair is NEUTRAL_CARD_DARK #1f1f1f and NEUTRAL_CARD_LIGHT #f5f5f5. It is never the house palette.
  • bot_named_in_speech(client_work): the prompt names the house bot only on the seller's own turns (CLIENT_PROMPT_NO_HOUSE_BOT_NAME).
  • New tests:
    • "a client's story reel never stands on the house card"
    • "on client work the prompt does not say the bot in speech is the house's"

Review round 3 (head a682d9e5b)

The host review refused round 2. The rule fired only on a turn carrying a client mark, face_of or seller_sweep. A reel ordered through the CRM template carries neither: the seller presses, crm_story_reel runs, or she presses herself. The job runs as its payer. So does story_reel called with for_lead from the seller's own thread. On all of these roads her reel still went out on the house card.

v6 now decides the card by whose reel it is. VERSION stays 6, and the v6 header note is extended.

  • reel_is_clients(client_turn, lead_named, lead_is_seller, lead_is_payer) -> client_turn || (lead_named && !lead_is_seller). A reel about a lead who is not the seller is hers, whoever pays. On her own press she is the payer, so whether the lead is the payer is passed in and must change nothing.
  • CLIENT_REEL_IS and CLIENT_REEL_ROUTES name the roads: the client mark, the seller's CRM press, crm_story_reel, her own press, and story_reel with for_lead.
  • CLIENT_REEL_BY_PAYER is false: who pays never decides whose reel it is.
  • The seller's own reel, where he is his own lead, stays his. It goes out as given.
  • New test: "a reel about a lead who is not the seller is hers on every road, whoever pays".

Checks

  • t27c test-report: 21 of 21 pass.
  • tri spec-check ... --seal: 21 of 21 tests, 0 of 21 vacuous, 22 of 22 controls go red on their mutation. The controls live in the host file crm-client-workspace.controls.json.
  • The five new controls:
    • "whose reel is told by who pays"
    • "the CRM template and for_lead are not a client's reel"
    • "no lead named still makes a client's reel"
    • "the seller's own reel counts as a client's"
    • "the reel is the payer's"
  • Sealed: spec sha256 031fa8478618826d1ce886daecaa20225aab34b3026dea771ae2ac1ddbee20e9. The seal records 21 of 21 tests. It was written with a t27c built after fix(seal): seal --save runs the spec's tests and refuses on FAIL (refs #5577) #5605, because older builds drop the tests block.
  • The NOW entry docs/now/2026-10-04-crm-client-workspace-v6-a-client-s-reel-on-every-road.md is included.
  • Round 2: t27c test-report 20 of 20, sealed at 094798669699aed8baa07fa53964bed949e8086990aad1f849f522e7e035f491.
  • First round: a negative control turned "work for a client is told by its marks, never by the caller id" red when seller_sweep was dropped. After merging master 7943bc412, sync --check and mutants --check passed.
  • spec-guards is red on this PR and on master (e7ccf9e5d, aca71b57f, 17779ec77) for the same reason: ring-090 disagrees with specs/fpga/simulator.t27. It does not involve this spec.

Host binding

gHashTag/999-multibots-telegraf#3569, branch fix/house-marks-audit-wave-2.

  • Code that reads v6:
    • chat.ts: marketplaceAgentPrompt, systemPrompt, runAgent, and botNamedInSpeech / systemFor.
    • client-work.ts: onClientWork, plus reelIsClients, which mirrors reel_is_clients.
    • story-template.ts: the story job marks its turn clientReel from lead versus seller, never from the payer.
    • story-reel-tool.ts: ctx.clientReel ?? reelIsClients(...), passed on to reel_render. Also storyCardFrom, clientStoryCard and clientStoryReelProps.
    • tools.ts: reel_render fills her card when the turn has a client mark or clientReel. The fill runs before the fingerprint, the twin lookup and the charge.
  • Vendored spec: render/src/spec/crm-client-workspace.t27 is byte-identical to this PR's head a682d9e5b (sha256 031fa847…20e9).
  • Binding: every test is bound by an identical title in crm-client-workspace.test.ts, 21 of 21. check-t27-specs.mjs returns rc 0 and reports 19 specs bound with every law holding.
  • Host mutants: 26 of 26 killed for crm-client-workspace, 3 of them new (the mirror function). For client-work, 17 of 17 killed, 8 of them new route mutants; their test runs the real chain from the job or crm_story_reel, through story_reel, to reel_render.

The host PR carries the house-marks classification table. That table records an open question for the owner: should the farm's catalogue and the farm's bots count as house marks? The shared detector (crm-story-reel HOUSE_MARKS) does not read them today.

🤖 Generated with Claude Code

On client work the caller id is the seller's, so a prompt keyed on the
caller gave a client's content the house's Blogger brief and the seller's
30-day plan and post voice. A turn is client work when it carries faceOf
or sellerSweep (content_for); there the Blogger gets the client's brief
(blogger_brief_is_house) and the seller's plan stays out
(seller_plan_in_prompt). Content: what the seller said about this client,
else the client's profile and plan, else neutral.

Tests: 18 of 18 pass (t27c test-report); 0 of 18 vacuous; negative
control (content_for without seller_sweep) turns one test red.

Closes #5892

phi^2 + 1/phi^2 = 3 | TRINITY

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

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

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 03:48:25 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 44
PRs with All Checks Green 6
READY 5
FAILING 44
PENDING 0
NO CHECKS YET 0

These columns do not partition: 5 + 44 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != 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

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 05:19:34 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 45
PRs with All Checks Green 5
READY 4
FAILING 45
PENDING 0
NO CHECKS YET 0

These columns do not partition: 4 + 45 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != 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

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

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

This was referenced Oct 4, 2026
…name on client work

Two of the house's marks still reached client work after v6.

A StoryReel rendered for a client with no end card, or a card short of a
colour, stood on the house's card (gold on black, a green button): the
composition fills whatever is missing with it. On client work her colours
are kept, a missing one is the neutral ink or ground that reads against
hers, and a call with no card stands on the neutral card -- settled before
the twin lookup and the charge (story_card_from, STORY_CARD_*,
NEUTRAL_CARD_DARK / NEUTRAL_CARD_LIGHT).

The prompt told the model on every turn that the bot in speech is the
house's; on client work that line is not said (bot_named_in_speech).

VERSION stays 6: the v6 note is extended (same day, same PR, unmerged).

Tests: 20 of 20 pass (t27c test-report); 0 of 20 vacuous
(validate-vacuity over this spec alone). Negative controls: story_card_from
returning AS_GIVEN for her card, and bot_named_in_speech returning true,
each turn exactly one test red.

Refs #5892

phi^2 + 1/phi^2 = 3 | TRINITY

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 08:07:37 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 42
PRs with All Checks Green 8
READY 2
FAILING 42
PENDING 0
NO CHECKS YET 0

These columns do not partition: 2 + 42 + 0 + 0 = 44, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=b45a356c2eb6 != 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

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-04 09:59:07 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 43
PRs with All Checks Green 7
READY 2
FAILING 43
PENDING 0
NO CHECKS YET 0

These columns do not partition: 2 + 43 + 0 + 0 = 45, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=2bb99f4036f1 != 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

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

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

This was referenced Oct 4, 2026

This branch has not been deployed

No deployments
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.

crm-client-workspace v6: client work carries the client's marks (no house Blogger brief, no seller plan)

1 participant