← docs · ADR

The beat is a pure round-robin scheduler; one shared pipeline carries every producer skill

The beat holds no judgment — it is a pure round-robin scheduler over the producer-skills [report, map, research, plan, …], carrying only rotation state (whose turn it is). Theme-choice and production belong to the skill, not the beat: when a producer's turn comes it points itself at the most Worthwhile theme against Direction + delta, then produces. The whole dispatch is ONE shared pipeline definition — a single file, outside the skills — that every producer funnels through: pre-dispatch (assemble + delta) → producer-loop (the shared scaffold) → close (review gate + publisher). This amends ADR-0004: it evacuates judgment from the beat (0004's loop chose-theme-and-produced; now the skill does both), and it honors ADR-0008 — the close at the skill's exit observes the same effects a standalone /ed-report does.

Status

proposed (2026-06-08; Close-architecture rewrite, Story S4)

Context

judgment** — it chose the Worthwhile theme and produced the one Artefato. Two problems surfaced in the Close rewrite:

breadth a function of that loop's taste; over many beats the rotation narrows to whatever the loop favors. Breadth should come from rotation, aim from Direction — two different organs, welded in 0004.

read-the-world, produce, review, publish. The legacy consolidate-state + _shared/ trio was the only common ground, and it was a YAML-driven monolith.

the close-time act is no longer "consolidate the session" — it is publish the Artefato. The close pipeline can therefore be thin: review + publish, with session-digestion already handled upstream by the sweep.

protocol (a fixed gate with a bounded bounce) is a different construct from that retry loop — it is a gate, not a re-invocation rail — and is what keeps the close from drifting back into 0003's envelope.

rewrite needs only to redraw who schedules and what is shared, adding no new glossary entity.

Considered options

breadth, and there is still no shared lifecycle — each producer re-implements the close.

also aims each turn. Rejected: aim is producer-specific (a map's Worthwhile theme is not a plan's); centralizing it re-imports judgment into the scheduler — the very weld being cut.

state only; each producer points itself when its turn comes; all producers funnel through one pre-dispatch → producer-loop → close definition. Chosen: breadth from rotation, aim from Direction, and a single legible lifecycle every producer inherits.

Decision

producer-skills [report, map, research, plan, …]. Strict round-robin: the moment does not jump the queue. The beat makes no semantic judgment — it never chooses a theme and never produces. This amends ADR-0004, which had the loop carry the judgment: judgment is evacuated from the beat into the skill.

itself at the most Worthwhile theme against Direction + delta, then produces. Breadth comes from the rotation; aim comes from Direction — two organs, no longer welded.

every producer funnels through:

This is the de-YAML'd, publish-only rewrite of the legacy consolidate-state + _shared/ trio.

(critic / serendipity) are shared scaffold every producer inherits. The skill fills role-defined slotsgather-grounding / converge / diverge — and supplies the theme + the producing cognition. Slots are role-defined, NOT report-defined: the scaffold must not hard-code report semantics (explorer = URL fetch, cite = link), or map / plan fight it. Report-specifics live in the report skill's mapping of the slots, never in the scaffold.

every producer's exit — honoring ADR-0008 (a standalone /ed-report observes the same close; the lifecycle is not privileged to /ed-beat). The bounce-bound lives in the protocol, never in the producer's discretion — that is what separates a gate from the retry-envelope ADR-0003 killed.

Close-roles (reviewers, publisher) = parts of the shared protocol, not round-robinable.

Artefato that cites / proposes / distills / kernel (pinned against the real eventlog.publish_artefato + kernel signatures) + visual coverage + genus-properties. Sections are FREE — the contract is on the properties and the kernel, never on a section order.

pull-at-open sweep), de-YAML'd. It is atomic: write blog/entries/<slug>.htmlpublish_artefato + embed_and_signal + kernel in one atomic act — you cannot publish without the kernel.

Artefato without its kernel) is enforced here: eventlog.artefatos_without_kernel() blocks (not warns) and publish_artefato requires the kernel in the same call.

Consequences

no single loop's taste can starve map or plan. Aim stays sharp because each skill points against Direction when its turn comes.

slots — the pre-dispatch, the scaffold, the close, and C3 come for free from the shared pipeline.

identical review-and-publish exit, consistent with ADR-0008's "lifecycle belongs to the dispatch, not to /ed-beat."

unpublishable; the blocking artefatos_without_kernel() is the backstop.

the non-report producers fight it (the procrustean failure). The mitigation is the role-defined slots — report-specifics live only in the report skill's slot mapping. This is a standing discipline, not a one-time fix.

carries theme-choice + production). Honors ADR-0008 (the close at the skill's exit observes the pull-at-open digestion contract; session-digestion is not re-added to the publisher). Consistent with ADR-0003 (the protocol's bounded bounce is a gate, not the retry-envelope), ADR-0006 (the publisher writes the log; pages are projections), and ADR-0013 (the close's review gate is the blind, property-not-section verification).

Amendment — ticket 05 (2026-07-05): the 3-act flow supersedes the PURE-scheduler beat

The operator's three-act split (docs/agencia/implementacao/05-fluxo-3atos-multiartefato.md) kills the monolith this ADR still assumed (one grounding → one close). The beat is now the trunk of ato-1: grounding inicial → an explicit PROPOSTA (WHICH artefatos, 1..N, why — the plan-side gates —, each with its angle), then one branch agent per artefato, each doing its own grounding rounds and exiting through this ADR's unchanged shared pipeline at its own exit. What survives intact: the ONE shared pipeline, the close-at-the-skill's-exit (ADR-0008), C3, the bounded bounce, and _beat.next_producer — the rotation cursor demoted to a breadth prior / tie-breaker inside the proposal, no longer the sole selector. What is superseded: "the beat makes no semantic judgment" — ato-1's proposal IS judgment, now grounded and gated (VoI/é-real/é-pra-ele) instead of a taste-driven loop (the 0004 failure this ADR cut; the cure is the gated proposal, not the blind rotation). See skills/beat/SKILL.md.