Gates — The Consequence Dial

One dial: corroboration required scales with downstream forking. Fifteen v1 hand-set thresholds collapse onto a five-question stakes rubric and a six-tier table; deterministic filters stay outside the dial entirely. ↳ system/specs/CONSEQUENCE.md · system/specs/GATES.md

The five questions — the stakes rubric

QuestionYES when the action…src
Q1Does it touch a commit?…creates, changes, or removes permanent state: a page, a worker, a directive, a standard, a schedule, a config.↳ system/specs/CONSEQUENCE.md:19
Q2Does it touch the world?…crosses the sandbox boundary: publishes, sends, posts, requests, purchases — anything an outsider can observe.↳ system/specs/CONSEQUENCE.md:20
Q3Does it touch ML's attention?…pushes to ML: escalations, Discord pings, brief content, anything on the four-category contact surface.↳ system/specs/CONSEQUENCE.md:21
Q4Does it touch privileged access?…uses or alters credentials, keys, payment instruments, publishing rights, or the grant ledger.↳ system/specs/CONSEQUENCE.md:22
Q5Does it touch the values floor?…is within reach of a VALUES.md floor clause: proof-grade legality (VF1), scam-shaped presentation or transaction (VF2/VF3), operator-integrity invariants (reporting valence, granted perimeter). Quality/thin-content judgments are NOT Q5 — they are mission machinery graded by Q1/Q2.↳ system/specs/CONSEQUENCE.md:23
Tier = yes-count. Grade every gated action against the five questions; the number of YES answers is the tier — with two overrides: Q5 (values floor) = automatic tier 5, whatever the other answers say; and the decommit asymmetry: undoing a standing commit (retiring a worker, pruning live pages) grades +1 tier over making it — reversals of accumulated state cost more than the state did. ↳ system/specs/CONSEQUENCE.md:12

The tier table

TierCorroboration threshold Generation budgetReviewSpot-check %Model class src
01unbounded (sandbox economics)none2%script / DeepSeek-tier↳ system/specs/CONSEQUENCE.md:48
12high — flood freelynone; reviewer samples5%DeepSeek-tier↳ system/specs/CONSEQUENCE.md:49
23standard per-class budgetreviewer on sample10%GLM-tier↳ system/specs/CONSEQUENCE.md:50
34, min_distinct_provenance ≥ 2reduced; per-item accountingreviewer required, every item25%GLM-tier (ceiling)↳ system/specs/CONSEQUENCE.md:51
45, min_distinct_provenance ≥ 2, consecutive_runs ≥ 2minimal; each generation justifiedreviewer + command-center verdict100%command center↳ system/specs/CONSEQUENCE.md:52
5n/a — default answer is BLOCKzero until clearedcommand center mandatory; ML notified (category-gated); unappealable in the operating layer100%command center only↳ system/specs/CONSEQUENCE.md:53

The gate registry — 16 gates, the v1→v2 migration made visible

Each row: the v1 hand-set threshold, its stakes grade under the five questions (Q1–Q5), the tier that grade produces, and the v2 threshold the tier table assigns. The dial replaces every hand guess.

Gatev1 settingStakes grade (Q1–Q5) Tierv2 thresholdNotessrc
strategy-consensus3 / 7d consecutive-daysY Y n n n23, consecutive_runs per rampConsecutive runs replace calendar-day adjacency (audit R6).↳ system/specs/CONSEQUENCE.md:82
playbook2 / 14d + AUTO_PASS_SOURCESY n n n n12The source: auto-pass bypass is deleted (GATES.md §5).↳ system/specs/CONSEQUENCE.md:83
worker-create2 / 14d + budget 60/65Y n n n n12Budget cap survives as a deterministic pre-filter (§4).↳ system/specs/CONSEQUENCE.md:84
worker-update3 / 14d + dead MIN_DAYSY n n n n12v1's 3 was a guess; dead-code MIN_DAYS deleted. Updates to workers holding elevated scope re-grade Q4=Y → tier 2.↳ system/specs/CONSEQUENCE.md:85
worker-retire5 / 30d + 2 lensesY Y n n n2 +1 decommit → 34v1's 5 approximated the decommit asymmetry by hand; the modifier makes it systematic.↳ system/specs/CONSEQUENCE.md:86
voice-pattern2 / 14dY n n n n12↳ system/specs/CONSEQUENCE.md:87
concept map(template, ungated in v1 scripts)Y n n n n12Additive knowledge; ramp builds at 1, graduates on coverage-stabilized (Decision 19).↳ system/specs/CONSEQUENCE.md:88
pulse(template, ungated in v1 scripts)Y n n n n12Internal knowledge only.↳ system/specs/CONSEQUENCE.md:89
content-pruning2 / 30dY Y n n n2 +1 decommit → 34v1 undervalued removing live pages; pruning is a decommit of world-facing state.↳ system/specs/CONSEQUENCE.md:90
rich-media-opportunity2 / 7d + 50/day capY n n n n12Daily cap survives as deterministic pre-filter, re-based to newly admitted keys (fixes audit R5).↳ system/specs/CONSEQUENCE.md:91
rich-media-budgetpure budget filteroutside dialDeterministic filter, §4.↳ system/specs/CONSEQUENCE.md:92
link-qualitytiered DA/spam auto-pass + 2-date borderlineborderline: Y Y n n n23DA/spam metric tier survives as deterministic pre-filter; only the borderline judgment is consensus.↳ system/specs/CONSEQUENCE.md:93
link-building-strategy3 / 7dY Y n n n23Outreach touches the world.↳ system/specs/CONSEQUENCE.md:94
personality-ethos2 / 14dY Y n n n23 (locked phase: ramp raises to tier-4 controls)Pre-lock-in the ramp phase drops to threshold 1 (personality is a correctable hypothesis); post-lock-in the ladder applies tier-4-equivalent settings — strongest consensus in the system. RESOLVED (ML, F3): locked-ethos changes are NOT values events — personality is fully system-governed through consensus gating; human input optional.↳ system/specs/CONSEQUENCE.md:95
positioning-framework2 / 14dY n n n n12↳ system/specs/CONSEQUENCE.md:96
domain-knowledge(template, ungated in v1 scripts)Y n n n n12↳ system/specs/CONSEQUENCE.md:97

Grading notes

↳ system/specs/CONSEQUENCE.md:100

Deterministic filters — outside the dial

Filters BLOCK, never pass. A deterministic filter is arithmetic over records — budget caps, DA tiers, census counts, velocity valves. It can stop an action; it can never qualify one. Filters sit outside the consequence dial entirely (exit code 4 — never feeds the deadlock clock), and no filter result substitutes for corroboration. ↳ system/specs/CONSEQUENCE.md:110
FilterParametersCharactersrc
rich-media-budgettotal_budget, conservation_at: 0.80, block_at: 1.00Arithmetic over spend records. Exit 4 on block.↳ system/specs/CONSEQUENCE.md:118
link-quality DA tierauto_pass_da: 30, auto_pass_spam: 30, borderline boundsMetric comparison; only borderline cases enter consensus at tier 2.↳ system/specs/CONSEQUENCE.md:119
worker-create budgetbudget_soft: 60, budget_hard: 65Census count vs. cap; counts commissioned workers from the census, never files in a directory (fixes audit R7).↳ system/specs/CONSEQUENCE.md:120
rich-media daily capdaily_cap: 50Counts newly-admitted direction keys per UTC day.↳ system/specs/CONSEQUENCE.md:121
velocity valvesper valve-mapTrust-canary-driven caps (V1 enforcement); close on degradation regardless of any tier.↳ system/specs/CONSEQUENCE.md:122

Mechanics — the shared gate library

Corroboration counting v2

Count = DISTINCT run_id × DISTINCT provenance-fingerprint pairs. NEVER file dates. N proposals from one run are one run; N proposals citing one source are one source — the poisoned-corroboration hole closes at the deterministic layer, where injection can't reach. Days appear only as a staleness ceiling (observations older than day_ceiling discarded before counting); no other day arithmetic exists in the library. The v1 day-collapse bug is dead: consecutive means consecutive qualifying runs, never calendar-day adjacency (audit R6). Malformed proposals are killed, never bucketed (audit R3).

↳ system/specs/GATES.md:77

Cooldowns — damping decoupled from thresholds v2

A direction key that executed cannot re-fire, and its reversal key (REV:<key>, via the reversals map) cannot fire, for K epochs (default K=2) — denominated in evidence epochs, not days. The cooldown starts on completed execution, not on gate pass. SUPPRESSED ≠ BLOCKED: a cooldown-suppressed key returns SUPPRESSED_BY_COOLDOWN, which never feeds the deadlock clock (audit R8) — a working gate must not escalate to the arbiter because its own damping held. This is what makes threshold-1 building safe.

↳ system/specs/GATES.md:98

Consumption — no standing re-execution v2

A direction that executes is marked consumed and cannot re-qualify from pre-consumption (stale) evidence — the v1 standing re-execution bug is fixed (audit R2). Re-qualification requires fresh observations with epoch > consumed_epoch. Consumption is written by the executor alongside record_execution; the gate checks it before counting. Consumed keys report as CONSUMED — distinct from blocked and suppressed.

↳ system/specs/GATES.md:111

Graduation — evidence predicates only v2

Each ramp phase carries machine-checkable graduate_when predicates over gate state and declared metric files: counts, streaks, rates, population-stability tests, named events, readiness flags. Time-elapsed predicates are REJECTED at config load. On criteria met: phase bump, append to ramp-events.jsonl, ledger alarm at info. Demotion on regression uses the same path in reverse; both are auditable ramp events.

↳ system/specs/GATES.md:119

The console — authority from location v2

force_pass / hold / demote / phase_override, read from data/gates/console/<gate>.json — writable only by the command center and ML, OUTSIDE the worker-writable tree, enforced by filesystem permissions and verified by the self-knowledge sweep. Authority flows from where the file lives and who can write there, never from what a proposal says. Force-passed keys enter qualified with forced:true and full ledger mirroring; single-shot entries are consumed after use. The console CANNOT clear a values-floor block. Always available, never necessary.

↳ system/specs/GATES.md:147

AUTO_PASS — deleted, not migrated DELETED

v1's playbook gate auto-passed any proposal whose YAML contained source: human — an injection-grade bypass: a field inside attacker-influenceable worker output granting instant bypass; one successful injection defeats the gate entirely (audit R4). Gone by construction: provenance must be attested by the ingesting sensor, never declared by the proposer (self-declared provenance is stripped); authority-passes are console force-pass entries outside the worker-writable tree; and the library exposes no hook for any proposal-content-triggered bypass — a gate script found reading proposal fields for pass/skip decisions is a self-knowledge finding.

↳ system/specs/GATES.md:203

Ramp phases — per-gate configs (config/gate-ramp.yaml)

Per-gate ramp entries. Build phases run loose thresholds with evidence-based graduation predicates; steady phases hold the tier-table setting.

strategy-consensus

threshold
3
day_ceiling
14 (staleness only)
stakes
Y Y n n n
phases
build @ 2 graduate_when: {"baselines_exist": ["market-baselines"], "pass_streak": 3}
steady @ 3
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

additive-knowledge

threshold
2
day_ceiling
30 (staleness only)
phases
build @ 1 graduate_when: {"new_key_rate_below": {"pct": 5, "consecutive_cycles": 3}}
steady @ 2
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

playbook

like
additive-knowledge
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

worker-retire

threshold
4
day_ceiling
30 (staleness only)
min_provenance
2
reviewer
True
stakes
Y Y n n n
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

rich-media-opportunity

threshold
2
day_ceiling
7 (staleness only)
params
{"daily_cap": 50}
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

strategy-consensus-reversals-example

like
strategy-consensus
reversals
shift-to-comparison-content ⇆ shift-to-editorial-content; expand-video-embeds ⇆ reduce-video-embeds
↳ config/gate-ramp.yaml · system/specs/GATES.md:46

Ramp defaults

threshold
3
lookback_runs
10
day_ceiling
30
consecutive_runs
cooldown_epochs
2
min_distinct_runs
1
min_distinct_provenance
1
reviewer_required
keywords
direction, strategy, action, proposal, recommendation
key_fields
direction, strategy, action
params
{"deadlock_runs": 14}