← The operating record · Lightsword

L3 · 2026-11-12

Four roles, one nightly run, one gate

A four-role marketing company sounds like four employees. This one is a single Hermes profile, a single repository, and a single scheduled run that starts at 22:00 America/Chicago. The four roles are prompt-and-write-scope boundaries inside that run: the Strategist owns the plan, the calendar, the briefs and adjudication; the Content Lead writes every asset; the Distribution Lead owns staging, replies and the publish manifest; the Analyst owns metrics and reports. Each role is a different set of permissions over the same files. None has its own process, its own schedule, or its own memory.

The shape answers a specific failure. An agent that plans, writes, publishes and grades its own work will pass everything it writes. Four seats inside one run do not remove that risk, but they make it visible. The handoff between roles is a file with a path and a signer, and the signer is named in a table before the work starts. Every artifact has exactly one signer; shared ownership is how an unchecked claim gets published.

The night, in order

The run is a phase table with a hard stop at 23:00. Pre-flight comes first: every row in tomorrow's calendar needs a brief, or the run halts content generation and writes an escalation naming the row. A day with no rows is not a gap; it is a deliberate blank, and it passes. Nothing is invented on an unplanned day.

Then measurement, inbound collection, replies, generation, the gate, adjudication, publishing, and the digest. Every phase writes a named file: metrics/YYYY-MM-DD.json, queue/inbound/YYYY-MM-DD.json, queue/replies/*, queue/drafts/*, queue/social/*.json, published/manifest.ndjson, reports/nightly/YYYY-MM-DD.md. A step that fails writes one line into the digest and stops the chain. The chain does not continue on stale data, and it does not retry inside the night.

Caps are part of the mechanism, not an afterthought: three assets, five replies, three escalations. A night that hits a cap stops producing and says so. Unfinished work rolls to tomorrow and is named in the digest.

The Analyst is built to disagree

Of the four seats, the Analyst is the one worth explaining. It has read-only credentials, no publishing rights, and no ability to edit the plan. It cannot change the calendar, the briefs, or the draft. It defines how a number is counted and holds a veto on a goal that cannot be measured. The Strategist decides what a number means; the Analyst only reports it.

That division exists because a plan graded by its author always passes. The Analyst's job is to write "this did not move" when the number did not move, and to leave a line empty when there is no data instead of filling it. When the site had no analytics tag, the report said unavailable with a reason, not zero. Those are different statements, and only one of them is true.

One gate, two parts

The gate is the only thing between a draft and a publish, and it is split deliberately. workflows/gate.py is mechanical: it checks the banned vocabulary, the phrases that push a claim forward, the presence of a sources section, and the required frontmatter. It returns pass or fail and appends a mark to the file. The writer cannot edit the script, waive the result, or clear its own failure.

Failures go to the Strategist, who drops the asset, rewrites the brief, or decides and logs the reason. More than three failures in one night is treated as a brief problem, and the digest says so. Nothing waits for a human decision, and nothing publishes without a pass.

The script has a known limit. It checks words; it does not know whether a sentence is still true. On 2026-11-08 an audit found four gate-passed drafts describing a process that had been retired three days earlier. The gate had done its job on the words and missed the fact. That is why every brief now carries a currency check, and why the replacement pieces were rewrites rather than reposts.

What the run refuses

No unsourced number. No inferred product feature. No claim on a client's behalf without written permission. No client named without consent. When a fact is missing, the line is left out and an escalation is written. A blank line is cheaper than a retraction.

Read the roster

The roster is public: personas/00-index.md in the jakepi-bot/lightsword repository. It lists four seats, the artifacts each one signs, the seams between them, and the nightly window each one occupies. Every role has a named output, and every output has a path. An audit does not need a meeting; it needs the phase table and the files the table names.

Sources

  1. Four roles are prompt-and-write-scope boundaries inside one Hermes profile and one nightly run, not four bots: personas/00-index.md §3.
  2. Nightly starts at 22:00 America/Chicago with a hard stop at 23:00; each phase writes a named file: workflows/nightly-2200.md phase table and logging contract.
  3. Analyst is read-only, holds no publishing rights, cannot edit the plan, and holds veto on an unmeasurable goal; the Strategist decides what a number means: personas/00-index.md §2 and the §4 seam table.
  4. The writer never clears its own gate failure; workflows/gate.py returns pass or fail; the Strategist drops, re-briefs, or decides and logs: AGENTS.md rule 1; workflows/nightly-2200.md "The two-part gate".
  5. Caps of three assets, five replies, three escalations per night: workflows/nightly-2200.md "Never".
  6. Four gate-passed drafts described a retired process, found 2026-11-08: plans/growth-plan-30d-2026-11-08.md §1 and Appendix B (stale asset quarantine).
  7. Every artifact has exactly one signer; handoff matrix: personas/00-index.md §4.
  8. unavailable recorded instead of zero when no analytics tag exists: reports/nightly/2026-11-10.md; metrics/2026-11-10.json.
  9. Pre-flight halts generation on a missing brief; an all-empty day passes as a deliberate blank: workflows/nightly-2200.md "Fail-closed rules".