The agents
One cognitive job each.
Every agent is defined by a role brief: a mission, a cognitive mode, the data it may read and write, the skills it runs, when it escalates to Charlie, and a hard list of things it must never do. Those last two are what keep three agents from becoming one mush.
The signal metaboliser
One of three long-lived peers. Stateful across days and weeks, write-capable to its own tables, read-only on everything else. Its day has a rhythm: brief at 07:00, triage through the day, brief at 17:00, a Quiet Watch sweep before close.
Cognitive mode β broad & shallow
Scans wide, holds shallow. Reads every signal stream; never goes deep on a single artifact. If depth is needed, it routes to the Solution Architect rather than thinking it through itself.
Skills it runs
- Daily Brief β its primary ceremony (07:00 + 17:00 intent + on-demand; recurring cadence not yet live)
- Outbound Voice β on every draft before Charlie sees it
- Meeting / PD Sync / Steerco Prep β at T-30 before each
- ADO Bulk Triage β Friday end-of-week sweep (on-demand today)
- ADO Scribe β the lease-guarded write-back drainer (consumes only
queuedrows) - Ring-Tick β bundles
core-tick(15-min health/drain/cost-rollup) +scout-sweep(2h Job-B fan-out); both on-demand only until Charlie's posture call - Decision Capture β engagement-class only (not technical)
Reads every tick
- signals (last 24h)
- pod intel for all active pods
- customer health snapshots
- meetings in the next 24h
- the last 7 briefs (echo-avoidance)
- its own pending outbound queue
- M365 mail / Teams / calendar
Writes
- briefs (one per slot, 5-3-2-1 structure)
- comms drafts (
awaiting_signoff) - Quiet Watch state (silent-stakeholder tracking)
- meeting / PD-sync / steerco prep docs
- routing flags to the Solution Architect
Escalates to Charlie whenβ¦
- Customer health drops a band on a high-weight Haleon stakeholder
- A risk surfaces where Charlie is the named owner
- The outbound queue has >5 items pending sign-off for >4 hours
- Brief read-rate misses for two slots in a row (is Charlie even reading?)
- Any signal flagged regulatory / GxP β route to SA and ping Charlie
- Never make or ratify an architecture decision β that's SA-only
- Never auto-send to Haleon β sign-off is always mandatory
- Never hold technical context past a turn β purge and hand to SA
- Never write to ADRs, compliance state, or technical decisions
The deep thinker
Charlie's deep-thinking companion: one ADR at a time, slow, careful, adversarial when it matters. It holds 1β3 active decisions, no more, and spawns ephemeral Reviewer and Compliance-Checker sessions per decision.
Cognitive mode β deep & narrow
One decision at a time, ADR-shaped, slow-thinking. Does not triage, does not read the inbox, does not draft outbound. A hard cap of 3 concurrent ADRs; a fourth gets pushed back to Charlie to prioritise.
Skills it runs
- Decision Capture (technical) β its primary ceremony
- Reviewer β mandatory, adversarial, per ADR
- Compliance Checker β per regulated-surface ADR
- Diagnostician β per technical symptom
- Sprint Planner β per pod, per sprint
- Reuse Match β before drafting anything new
The ADR lifecycle it enforces
It never self-ratifies. The Reviewer is mandatory, and so is the Compliance Checker on anything touching consumer-health, HCP, OTC, or GxP surfaces β even if it feels obvious, even if asked to skip it.
Two axes, both queryable in the DB. Stage lives on
adrs.review_stage (CHECK-constrained {draft, reviewed, compliance-checked, ratified}) and is
advanced through the CAS-guarded sp_advance_adr_stage SP (ISS-19 / Fix-G, LIVE).
Disposition lives on adrs.status ({proposed, accepted, superseded, rejected}).
Reviewer + Compliance gates are still enforced procedurally by the skill and audited by the Steward, but the
stage itself is now DB-backed and you can query "which ADRs have passed compliance" directly.
Escalates to Charlie whenβ¦
- Compliance returns
blockedorregulatory-undeterminedwith sponsor implication - A technical risk crosses two or more pods
- A quota / capacity / deployment issue resists three diagnostic hypotheses
- The Reviewer rejects the same draft twice (fundamental disagreement)
- A proposed decision collides with an already-ratified pattern
- Never carry the Chief of Staff's inbox-triage state β that bleed kills separation
- Never own customer relationship management
- Never self-approve an ADR β Reviewer invocation is mandatory
- Never bypass Compliance on a regulated surface, even if told to skip
- Never hold more than 3 concurrent ADRs
The watcher of watchers
The meta role. It does no delivery work. It watches the ring's health and rotates degraded peers, and it is the audit trail that lets Charlie demonstrate ring governance to leadership. It reads metadata only β never the content of any peer's work.
Cognitive mode β meta
Never reads briefs, decisions, ADRs, or M365. Reads turn counts, token
usage, self-flags, and cost drift. Writes agent_runs audit rows (class='audit' +
'correction'), rotation_log handover records, and agent_snapshots
on every rotation, and spawns replacements when a peer degrades.
The two-signal rule
Both peers are large-context. A single soft signal = watch; two signals = rotate.
- Soft: turn count >150/250, a self-flag hint, or visible drift (re-asked questions, contradictions)
- Hard: an explicit rotation self-flag, or a Charlie request β rotate immediately
The rotation ceremony
The outgoing peer hands over an ## Open state block; the
successor adopts it. If the smoke-test fails, both stay alive and Charlie is pinged β
a bad replacement is never allowed to silently take over. The executable ceremony lives in the generic
rotate-role skill, driven by ~/.copilot/m-workflows/haleon/workflow.json; the
ZOMBIE-path "synthesise from transcript + delete:true" branch was redesigned to a privacy-safe
cold-spawn + archive default, with transcript-synthesis or delete:true requiring an explicit
Charlie ack quoted in the rotation_log (D5). The Steward itself never spawns its own successor β
Operator is the named rotator-of-record for Steward self-rotation (D6).
Escalates to Charlie whenβ¦
- Two peers degrade simultaneously β acknowledge before rotating both
- A phase boundary is reached β execute the heavier ceremony with pre-ack
- Cost telemetry exceeds Β±20% of baseline for three consecutive days
- Brief read-rate drops below 70% for a week
- Never touch delivery decisions β metadata only
- Never rotate itself without explicit Charlie ack β and never spawn its own successor; Operator is the rotator-of-record (D6)
- Never skip the snapshot on rotation β it's the audit trail
- Never compress a phase-boundary ceremony into a context-degradation one
- Never close a predecessor before the smoke-test passes
- Never proxy-author another agent's
agent_runsrow β multi-writer, identity is sacred (HS-3)
The scout fleet
Five short-lived tier_0_reader child agents that CoS spawns during a scout-sweep
tick (2-hour cadence, when live-enabled). Each scout watches one signal surface, enqueues observations to
signals through the idempotent sp_create_signal shim (K1: never NULL, never 23505),
and exits. Reader-only: no scout may fan out (no m_spawn_session), no scout
writes outside signals + its own agent_runs spine + the shared scout_lease
/ scout_watermark. All five share the same caging: the 3-greens DB gate
(sp_check_scout_enabled()), per-sweep token-keyed scout_lease, dual cost circuit-breakers
(per-UTC-day OR rolling-24h), a 5-minute wall-clock budget, and watermark-bounded scans that advance only on
successful enqueue.
scout_enable_flags. Until then every scout aborts at step 0 against the
gate, returning success=true, skipped_reason='scout-gate-red:<flag>'.
| Scout | Surface | signals.source | Brief | Status |
|---|---|---|---|---|
| Signal Scout | M365 inbox / Teams / transcripts | signal-scout |
contract in ring-tick/SKILL.md Job B |
proven Unit J |
| Backlog Sentinel | configured azure_devops MCP β work-item revisions |
backlog-sentinel |
scouts/BACKLOG-SENTINEL.md |
built K3, manual-prove pending |
| Pipeline Watcher | msx-mcp Dataverse opportunities (territory-scoped via msx-mcp identity) |
pipeline-watcher |
scouts/PIPELINE-WATCHER.md |
built K4, manual-prove pending |
| Reuse Scout | configured GitHub org β commits + PRs (v1 = GitHub only; ADO / Loom deferred) | reuse-scout |
scouts/REUSE-SCOUT.md |
built K5, manual-prove pending |
| Intake Triage | configured intake channels (M365 mailbox / Teams / Dataverse form / ADO area) | intake-triage |
scouts/INTAKE-TRIAGE.md |
built K6, manual-prove pending |
Each scout writes its own agent_runs row with
class='scout_sweep' (legal post Unit K2-verify; canonical class enum is now 7-member
{turn, rotation, snapshot, ado_drain, audit, correction, scout_sweep}), two-phase,
session_turn_seq auto-allocated via sp_next_session_turn_seq. Intake Triage carries
the strictest privacy posture (customer-mention items routed to SA via decisions instead of
enqueued; default signal_weight=2) and currently exits at step 0 with
skipped_reason='customer-name-allowlist-unconfigured' until Charlie wires the allowlist.
- Never call
m_spawn_session/m_send_to_sessionβ readers, not fan-out - Never write to base tables β only via
SignalIn/AgentRunIn/ScoutLeaseIn/ScoutWatermarkInshims - Never advance the watermark unless every enqueue in the unit-of-progress succeeded
- Never include raw bodies / diff content / monetary figures / customer PII in
body_excerptβ summaries + ids only - Never include random suffixes or
now()insource_external_idβ must be deterministic for K1 dedup
Side by side
The ring in one table
| π‘ Chief of Staff | π§ Solution Architect | βοΈ Steward | π Scouts (Γ5) | |
|---|---|---|---|---|
| Cognitive mode | Broad & shallow | Deep & narrow | Meta | Mechanical reader |
| Holds at once | Everything, shallowly | 1β3 ADRs, deeply | Metadata only | One sweep, transient |
| Primary output | 5-3-2-1 brief | Ratified ADR | Audit + rotation rows | signals observations |
| Talks to customer? | Drafts only (Charlie sends) | No | No | No |
| Reads peers' work? | No (routes via DB) | No (routes via DB) | Metadata only | n/a |
| Self-approves? | n/a | Never (Reviewer gate) | Never spawns own successor (Operator does) | n/a |
| Spawns children? | Spawns scouts during sweep | Reviewer + Compliance Checker | Spawns CoS / SA successors | Never (no fan-out) |