Tempo · Loop Governance

Founder sign-in required. Access is RLS-restricted to a single account.

Tempo Loops — governance v2

Sign out

Needs you

Execute slots

slugheld byref

The dispatcher's countExecutingSlots gate (scripts/feature-loop/dispatch.mjs) — an AWAITING MERGE holder still occupies its slot: work isn't done until merged, and freeing the slot for a parked PR would let WIP pile up invisibly behind your merge latency. Fix a MERGE card above to free it. A MERGED — RECONCILING row is a merged (or closed) PR waiting on the dispatcher's next pass (≤10 min) to advance its manifest's stage — it is not waiting on you.

Repair lane

PRmodeownedrounds/caplast repairescalatednext actorage

The dispatcher's repair lane owns red/conflicted PRs on impl/prd-<slug>-* branches ONLY (scripts/feature-loop/dispatch.mjs) — a CONFLICTING or CI-failing PR on any other branch prefix is UNOWNED: nobody, human or machine, is fixing it automatically until someone picks it up by hand.

Pipeline — left → right is the lifecycle (order shipped in payload, not hardcoded)

Chips answer "who has the ball": YOU founder action · MACHINE dispatcher acts ≤1 pass · BLOCKED with reason. EXECUTING is only legal with a live session or a machine action due — parked work says awaiting-merge or stalled (bold, in the card's last line).

pack vs context: composer owns PACK (bulk retrieval — builds context-pack.md; Fable never retrieves) · fable owns CONTEXT (grades the pack, writes the brief — judgment only). Separate columns so a slug stuck between goal and bless can't hide which half is failing: pack rejected 2× = pack-recipe bug (Composer's), 2 Fable ABORTs = circuit opens. Column owners ship in the payload's stageOrder[].owner, not hardcoded.

Commands (last 2h) durable on-board receipt · no push notification — this table is the confirmation · Mac poller executes pending within ~5 min

tskindtargetstatusresult

Merged (last 24h) gh-sourced superset — board button, gh CLI, GitHub UI alike (R6, informed-merges.jsonl covers the protected lane only)

PRtitlemergedby

Every PR merged in the last 24h — the complete inform surface push notifications draw from (R7). YOU a human clicked merge · MACHINE pr-babysit auto-merged it · UNKNOWN merger not determinable from mergedBy (always the local gh identity) or the merge-lane-decisions audit trail.

Loop health — last successful outcome, never last activity

loopverdictlast firelast successnext expectedfailsreason / fix

30-second daily scan: any row not GREEN or PAUSED gets its fix command run or a defect filed. CONFIGURED rows: check after first expected fire, not before. PAUSED rows carry a founder ack (docs/agents/loop-acks.json) — deliberately not running; a PAUSED row that goes GREEN again means the underlying loop fired successfully and the ack has gone stale (flagged in its reason). UNPUBLISHED means the board payload doesn't carry this loop's telemetry yet — not that the loop is silent.

Step heartbeats — "no row = didn't run"; "ran, found nothing" is now visible

steplast heartbeatoutcomefounddidduration

Knobs — published at publish-time, finally auditable

knobvalue

Setup integrity + notification audit

checkstatedetail

Merge-lane decisions (last pass)

PRlanereasonmerged

Every open PR pr-babysit.mjs considered its last pass, and why — the durable trail lives in ~/tempo-feature-loop/merge-lane-decisions.jsonl. review-lane PRs are held; their reason is the hold reason, so a waiting PR is never a mystery.

Account success

followersreach (7d)profile views (7d)website clicks (7d)signups (7d)
publishedfaceformatreachviewssavesshareslikescommentssave rateshare rateretro score

Per-post insights from ~/tempo-content/ig-metrics.json, rendered verbatim — no board-side math beyond formatting. Date links to the post's permalink.

Planned content

idfaceformathookstatusslotpredicted ranknext actor

Learnings

Machinery

Content lane machinery: MEASURE heartbeats, guard kills, and proof-row gaps — payload.content.machinery, assembled by scripts/loops/lib/content-lane.mjs (one derivation; the board renders, never re-derives). docs/attention/instagram/OS.md is the constitution.

Organic + referral vs paid

weektotalorganicreferralpaidunknownorg+ref %paid %

Weekly signup attribution split — payload.growth, assembled by scripts/loops/lib/growth-lane.mjs (one derivation; the board renders, never re-derives). Standalone CLI sibling: scripts/growth/signup-share-report.mjs. Classifier: scripts/growth/lib/signup-attribution-class.mjs.

Funnel

adSpendImprClicksVisitorsTapsInstalls (A)Installs (iOS-ASC)Signups

Per-ad lifetime funnel from the newest data-bearing kind:measure ledger row — payload.ads.funnel, derived ONCE in scripts/attention/lib/ads-queue.mjs (deriveFunnel — the same lib the acting runners import). An em-dash is an unmeasured field (null), never a zero. Ad names come from launch rows.

Governance

Machinery

Ads lane machinery: MEASURE heartbeat, next daily fires, and alerts — payload.ads, assembled by scripts/loops/lib/ads-lane.mjs (one derivation; the board renders, never re-derives). docs/attention/ads/STRATEGY.md is the constitution; the founder verb is scripts/attention/ads-veto.mjs.