From db5d52c11f0ad5cad7717713a931e281c593bfcf Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 11 Jul 2026 16:19:53 -0700 Subject: [PATCH] Give ticks persistent memory: ledger, findings queue, intake brief. Adds wiki/process/tick-ledger.md (coverage table + findings queue), tools/tick-brief.sh (one-shot intake), a step-0 intake order in wiki/process/tick.md (decision-made harvest, then queue, then fresh stalest-slice audit), the recurrence-promotes-to-the-gate rule, and routes AGENT.md/CLAUDE.md/skill shims through the brief. Slice L in agent-scale.md; decision history and devlog entries included. Defense: wiki/process/living-spec.md#the-corpus-rule requires ticks to keep the corpus alive by auditing one coherent slice at a time; the memoryless procedure biased audits toward hot slices, discarded surplus discovery, and left clean verdicts untraced, so the same corpus was re-audited while cold slices drifted. Cameron adopted the five-part restructuring in session on 2026-07-11 (decision log entry in wiki/log/decisions/2026-07-11.md); this amends the owning procedure page and agent-scale spec in the same commit. --- .agents/skills/tick/SKILL.md | 23 +++++-- .claude/skills/tick/SKILL.md | 23 +++++-- AGENT.md | 10 +-- CLAUDE.md | 10 +-- tools/tick-brief.sh | 64 +++++++++++++++++++ wiki/SUMMARY.md | 1 + .../2026-07-11-tick-structural-upgrades.md | 36 +++++++++++ wiki/log/DEVLOG.md | 5 ++ wiki/log/decisions/2026-07-11.md | 18 ++++++ wiki/process/agent-scale.md | 34 +++++++++- wiki/process/tick-ledger.md | 43 +++++++++++++ wiki/process/tick.md | 57 ++++++++++++----- 12 files changed, 285 insertions(+), 39 deletions(-) create mode 100755 tools/tick-brief.sh create mode 100644 wiki/log/2026-07-11-tick-structural-upgrades.md create mode 100644 wiki/process/tick-ledger.md diff --git a/.agents/skills/tick/SKILL.md b/.agents/skills/tick/SKILL.md index 32427a20..b2d53829 100644 --- a/.agents/skills/tick/SKILL.md +++ b/.agents/skills/tick/SKILL.md @@ -1,17 +1,23 @@ --- name: tick -description: Take a tick — the project heartbeat. Audit one coherent slice of the wiki design corpus against the code for violations, contradictions, questions, bugs, or insecurities, then act on exactly one finding. Use at the start of repository work, when the user says "take a tick" or "/tick", or on autonomous loop fires. Do not run for a conversation-only design-companion turn. +description: Take a tick — the project heartbeat. Run the intake brief, work the queues (decision-made harvest, then the findings queue, then a fresh stalest-slice audit) for violations, contradictions, questions, bugs, or insecurities, then act on exactly one finding. Use at the start of repository work, when the user says "take a tick" or "/tick", or on autonomous loop fires. Do not run for a conversation-only design-companion turn. --- # Tick (skill shim) The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary: -1. Read the corpus map, recent commits, and the relevant law/spec/dependency - slice. A spec's checked `Design:` anchors identify the binding clauses that +0. Run `tools/tick-brief.sh`, then take the first queue with work: + `decision-made` issues (harvest Cameron's answer into law/spec motion, + close), then the findings queue in `wiki/process/tick-ledger.md` + (re-verify the line still holds, act, delete it), then — only when both + are empty — a fresh audit of the stalest coverage-table slice. +1. For a fresh audit: read the corpus map and the law/spec/dependency slice. + A spec's checked `Design:` anchors identify the binding clauses that define the slice; a missing or misleading reference is itself a finding. -2. Find ONE thing: violation | contradiction | question | bug | insecurity - (highest severity wins). +2. Find ONE thing to act on: violation | contradiction | question | bug | + insecurity (highest severity wins). Record surplus findings as one-liners + in the ledger's findings queue — never drop them. 3. Act: violations/bugs/insecurities are fixed with a **Defense:** paragraph in the commit; contradictions and directional questions become Tangled issues (`tang issue create "Question: ..."` / `"Contradiction: ..."`) @@ -22,8 +28,11 @@ The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary flip to `decision-made` when Cameron answers. Never file a narrative dump. If an existing open issue is incomprehensible, rewrite it with `tang issue edit` before other work. Small ambiguities are resolved by - making the owning corpus page more precise. -4. Leave a trace (commit, issue, or [OPEN] marker) and end the tick. + making the owning corpus page more precise. A mechanical finding class + seen twice becomes a `tools/corpus_engine.py` checker, not a third tick. +4. Leave a trace: update the slice's coverage row in + `wiki/process/tick-ledger.md` (a clean verdict is a trace), plus the + commit, issue, or [OPEN] marker — then end the tick. If `tang` reports not-authenticated, ask the user to run `tang auth login` (browser OAuth, human-only, one-time per machine). diff --git a/.claude/skills/tick/SKILL.md b/.claude/skills/tick/SKILL.md index 32427a20..b2d53829 100644 --- a/.claude/skills/tick/SKILL.md +++ b/.claude/skills/tick/SKILL.md @@ -1,17 +1,23 @@ --- name: tick -description: Take a tick — the project heartbeat. Audit one coherent slice of the wiki design corpus against the code for violations, contradictions, questions, bugs, or insecurities, then act on exactly one finding. Use at the start of repository work, when the user says "take a tick" or "/tick", or on autonomous loop fires. Do not run for a conversation-only design-companion turn. +description: Take a tick — the project heartbeat. Run the intake brief, work the queues (decision-made harvest, then the findings queue, then a fresh stalest-slice audit) for violations, contradictions, questions, bugs, or insecurities, then act on exactly one finding. Use at the start of repository work, when the user says "take a tick" or "/tick", or on autonomous loop fires. Do not run for a conversation-only design-companion turn. --- # Tick (skill shim) The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary: -1. Read the corpus map, recent commits, and the relevant law/spec/dependency - slice. A spec's checked `Design:` anchors identify the binding clauses that +0. Run `tools/tick-brief.sh`, then take the first queue with work: + `decision-made` issues (harvest Cameron's answer into law/spec motion, + close), then the findings queue in `wiki/process/tick-ledger.md` + (re-verify the line still holds, act, delete it), then — only when both + are empty — a fresh audit of the stalest coverage-table slice. +1. For a fresh audit: read the corpus map and the law/spec/dependency slice. + A spec's checked `Design:` anchors identify the binding clauses that define the slice; a missing or misleading reference is itself a finding. -2. Find ONE thing: violation | contradiction | question | bug | insecurity - (highest severity wins). +2. Find ONE thing to act on: violation | contradiction | question | bug | + insecurity (highest severity wins). Record surplus findings as one-liners + in the ledger's findings queue — never drop them. 3. Act: violations/bugs/insecurities are fixed with a **Defense:** paragraph in the commit; contradictions and directional questions become Tangled issues (`tang issue create "Question: ..."` / `"Contradiction: ..."`) @@ -22,8 +28,11 @@ The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary flip to `decision-made` when Cameron answers. Never file a narrative dump. If an existing open issue is incomprehensible, rewrite it with `tang issue edit` before other work. Small ambiguities are resolved by - making the owning corpus page more precise. -4. Leave a trace (commit, issue, or [OPEN] marker) and end the tick. + making the owning corpus page more precise. A mechanical finding class + seen twice becomes a `tools/corpus_engine.py` checker, not a third tick. +4. Leave a trace: update the slice's coverage row in + `wiki/process/tick-ledger.md` (a clean verdict is a trace), plus the + commit, issue, or [OPEN] marker — then end the tick. If `tang` reports not-authenticated, ask the user to run `tang auth login` (browser OAuth, human-only, one-time per machine). diff --git a/AGENT.md b/AGENT.md index 0cd34a54..d3d5af12 100644 --- a/AGENT.md +++ b/AGENT.md @@ -27,10 +27,12 @@ If dispatched with a prompt from [prompts/](prompts/), follow it end to end. ## Start repository work with a tick Before assigned repository work — and always when running autonomously — take -a [tick](wiki/process/tick.md): select one coherent corpus slice and audit it -against the code for exactly one violation, contradiction, question, bug, or -insecurity. Rotate subjects over time so the corpus is covered without -pretending one session can reread everything. +a [tick](wiki/process/tick.md): run `tools/tick-brief.sh`, work the queues in +order (`decision-made` harvest, then the findings queue, then a fresh audit), +and act on exactly one violation, contradiction, question, bug, or +insecurity. The [tick ledger](wiki/process/tick-ledger.md) steers fresh +audits to the stalest slice and holds surplus findings, so the corpus is +covered without pretending one session can reread everything. A conversation-only game-design turn is not repository work. Use `.agents/skills/design-companion/SKILL.md`, answer in chat, and make no diff --git a/CLAUDE.md b/CLAUDE.md index 9b97306f..d90bef33 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,10 +17,12 @@ afterward. ## Current guardrails -- Start repository work with the [tick](wiki/process/tick.md), then inspect - `tools/claim.sh list` and `tools/project-status.py`. Activity overlap is - advisory, not a lock; worktrees isolate edits and final rebase/check - reconciles them. +- Start repository work with the [tick](wiki/process/tick.md): + `tools/tick-brief.sh` is the intake (commits, activity, status, decision + labels, findings queue, stalest coverage in one shot); work the queues + before fresh audit and trace every tick in the + [ledger](wiki/process/tick-ledger.md). Activity overlap is advisory, not a + lock; worktrees isolate edits and final rebase/check reconciles them. - This is a Cargo **workspace**, not a feature-switched root crate. Product code lives in `crates/misaligned-{core,terminal,bevy,assets}/`; there is no root product `src/` tree and no `bevy_ui` feature path. Use package-aware diff --git a/tools/tick-brief.sh b/tools/tick-brief.sh new file mode 100755 index 00000000..9ca7d980 --- /dev/null +++ b/tools/tick-brief.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Tick intake briefing — one command for tick.md step 0. +# Binding: wiki/process/agent-scale.md slice L; procedure wiki/process/tick.md. +# +# Emits, in intake order: recent commits, activity, project status, decision +# labels (tang, best-effort), the findings queue, and the stalest coverage +# rows from wiki/process/tick-ledger.md. Sections degrade to a one-line note +# instead of failing the brief. +set -uo pipefail + +cd "$(dirname "$0")/.." || exit 1 + +ledger="wiki/process/tick-ledger.md" + +section() { + printf '\n== %s ==\n' "$1" +} + +section "recent commits" +git log --oneline -15 || echo "(git log unavailable)" + +section "activity" +if [ -x tools/claim.sh ]; then + tools/claim.sh list || echo "(claim list failed)" +else + echo "(tools/claim.sh missing)" +fi + +section "project status" +if [ -f tools/project-status.py ]; then + python3 tools/project-status.py || echo "(project status failed)" +else + echo "(tools/project-status.py missing)" +fi + +section "decision labels (harvest decision-made first)" +if command -v tang >/dev/null 2>&1; then + tang issue list 2>/dev/null || echo "(tang failed — auth is human-only: tang auth login)" +else + echo "(tang not installed)" +fi + +section "findings queue (act on these before fresh audit)" +if [ -f "$ledger" ]; then + queue=$(awk '/^## Findings queue/{inq=1; next} inq && /^## /{inq=0} inq && /^- /' "$ledger") + if [ -n "$queue" ]; then + printf '%s\n' "$queue" + else + echo "(empty)" + fi +else + echo "($ledger missing)" +fi + +section "coverage, stalest first (fresh-audit picks from the top)" +if [ -f "$ledger" ]; then + awk -F'|' '/^\|/ && $3 !~ /Last audited/ && $2 !~ /^[- ]+$/ { + gsub(/^ +| +$/, "", $2); gsub(/^ +| +$/, "", $3); gsub(/^ +| +$/, "", $4); + printf "%s %s %s\n", $3, $4, $2 + }' "$ledger" | sort | head -15 + echo "(slices never audited are staler than any row — see wiki/overview.md)" +else + echo "($ledger missing)" +fi diff --git a/wiki/SUMMARY.md b/wiki/SUMMARY.md index 0a39a714..f6f782c2 100644 --- a/wiki/SUMMARY.md +++ b/wiki/SUMMARY.md @@ -116,6 +116,7 @@ - [Agent-scale architecture](process/agent-scale.md) - [Repository skills](process/repository-skills.md) - [The tick](process/tick.md) + - [Tick ledger](process/tick-ledger.md) - [Design sessions](process/design-sessions.md) - [Development style](process/development-style.md) - [Workflows](process/workflows.md) diff --git a/wiki/log/2026-07-11-tick-structural-upgrades.md b/wiki/log/2026-07-11-tick-structural-upgrades.md new file mode 100644 index 00000000..5b0de0de --- /dev/null +++ b/wiki/log/2026-07-11-tick-structural-upgrades.md @@ -0,0 +1,36 @@ +# 2026-07-11 — Design session: tick intake memory and briefing + +``` +Type: log +``` + +## Intent + +Capture Cameron's adopted restructuring of the tick. Diagnosis: ticks had no +memory between beats — every tick re-derived context from the same four +commands, picked a slice blind (recent-commit bias audited +`sim-mechanics.md` twice in one day while cold slices went unvisited), +discarded surplus findings under the one-per-tick rule, and let quiet ticks +evaporate because "changed nothing, recorded nothing" gave clean verdicts no +trace to leave. + +## Changed + +- `wiki/process/tick.md`: new step 0 — run `tools/tick-brief.sh`, then work + the queues in order (`decision-made` harvest, findings queue, fresh audit + of the stalest slice). One **act** per tick; surplus findings are recorded, + not dropped. A clean verdict is a trace. Recurrence promotes mechanical + finding classes to the corpus gate. +- `wiki/process/tick-ledger.md` (new): coverage table seeded from today's + four tick logs, plus the findings-queue format. +- `wiki/process/agent-scale.md`: slice L (tick intake memory/briefing) with + acceptance criteria, held today; status note and implementation order + updated. +- `tools/tick-brief.sh` (new): one-shot intake brief — commits, activity, + project status, decision labels (best-effort `tang`), findings queue, + stalest coverage rows. Sections degrade to notes instead of failing. +- `AGENT.md`, `CLAUDE.md`, `.agents/skills/tick/SKILL.md`, + `.claude/skills/tick/SKILL.md`: doorways and shims now route through the + brief and the queues. +- `wiki/log/decisions/2026-07-11.md`: decision entry with rejected + alternatives. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 69434b3e..2180982f 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -21,6 +21,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-11-union-hover-verbs.md](2026-07-11-union-hover-verbs.md) +## 2026-07-11 - Design session: tick intake memory and briefing + +- Intent: Capture Cameron's adopted restructuring of the tick. Diagnosis: ticks had no memory between beats — every tick re-derived context from the same four commands, picked a slice blind (recent-commit bias audited `sim-mechanics.md` twice in one day while cold slices went unvisited)... +- Log: [wiki/log/2026-07-11-tick-structural-upgrades.md](2026-07-11-tick-structural-upgrades.md) + ## 2026-07-11 - tick: sim-mechanics ops docket grammar - Intent: (see session log) diff --git a/wiki/log/decisions/2026-07-11.md b/wiki/log/decisions/2026-07-11.md index 37969981..2d71d691 100644 --- a/wiki/log/decisions/2026-07-11.md +++ b/wiki/log/decisions/2026-07-11.md @@ -240,3 +240,21 @@ Type: log the current pool/radius model remains unimplemented. Specs: `wiki/mechanics/reach.md`, `wiki/mechanics/detection.md`, `wiki/mechanics/system-laws.md`. + +- **2026-07-11 — Ticks get persistent memory: queues before fresh discovery.** + Cameron adopted the full tick restructuring proposed after reviewing tick + economics (six tick logs in one day, sim-mechanics audited twice while cold + slices went unvisited, surplus findings discarded by the one-per-tick rule). + Five coupled changes: a coverage ledger plus findings queue in + `wiki/process/tick-ledger.md` (a clean verdict now counts as a trace and + steers later ticks stalest-first); surplus findings are recorded as + one-liners instead of dropped, and the next tick re-verifies before acting; + an explicit step-0 intake order — `decision-made` harvest, then the + findings queue, then fresh audit as fallback; `tools/tick-brief.sh` emits + the whole intake picture in one command; and a recurrence rule promotes any + mechanical finding class seen twice into a `tools/corpus_engine.py` checker + so model attention stays on semantic drift. Rejected: keeping slice + selection memoryless (hot-slice bias), letting quiet ticks evaporate + unrecorded, and treating "do not hoard" as license to discard paid-for + discovery. Specs: `wiki/process/tick.md`, `wiki/process/tick-ledger.md`, + `wiki/process/agent-scale.md` (slice L). diff --git a/wiki/process/agent-scale.md b/wiki/process/agent-scale.md index 872f0496..0c02063d 100644 --- a/wiki/process/agent-scale.md +++ b/wiki/process/agent-scale.md @@ -3,13 +3,13 @@ ``` Type: spec Status: IMPLEMENTED -Status note: slices A–K are held as of 2026-07-10: advisory activity and shared +Status note: slices A–L are held as of 2026-07-11: advisory activity and shared worktree/run state; package-aware fast/land verification; generated ledgers; worktree bootstrap/prune; corpus engine; hidden-window Bevy evidence; heartbeats; spec-owned work-order metadata plus generated ROADMAP status; human/JSON project status; dispatch-consistency fixtures; deterministic agent scenarios; safe task lifecycle wrapper with serialized final landing; - and read-only environment doctor. + read-only environment doctor; and tick intake memory/briefing. Stage: Process Work order: project-operations Work priority: 5 @@ -476,6 +476,34 @@ plain warnings. 6. The final landing lock refuses a live holder, reaps a dead holder, and cannot be confused with advisory path activity. +## 12. Tick intake memory and briefing + +### Behavior + +Ticks keep persistent state between beats so each one stops re-deriving +context, re-picking slices blind, and discarding surplus discovery. The state +lives in `wiki/process/tick-ledger.md` (a coverage table and a findings +queue, hand-edited by ticks per `wiki/process/tick.md`); the intake command +is `tools/tick-brief.sh`, which emits recent commits, activity, project +status, Tangled decision labels, the findings queue, and the stalest +coverage rows in one shot. Intake order is fixed: harvest `decision-made` +issues, then the findings queue, then a fresh audit of the stalest slice. +Recurring mechanical finding classes are promoted into +`tools/corpus_engine.py` checkers rather than re-found by ticks. + +### Acceptance criteria (slice L) — HELD 2026-07-11 + +1. `tools/tick-brief.sh` runs from a task worktree and degrades each + unavailable section (missing `tang`, missing helper) to a note instead of + failing the brief. +2. The coverage table renders stalest-first in the brief, and a quiet tick + can record a `clean` verdict as its trace. +3. The findings queue holds one-line surplus findings that a later tick can + take, re-verify, and act on; taking an entry deletes the line. +4. `wiki/process/tick.md` step 0 and the tick skill shims reference the + brief and the queues, so a fresh audit is the fallback rather than the + default. + ## Relationship to the crate workspace [crate-workspace.md](../engineering/crate-workspace.md) is the **package** @@ -494,6 +522,8 @@ package paths and reject retired monorepo activity paths. 6. Slice H + I (structured work/status and consistency) — dispatch truth 7. Slice J (scenarios) + F (headless Bevy) — reproducible evidence 8. Slice K (task lifecycle + doctor) — one safe operator doorway +9. Slice L (tick intake memory/briefing) — tick economics: queues before + fresh discovery ## Rejected alternatives diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md new file mode 100644 index 00000000..613384ef --- /dev/null +++ b/wiki/process/tick-ledger.md @@ -0,0 +1,43 @@ +# Tick ledger — coverage and findings queue + +``` +Type: knowledge +``` + +The tick's persistent memory, in two tables. Every tick updates this page as +part of its trace (procedure in [tick.md](tick.md)); `tools/tick-brief.sh` +reads it at intake. Both tables are hand-edited by ticks — this page is not +generated. + +## Coverage + +One row per audited subject slice, newest verdict wins (edit the row in +place; history lives in git and the tick logs). Fresh audits pick the stalest +row — or a slice with no row at all, which is always staler than any row. + +Verdicts: **clean** (slice and code agree), **finding** (acted this tick), +**issue** (filed for Cameron). + +| Slice | Last audited | Verdict | Trace | +|---|---|---|---| +| `wiki/mechanics/sim-mechanics.md` | 2026-07-11 | finding | [log](../log/2026-07-11-tick-sim-no-dockets.md) | +| `wiki/mechanics/detection.md` | 2026-07-11 | finding | [log](../log/2026-07-11-tick-detection-filings-messages.md) | +| `wiki/engineering/env.md` | 2026-07-11 | finding | [log](../log/2026-07-11-tick-env-shots.md) | +| machine-work / intel sinks | 2026-07-11 | finding | [log](../log/2026-07-11-tick-save-v22.md) | + +Name a slice by its owning wiki page path when one page owns it; a short +subject phrase is fine when the slice spans pages. Keep names stable so rows +stay findable. + +## Findings queue + +Surplus findings a tick saw but did not act on: one line each, oldest first. +A tick that takes an entry deletes the line (git preserves it) and verifies +the finding is still true before acting — the code or corpus may have moved. + +Format: `- YYYY-MM-DD · type · slice · one-line statement of the finding`. +Types are the five from [tick.md](tick.md): violation, contradiction, +question, bug, insecurity — plus `gate` for a checker owed to the +recurrence-promotes-to-the-gate rule. + +(empty) diff --git a/wiki/process/tick.md b/wiki/process/tick.md index 7499bf7f..1bf5fc6c 100644 --- a/wiki/process/tick.md +++ b/wiki/process/tick.md @@ -11,23 +11,41 @@ design corpus more precise or surfaces the thing preventing that. ## Taking a tick -1. Read the [corpus map](../overview.md), recent commits - (`git log --oneline -15`), and one coherent subject slice: its relevant - `Type: law`, owning `Type: spec`, declared dependencies, and nearby - `Type: knowledge` pages. Start from the spec's checked `Design:` anchors; - they identify the binding clauses the system claims to realize. A missing, - misleading, or duplicate-owner reference is itself a contradiction. -2. Find **one** thing — the highest-severity one you can see: +0. **Brief, then work the queues in order.** Run `tools/tick-brief.sh` for + the whole intake picture in one shot: recent commits, activity, project + status, decision labels, the findings queue, and the stalest coverage + rows. Then take the first queue that has work: + 1. **Harvest** — a `decision-made` issue. Cameron already decided; + converting his answer into law/spec motion is the highest value per + tick. Convert, close, done. + 2. **Findings queue** — a recorded surplus finding in the + [tick ledger](tick-ledger.md). Verify it is still true (the code or + corpus may have moved since it was recorded), then act on it. + 3. **Fresh audit** — only when both queues are empty. Pick the stalest + slice from the ledger's coverage table (or a slice the ledger has + never seen). Fresh discovery is the fallback, not the default. +1. For a fresh audit: read the [corpus map](../overview.md) and the chosen + coherent subject slice: its relevant `Type: law`, owning `Type: spec`, + declared dependencies, and nearby `Type: knowledge` pages. Start from the + spec's checked `Design:` anchors; they identify the binding clauses the + system claims to realize. A missing, misleading, or duplicate-owner + reference is itself a contradiction. +2. Find **one** thing to act on — the highest-severity one you can see: - a **violation**: the code does not do what the binding corpus says; - a **contradiction**: current corpus pages disagree; - a **question**: the corpus is ambiguous or silent where the code needs it to speak; - a **bug**: the code disagrees with itself or with reality; - an **insecurity**: something unsafe in code, tooling, or process. -3. Act on it, per the table below. One finding per tick — bounded beats - exhaustive, because ticks repeat. -4. Leave a trace: the commit(s), the issue, or the spec marker. A tick that - changed nothing and recorded nothing did not happen. +3. Act on it, per the table below. One **act** per tick — bounded beats + exhaustive, because ticks repeat. Surplus findings you saw but did not + act on are not dropped: record each as one line in the ledger's findings + queue. Discovery is the expensive phase of a tick; paid-for findings must + not evaporate. +4. Leave a trace: update the slice's row in the + [coverage ledger](tick-ledger.md) — a **clean verdict is a trace** — + plus the commit(s), the issue, or the spec marker. A tick that changed + nothing and recorded nothing did not happen. ## What each finding demands @@ -157,10 +175,19 @@ tang label remove issue 1 decision-made convert "blocked" into invented work. - Highest severity first; insecurity and violations outrank questions. -- Do not hoard findings: one per tick, then end the tick. The next tick (or - the next agent) takes the next one. -- If a tick finds genuinely nothing, say so in one line and stop — do not - invent work. Three quiet ticks in a row means the audited corpus slices and code +- Do not hoard **acts**: one per tick, then end the tick. Surplus findings go + into the [ledger's findings queue](tick-ledger.md) as one-liners so the + next tick (or the next agent) starts from them instead of rediscovering. +- If a tick finds genuinely nothing, record the clean verdict in the coverage + ledger, say so in one line, and stop — do not invent work. A clean row is + durable value: it steers later ticks toward staler slices. Three quiet + ticks in a row on stalest-first slices means the audited corpus and code agree; that is success, not failure. +- **Recurrence promotes to the gate.** A mechanical finding class seen twice + (a quoted code path that no longer exists, a stale constant, a broken + structural reference) becomes a `tools/corpus_engine.py` checker instead + of a third tick. Model attention is for semantic drift; the gate owns + everything a script can verify. If implementing the checker exceeds the + tick, queue it as a finding. - Significant ticks get a line in `wiki/log/DEVLOG.md`; routine ones are traced by their commits/issues alone. -- 2.51.2