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
| Question | YES when the action… | src | |
|---|---|---|---|
| Q1 | Does 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 |
| Q2 | Does it touch the world? | …crosses the sandbox boundary: publishes, sends, posts, requests, purchases — anything an outsider can observe. | ↳ system/specs/CONSEQUENCE.md:20 |
| Q3 | Does 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 |
| Q4 | Does it touch privileged access? | …uses or alters credentials, keys, payment instruments, publishing rights, or the grant ledger. | ↳ system/specs/CONSEQUENCE.md:22 |
| Q5 | Does 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 |
The tier table
| Tier | Corroboration threshold | Generation budget | Review | Spot-check % | Model class | src |
|---|---|---|---|---|---|---|
| 0 | 1 | unbounded (sandbox economics) | none | 2% | script / DeepSeek-tier | ↳ system/specs/CONSEQUENCE.md:48 |
| 1 | 2 | high — flood freely | none; reviewer samples | 5% | DeepSeek-tier | ↳ system/specs/CONSEQUENCE.md:49 |
| 2 | 3 | standard per-class budget | reviewer on sample | 10% | GLM-tier | ↳ system/specs/CONSEQUENCE.md:50 |
| 3 | 4, min_distinct_provenance ≥ 2 | reduced; per-item accounting | reviewer required, every item | 25% | GLM-tier (ceiling) | ↳ system/specs/CONSEQUENCE.md:51 |
| 4 | 5, min_distinct_provenance ≥ 2, consecutive_runs ≥ 2 | minimal; each generation justified | reviewer + command-center verdict | 100% | command center | ↳ system/specs/CONSEQUENCE.md:52 |
| 5 | n/a — default answer is BLOCK | zero until cleared | command center mandatory; ML notified (category-gated); unappealable in the operating layer | 100% | 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.
| Gate | v1 setting | Stakes grade (Q1–Q5) | Tier | v2 threshold | Notes | src |
|---|---|---|---|---|---|---|
| strategy-consensus | 3 / 7d consecutive-days | Y Y n n n | 2 | 3, consecutive_runs per ramp | Consecutive runs replace calendar-day adjacency (audit R6). | ↳ system/specs/CONSEQUENCE.md:82 |
| playbook | 2 / 14d + AUTO_PASS_SOURCES | Y n n n n | 1 | 2 | The source: auto-pass bypass is deleted (GATES.md §5). | ↳ system/specs/CONSEQUENCE.md:83 |
| worker-create | 2 / 14d + budget 60/65 | Y n n n n | 1 | 2 | Budget cap survives as a deterministic pre-filter (§4). | ↳ system/specs/CONSEQUENCE.md:84 |
| worker-update | 3 / 14d + dead MIN_DAYS | Y n n n n | 1 | 2 | v1'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-retire | 5 / 30d + 2 lenses | Y Y n n n | 2 +1 decommit → 3 | 4 | v1's 5 approximated the decommit asymmetry by hand; the modifier makes it systematic. | ↳ system/specs/CONSEQUENCE.md:86 |
| voice-pattern | 2 / 14d | Y n n n n | 1 | 2 | ↳ system/specs/CONSEQUENCE.md:87 | |
| concept map | (template, ungated in v1 scripts) | Y n n n n | 1 | 2 | Additive 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 n | 1 | 2 | Internal knowledge only. | ↳ system/specs/CONSEQUENCE.md:89 |
| content-pruning | 2 / 30d | Y Y n n n | 2 +1 decommit → 3 | 4 | v1 undervalued removing live pages; pruning is a decommit of world-facing state. | ↳ system/specs/CONSEQUENCE.md:90 |
| rich-media-opportunity | 2 / 7d + 50/day cap | Y n n n n | 1 | 2 | Daily cap survives as deterministic pre-filter, re-based to newly admitted keys (fixes audit R5). | ↳ system/specs/CONSEQUENCE.md:91 |
| rich-media-budget | pure budget filter | — | outside dial | — | Deterministic filter, §4. | ↳ system/specs/CONSEQUENCE.md:92 |
| link-quality | tiered DA/spam auto-pass + 2-date borderline | borderline: Y Y n n n | 2 | 3 | DA/spam metric tier survives as deterministic pre-filter; only the borderline judgment is consensus. | ↳ system/specs/CONSEQUENCE.md:93 |
| link-building-strategy | 3 / 7d | Y Y n n n | 2 | 3 | Outreach touches the world. | ↳ system/specs/CONSEQUENCE.md:94 |
| personality-ethos | 2 / 14d | Y Y n n n | 2 | 3 (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-framework | 2 / 14d | Y n n n n | 1 | 2 | ↳ system/specs/CONSEQUENCE.md:96 | |
| domain-knowledge | (template, ungated in v1 scripts) | Y n n n n | 1 | 2 | ↳ system/specs/CONSEQUENCE.md:97 |
Grading notes
- Q2 for strategy-consensus, pruning, link gates, and ethos: these decisions determine what the world sees even when the gate itself doesn't publish. The question is "does the decision touch the world," not "does this script call the publish API."
- Publishing itself (the gatekeeper) is not in this table because it was never a consensus gate; it is the mechanical three-nevers enforcement (V5) and grades Y Y n n Y → tier 5 controls on any values-clause hit, tier 2 controls otherwise.
- Escalation/brief machinery grades Q3=Y by construction; anything writing to ML's surface is tier ≥ 1 even when purely informational.
Deterministic filters — outside the dial
| Filter | Parameters | Character | src |
|---|---|---|---|
| rich-media-budget | total_budget, conservation_at: 0.80, block_at: 1.00 | Arithmetic over spend records. Exit 4 on block. | ↳ system/specs/CONSEQUENCE.md:118 |
| link-quality DA tier | auto_pass_da: 30, auto_pass_spam: 30, borderline bounds | Metric comparison; only borderline cases enter consensus at tier 2. | ↳ system/specs/CONSEQUENCE.md:119 |
| worker-create budget | budget_soft: 60, budget_hard: 65 | Census 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 cap | daily_cap: 50 | Counts newly-admitted direction keys per UTC day. | ↳ system/specs/CONSEQUENCE.md:121 |
| velocity valves | per valve-map | Trust-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:77Cooldowns — 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:98Consumption — 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:111Graduation — 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:119The 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:147AUTO_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:203Ramp 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
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
playbook
- like
- additive-knowledge
worker-retire
- threshold
- 4
- day_ceiling
- 30 (staleness only)
- min_provenance
- 2
- reviewer
- True
- stakes
- Y Y n n n
rich-media-opportunity
- threshold
- 2
- day_ceiling
- 7 (staleness only)
- params
- {"daily_cap": 50}
strategy-consensus-reversals-example
- like
- strategy-consensus
- reversals
- shift-to-comparison-content ⇆ shift-to-editorial-content; expand-video-embeds ⇆ reduce-video-embeds
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}