Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b38da5c
feat(eval): parser registry + bootstrap CI helper
May 13, 2026
e035c6f
feat(eval): manifest annotation_format + synthetic-source guard + gui…
May 13, 2026
a89142c
feat(eval): port apr-28 error-decomposition harness to TabEvent
May 13, 2026
a08ad15
feat(eval): composite per-tier eval harness with bootstrap CIs
May 13, 2026
c657851
feat(eval): composite-eval CLI + markdown report formatters
May 13, 2026
678328f
feat(eval): manifest builder + hygiene pass
May 13, 2026
9a7e957
feat(eval): first Phase 0 baseline + matcher fix + LICENSES/DECISIONS
May 13, 2026
ea4fbb7
chore(eval): hygiene pass — portable manifest, real SHA, six-bucket w…
May 13, 2026
1dc3c87
chore(eval): re-point baseline report SHA to post-rebase 9a7e957
May 19, 2026
ef162db
Merge eval foundation (Phase 0): composite per-tier eval, parsers, bo…
pgil256 Jun 1, 2026
209a0f1
spec: commit v1 to the highest acceptance targets (reverse 2026-05-13…
pgil256 Jun 1, 2026
cd0e7ab
acquire(egdb): author-granted EGDB acquirer + license update (eval-only)
pgil256 Jun 1, 2026
d89620e
chore: repo hygiene — drop agent-farm scaffolding, dedupe spec, track…
pgil256 Jun 1, 2026
f400b17
fix(acquire): EGDB is a public Drive folder, not a private grant URL
pgil256 Jun 2, 2026
5e13d33
feat(eval): #2 local toolkit — GuitarSet + Guitar-TECHS acquirers, GT…
pgil256 Jun 2, 2026
eb7a55e
fix(acquire): use ASCII in console output (Windows cp1252 crash)
pgil256 Jun 2, 2026
0f1e1a3
perf(acquire): GuitarSet fetches only annotations + mono-mic partitions
pgil256 Jun 2, 2026
7a9ceda
fix(eval): scan_guitar_techs matches the real Guitar-TECHS layout
pgil256 Jun 2, 2026
c5d6f82
fix(acquire): make Guitar-TECHS download resumable + fault-tolerant
pgil256 Jun 2, 2026
eb4dae1
eval(#2): cross-dataset prior check — prior doesn't transfer to electric
pgil256 Jun 2, 2026
2f362ee
fix(audio): load guitar_fl via checkpoint_path; backbone swap doesn't…
pgil256 Jun 2, 2026
8a34d6c
docs(plan): electric backbone fine-tune design + prep
pgil256 Jun 2, 2026
9197b8b
feat: scope v1 to acoustic + wire the electric tone toggle
pgil256 Jun 3, 2026
1da3357
feat(fusion)+spec: honest audio-only acoustic targets; continuity win
pgil256 Jun 3, 2026
4288885
fix(eval): _relativize_to_data_root handles Windows backslash paths
pgil256 Jun 3, 2026
d96d760
style: ruff format eval module + tests
pgil256 Jun 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .claude-agent-farm.json

This file was deleted.

6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
# YOLO-OBB guitar training set (Phase 3).
ROBOFLOW_API_KEY=

# EGDB source override (optional). The acquirer defaults to the public
# project Google Drive folder; access is open, the license is the gate
# (author grant on record 2026-06-01). Set this only to point at a mirror.
# EGDB_DOWNLOAD_URL=
# EGDB_SHA256= # optional: expected archive checksum (mirror/archive path only)

# (placeholders for future phases)
# HF_TOKEN=
# WANDB_API_KEY=
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,7 @@ tabvision-server/tools/outputs/tfrecords/
tabvision-server/tools/outputs/finetune_smoke/
tabvision-server/tools/outputs/finetune/
tabvision-server/validation_set_cache_*

# local virtualenv + machine-local eval manifests
.venv/
tabvision/data/eval/local_*.toml
141 changes: 141 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
# AGENTS.md

Guidance for Codex when working in this repository.

## Project status (2026-05-05)

**TabVision is mid-spec-adoption.** A new canonical specification at
`SPEC.md` (formerly `TAB_SPEC_UPDATE.md`) reframes the project as a Python
CLI with strict module boundaries. v0 (Electron + Flask, ~91.6% F1 on
11-clip set) is **frozen**; v1 (`tabvision/` package) is being built in
parallel under `refactor/v1`.

**Read these before any non-trivial change:**
- `SPEC.md` — canonical spec (10-phase plan, §8 immutable contracts).
- `docs/plans/2026-05-05-tabvision-spec-adoption-design.md` — adoption design
(hybrid approach, phase mapping, sequencing, eval set strategy).
- `AUDIT.md` — Phase 0 audit: inventory, what works, reusable artifacts.
- `LICENSES.md` — dependency license map; ⚠️ items gate respective phase entry.
- `docs/DECISIONS.md` — non-obvious branches taken (per SPEC §0.5).

**Active branch (2026-05-13):** `main`. The Modal production deploy
(`936a5cc`) and v1 CI hardening landed on `main`; `refactor/v1` is now
**23 commits behind `main`** and should be treated as historical. Cut new
work branches off `main`. Older design docs (and earlier paragraphs in
this file) may reference paths that exist on `main` but not on
`refactor/v1` — verify with `git cat-file -e origin/main:<path>` before
relying on them. The full pipeline (`tabvision/tabvision/pipeline.py`),
the Modal production adapter (`tabvision-server/modal_app.py`,
`tabvision-server/app/v1_adapter.py`), and the highres audio backend all
live on `main`. Phase 5 fusion has shipped. See
`docs/2026-05-12-session-handoff.md` for the production state and
`docs/plans/2026-05-12-tab-f1-to-spec-design.md` (+ companion Phase 0
implementation plan) for current accuracy work.

## Layout

```
tab_vision/
├── tabvision/ ← v1 (active) — Python package + CLI
│ ├── tabvision/ ← importable package
│ │ ├── types.py ← SPEC §8 contracts (immutable)
│ │ ├── audio/, video/, fusion/, render/, preflight/, demux/, cli.py
│ ├── pyproject.toml
│ ├── tests/{unit,integration,eval}/
│ ├── scripts/{acquire,train,eval,augment,annotate}/
│ └── data/{fixtures,eval,augmented}/
├── tabvision-server/ ← FROZEN v0 backend (Flask). No further dev.
├── tabvision-client/ ← FROZEN v0 desktop UI (Electron). No further dev.
├── web-client/ ← FROZEN v0 web client (Vite + Vercel).
├── docs/
│ ├── plans/ ← design docs (current + historical)
│ └── DECISIONS.md ← record of non-obvious choices
├── AUDIT.md
├── LICENSES.md
├── SPEC.md ← canonical specification
└── AGENTS.md ← this file
```

## Operating rules (per SPEC §0)

1. **Audit before refactor.** Phase 0 audit (`AUDIT.md`) is non-negotiable.
2. **One phase at a time.** Phase N+1 starts only after Phase N's acceptance
gate (SPEC §9.3) passes AND user says "proceed."
3. **§8 contracts are immutable** within a phase. Implementations may change;
signatures may not, except by explicit user approval and a SPEC update.
4. **Tests over commits.** Every phase ships with new tests. A phase is
"done" when its acceptance criterion is met on the eval set.
5. **Track decisions.** Append to `docs/DECISIONS.md` per the format there.
6. **Free tools first.** Pretrained > fine-tuning > training from scratch.
Local > Colab > Kaggle. CPU-runnable > GPU-required.
7. **Flag, don't hallucinate.** Borderline metrics → low-confidence flag in
the result, not a guess.
8. **Stop and ask** when the spec is ambiguous, when a phase test fails in a
way the decision tree doesn't cover, or when an action would add a
dependency / training run that costs money.

## v1 dev commands

```bash
# Install (dev)
cd tabvision
pip install -e '.[dev]'

# Run tests
pytest -v

# Lint + types
ruff check .
ruff format --check .
mypy tabvision

# CLI (Phase 0 stub)
tabvision --version
```

## v0 (frozen) reference

The v0 backend at `tabvision-server/` is preserved as a working desktop demo
and as porting source for Phases 1, 4, 5. Do not develop new features in
v0; reference its modules during port work:

| v0 module | v1 destination |
|---|---|
| `tabvision-server/app/audio_pipeline.py` | `tabvision.audio.basicpitch` (Phase 1) |
| `tabvision-server/app/video_pipeline.py` | `tabvision.video.hand.mediapipe_backend` (Phase 4) |
| `tabvision-server/app/fretboard_detection.py` | `tabvision.video.fretboard.geometric` (Phase 3) |
| `tabvision-server/app/fusion_engine.py` | `tabvision.fusion.{viterbi,playability,chord}` (Phase 5) |
| `tabvision-server/app/guitar_mapping.py` | `tabvision.fusion.candidates` (Phase 5) |
| `tabvision-server/app/chord_shapes.py` | `tabvision.fusion.chord` (Phase 5) |

If v0 needs to stay runnable for the demo:

```bash
cd tabvision-server
source venv/bin/activate
python run.py # Flask dev server, port 5000
pytest tests/ # 17 v0 tests
```

## Acceptance targets (SPEC §1.4)

| Metric | Target | Definition |
|---|---|---|
| Onset F1 (50 ms) | ≥ 0.92 | mir_eval onset_f_measure |
| Pitch F1 (50 ms, no offset) | ≥ 0.90 | mir_eval note_f_measure |
| Tab F1 (string + fret + onset) | ≥ 0.88 | TP iff string + fret + onset all match |
| Chord-instance accuracy | ≥ 0.85 | Full fingering set per chord |
| End-to-end latency for 60 s clip on laptop CPU | ≤ 5 min | Wall-clock |

Per-tier (clean acoustic single-line / strummed / clean electric / distorted
electric): see SPEC §1.4 table.

## Glossary (selective)

- **§8 contracts** — the dataclasses and protocols in `SPEC.md` §8, mirrored
in `tabvision/tabvision/types.py`. Immutable within v1.
- **Phase** — a section of SPEC §7. Each has Goal / Deliverables / Acceptance
test / Decision tree.
- **Port** — wrap existing v0 logic to fit a §8 contract (Phases 1, 4, 5
per design doc §3).
- **Build** — net-new work (Phases 0, 1.5, 2, 6, 9 per design doc §3).
19 changes: 15 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,16 +119,27 @@ pytest tests/ # 17 v0 tests

## Acceptance targets (SPEC §1.4)

| Metric | Target | Definition |
**v1 scope (2026-06-02): acoustic, audio-only.** Honest audio-only targets on
GuitarSet (see SPEC §1.4.1): single-line Tab F1 ≥ 0.45, strummed ≥ 0.60,
aggregate ≥ 0.55, + onset ≥ 0.92 / pitch ≥ 0.90 / chord ≥ 0.85 / latency ≤ 5 min.
**Single-line is information-limited** — audio can't resolve which string a pitch
is on; 0.94 is a **v1.1 video** target (`docs/EVAL_REPORTS/acoustic_single_line_2026-06-02.md`).
**Electric tiers → v2** (clean-electric measured **0.12**; acoustic-trained
backbone, no in-repo training code — `cross_dataset_prior_2026-06-02.md`). v1
ships the **tone toggle** (electric → separate `highres-electric` checkpoint).
**SPEC §1.4 + §1.4.1 are the single source of truth**; don't change
scope/targets without a SPEC edit + user approval.

| Metric | Target (v1, audio-only acoustic) | Definition |
|---|---|---|
| Onset F1 (50 ms) | ≥ 0.92 | mir_eval onset_f_measure |
| Pitch F1 (50 ms, no offset) | ≥ 0.90 | mir_eval note_f_measure |
| Tab F1 (string + fret + onset) | ≥ 0.88 | TP iff string + fret + onset all match |
| Tab F1 (string + fret + onset), aggregate | ≥ 0.55 | TP iff string + fret + onset all match |
| Chord-instance accuracy | ≥ 0.85 | Full fingering set per chord |
| End-to-end latency for 60 s clip on laptop CPU | ≤ 5 min | Wall-clock |

Per-tier (clean acoustic single-line / strummed / clean electric / distorted
electric): see SPEC §1.4 table.
Per-tier acoustic targets (single-line ≥ 0.45 / strummed ≥ 0.60) + the v1.1
video stretch (0.94 / 0.86): see SPEC §1.4.1.

## Glossary (selective)

Expand Down
15 changes: 9 additions & 6 deletions LICENSES.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,14 @@ Phase 0 (this document) produces the initial map; Phase 9 verifies.

| Dataset | Phase | License | Status | Notes |
|---|---|---|---|---|
| GuitarSet | 1.5 / 7 | CC-BY-4.0 | ✅ | https://guitarset.weebly.com — JAMS annotations, hexaphonic. Already used in v0 finetune work. Re-distribution requires attribution; not committed to repo. |
| IDMT-SMT-Guitar | 1.5 / 7 | research-use, registration | ⚠️ | Training-only; not redistributed in our repo. Verify scope of "research use" for portfolio context. |
| EGDB | 1.5 / 7 | TBD | ⚠️ | https://github.com/ss12f32v/GuitarTranscription — multi-amp distorted electric. Verify before relying on it for distorted-electric tier eval. |
| DadaGP | 7 | TBD | ⚠️ | https://github.com/dada-bots/dadaGP — GuitarPro tabs as synthetic-data substrate. |
| User clips (existing 11/20 self-recorded) | 1.5 (bonus) | self-owned | ✅ | iPhone OOD bonus tier per design doc §6. Owned by Patrick. |
| GuitarSet | 1.5 / 7 / **Phase 0 (this PR)** | CC-BY-4.0 | ✅ | https://guitarset.weebly.com — JAMS annotations, hexaphonic. Already used in v0 finetune work. Re-distribution requires attribution; not committed to repo. **Used as the only data source for the 2026-05-13 composite baseline** (player 05 held-out validation; 60 tracks; 8 715 gold notes). |
| Guitar-TECHS | Phase 0 (eval) / 1.5 / 7 | CC-BY-4.0 (Zenodo record 14963133) | ✅ eval-only | arXiv:2501.03720 — 3 electric guitarists, 5h12m multi-mic + DI; per-string 6-track MIDI. **Acquirer landed** (`scripts.acquire.datasets guitar-techs`, Zenodo API). **Scanner landed** (`manifest_builder.scan_guitar_techs` → `clean_electric` tier) — layout *inferred*, verify against first real download. Not redistributed here; required attribution must appear in the public README. |
| IDMT-SMT-Guitar | 1.5 / 7 | research-use, registration | ⚠️ | Training-only; not redistributed in our repo. Verified 2026-05-13 research pass; superseded by Guitar-TECHS for v1 acceptance — kept for potential future training augmentation. |
| EGDB | 1.5 / 7 / Phase 0 (eval) | **author-granted use (2026-06-01)** | ✅ eval-only | https://ss12f32v.github.io/Guitar-Transcription/ — 240 tracks, ~12h with multi-amp electric variants, GuitarPro tabs + aligned MIDI. **Access is open** — the audio is a public Google Drive folder linked from the project page; the *license* was the only gate (the repo has no LICENSE file → default all-rights-reserved). Author (`f08946011@ntu.edu.tw`) granted portfolio use 2026-06-01. **ACTION REQUIRED: save the grant email under `docs/` (e.g. `docs/licenses/egdb-grant-2026-06-01.eml`) and log it in `docs/DECISIONS.md` — the written grant is the only evidence the gate cleared (SPEC §1.4 hard rule).** Treated like GuitarSet: held-out distorted-electric eval source, **not redistributed** here and **not a shipped-weight substrate** unless the grant explicitly permits portfolio distribution. If the grant is research-only, it remains an eval gate only. |
| ~~GOAT~~ | DROPPED | request-only, research-only | ❌ | arXiv:2509.22655. Verified 2026-05-13: distribution gated per-use ("for research purposes only, upon request") due to copyrighted cover-song content. Not portfolio-compatible per SPEC §1.5; removed from the eval composite. |
| ~~SynthTab~~ | DROPPED from default pipeline | dataset CC-BY-NC-4.0 (code CC-BY-4.0) | ❌ | github.com/yongyizang/SynthTab. Dataset NC clause taints derived weights (SynthTab paper treats trained models as derivative work). Not portfolio-compatible per SPEC §1.5; removed from the planned pretrain pipeline 2026-05-13. The repo code (Apache/CC-BY) remains MIT-style usable for our own renderers if needed. |
| DadaGP | research/dev only — **not in default pipeline** | access-by-email; underlying GP tabs derive from copyrighted songs | ⚠️ | https://github.com/dada-bots/dadaGP. Per 2026-05-13 design plan §4.2, acceptable as internal training augmentation only. Synthetic-source clips are blocked from non-train manifest splits by `tabvision.eval.manifest.validate_manifest` (the `SYNTHETIC_IN_EVAL_SPLIT` guard). |
| ~~User clips (the 20 self-recorded set)~~ | BANNED | self-owned | ⛔ | Banned from all roles per 2026-05-13 design plan D10 — not as accuracy gate, dev set, or label source. Replaced by the public-corpus composite. |
| Roboflow `b101/guitar-3` | 3 (training) | **CC BY 4.0** | ✅ | **Verified 2026-05-05.** Source: https://universe.roboflow.com/b101/guitar-3. Forked into Patrick's workspace as `patricks-workspace-vozcg/guitar-3-4efcd` v2; YOLOv8-OBB export downloaded (926 images, 710/144/72 split, classes: fret / neck / nut). License declared in the dataset's README.dataset.txt: "License: CC BY 4.0". Attribution: "guitar 3" by b101 on Roboflow Universe (https://universe.roboflow.com/b101/guitar-3), CC BY 4.0; export downloaded May 5, 2026 via the Roboflow SDK. **Required attribution must appear in the public README and any blog post.** |

## Library dependencies (default pipeline)
Expand Down Expand Up @@ -115,7 +118,7 @@ will be needed.
- [ ] **Phase 2 (open):** Add `hf-midi-transcription` to dependencies and verify it runs on Python 3.11 / our platform.
- [ ] **Phase 2 (open):** Confirm the `guitar-gaps.pth` checkpoint covers our acoustic + electric clean tier (per the GAPS paper, GAPS = "Classical Guitar Dataset" so it's mostly classical). May need `guitar-fl.pth` (Francois Leduc, electric/jazz) as a complementary backbone for some clips.
- [ ] **Phase 3:** Resolve ultralytics AGPL applicability to weights-only consumption.
- [ ] **Phase 7:** Verify EGDB license for distorted-electric eval/training.
- [x] **EGDB license — author-granted use 2026-06-01** (eval-only; save grant email under `docs/` + log in `docs/DECISIONS.md`; not a shipped-weight substrate unless the grant permits portfolio distribution).
- [ ] **Phase 7:** Verify DadaGP license for synthetic-data rendering.
- [ ] **Phase 6:** Verify PyGuitarPro LGPL implications for portfolio distribution.
- [ ] **Phase 9:** Expand the license-check scaffold to compare loaded model artifacts against the ✅ list.
81 changes: 50 additions & 31 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,40 +121,59 @@ The targets above are aggregate over the full eval set. Per-difficulty-tier expe

If the aggregate hits 0.88 but distorted electric scores below 0.75, treat that as a partial pass and prioritize Phase 7 distortion-augmented fine-tuning before final acceptance.

### 1.4.1 v1 acceptance amendment — per-tier targets (2026-05-13)
### 1.4.1 v1 acceptance — acoustic scope; electric deferred to v2 (2026-06-02)

Per the 2026-05-13 design plan
(`docs/plans/2026-05-12-tab-f1-to-spec-design.md`), v1 acceptance moves
from the aggregate 0.88 Tab F1 in §1.4 to **per-tier targets on a
public-corpus composite eval set**:
This section **supersedes** the 2026-06-01 "highest targets including
electric" amendment. Per user direction (2026-06-02), **v1 is scoped to
acoustic guitar.** This is an **evidence-based** scope decision, not a
relaxation: electric was measured (see below) and found to be blocked on a
model that does not yet exist.

| Tier | §1.4 stretch reference | v1 acceptance |
**v1 acceptance (honest audio-only targets, 2026-06-02).** Single-line is
**information-limited** from audio (the string/fret ambiguity — see below), so
targets are set to the demonstrated audio-only capability, not the original
0.94 / 0.86 (which become the **v1.1 video-assisted** reference):

| Tier | v1 acceptance | demonstrated (mean / lower-95) |
|---|---:|---:|
| Clean acoustic single-line | 0.94 | **0.85** |
| Clean acoustic strummed | 0.86 | **0.90** |
| Clean electric | 0.90 | **0.87** |
| Distorted electric | 0.82 | **0.80** |

Rationale: 2026-05-08 GuitarSet validation showed aggregate Tab F1 = 0.61
with comp tracks at 0.67 and solo tracks at 0.51 despite both being near
0.92 Pitch F1. The aggregate hid the structural failure mode (single-line
string/fret assignment). Per-tier targets force the conversation onto the
right axis and let work be sequenced (strummed first, distorted electric
last).

**Test-set composition amendment:** the "user's own playing" test set in
§1.4 paragraph 1 is replaced by a public-corpus composite (GuitarSet
held-out + Guitar-TECHS + EGDB pending license + qualifying synthetic
training/dev material). See the design plan §5 for composite policy
(per-tier minimums, splits, leakage rules, bootstrap CIs).

**Stretch / portfolio reference:** the original §1.4 per-tier table
(0.94 / 0.86 / 0.90 / 0.82) remains the v1.1 / portfolio stretch bar.
Hitting it is welcome; v1 acceptance requires only the amended table.

**Aggregate Tab F1** is retired as an acceptance metric. **Onset F1
(≥ 0.92), Pitch F1 (≥ 0.90), chord-instance accuracy (≥ 0.85), and
latency (≤ 5 min)** from §1.4 are unchanged.
| Clean acoustic single-line | ≥ 0.45 | 0.52 / 0.46 |
| Clean acoustic strummed | ≥ 0.60 | 0.68 / 0.61 |
| Aggregate Tab F1 | ≥ 0.55 | ~0.64 |

Plus Onset F1 ≥ 0.92, Pitch F1 ≥ 0.90, chord-instance accuracy ≥ 0.85,
latency ≤ 5 min — all **over the acoustic eval set** (GuitarSet held-out
player 05). Acceptance test: `lower_95_CI ≥ target` over clips (95 % bootstrap
CIs). Personal clips remain banned as a gate.

**Electric tiers (clean electric 0.90, distorted electric 0.82) — deferred
to v2.** Evidence (`docs/EVAL_REPORTS/cross_dataset_prior_2026-06-02.md`):
the highres backbone is acoustic-trained (GAPS); on electric (Guitar-TECHS)
pitch F1 collapses 0.93 → **0.73** and clean-electric Tab F1 is **0.12**.
The off-the-shelf `guitar_fl` checkpoint does not help (≈ same). There is no
highres **training** code in-repo, so closing electric requires a fine-tune
that is a bounded v2 project — not a v1 gate.

**Electric is on the roadmap, not abandoned.** v1 ships the **tone toggle**:
`SessionConfig.instrument == "electric"` routes to a separate
`highres-electric` backend (a v2 checkpoint), so the acoustic model is never
disturbed and the electric model drops in non-disruptively when trained. See
`docs/plans/2026-06-02-electric-backbone-finetune-design.md` (v2 fine-tune
plan + separate-checkpoint rationale).

**Why single-line is capped (honest framing).** The single-line loss is
overwhelmingly `wrong_position_same_pitch` (322 of ~380 errors; pitch is
*correct*) — audio cannot determine which string a pitch was played on (the
same pitch is acoustically near-identical across strings). The melodic prior
(regresses) and hand-position continuity (small, no single-line lift) were
measured and do **not** close it; audio-only sits near ~0.52 (see
`docs/EVAL_REPORTS/acoustic_single_line_2026-06-02.md`). **0.94 single-line
requires video string-resolution (v1.1)** or a timbral string-ID model. A
style/structure-conditional position prior (design-plan Phase 3) is the only
remaining audio-only lever, with bounded upside.

**§1.4 is the single source of truth for acceptance** (read with this
acoustic-scope amendment). Where any other document (CLAUDE.md, AGENTS.md,
design plans, DECISIONS.md) disagrees, §1.4 + §1.4.1 govern.

### 1.5 Hard constraints

Expand Down
6 changes: 0 additions & 6 deletions combined_typechecker_and_linter_problems.txt

This file was deleted.

6 changes: 0 additions & 6 deletions coordination/active_work_registry.json

This file was deleted.

Loading
Loading