Two post-migration cleanups, following PR #154 (decisions + ticketing on pql).
1. Phases gate on the cascade hierarchy, not labels
The migration carried the old milestone over as a phase:4label, which had already
drifted (66 tickets under the Phase-4 epic but only 42 labelled). pql's native
initiative/epic hierarchy already models this: initiative T-745 (Development Cascade)
holds the six phases as epics. So phase membership is now "parented under the phase epic"
— self-maintaining, no label to forget.
T-750 (Phase 4) → in_progress (active phase; sequential per D-166).
Re-parented 2 strays (T-974, T-1008) under T-750; dropped all 42 phase:4 labels.
/whats-next, /ticket, ticket-cli.md, CLAUDE.md now gate on pql ticket list --under <active-phase-epic> --unblocked.
Fixed a doc bug: pql's label action is add|rm, not add|remove.
pql-requirements #9 flipped — no milestone entity / labels-as-milestones needed.
2. Phase 6 — retire legacy SQLite tooling
The pql cutover is stable (verified live via the clide IDE's pql panels), so remove the
superseded SQLite planning tooling. Surgical: only ticket/decision/raw-SQL scripts
(settledreach.db-bound, replaced by pql) deleted; asset/audio/wiki connectors + shared common.py kept (they only use common.ensure_venv).
Removed tooling/db/{ticket,decision,decisions-sync,decisions_sync.py,sqlite-*}, the
db-backup/db-install ritual + committed settledreach.db.backup, the dead
check-decision-ids stub, Makefile targets, SR_DB_PATH + dead allowlist entries.
Updated DEVOPS.md / project-structure / asset-pipeline / ticket-cli to pql.
Net −1500 lines. The live settledreach.db (gitignored) stays on disk as cold rollback.
## Summary
Two post-migration cleanups, following PR #154 (decisions + ticketing on pql).
### 1. Phases gate on the cascade hierarchy, not labels
The migration carried the old milestone over as a `phase:4` **label**, which had already
drifted (66 tickets under the Phase-4 epic but only 42 labelled). pql's native
initiative/epic hierarchy already models this: initiative **T-745** (Development Cascade)
holds the six phases as epics. So phase membership is now "parented under the phase epic"
— self-maintaining, no label to forget.
- T-750 (Phase 4) → `in_progress` (active phase; sequential per D-166).
- Re-parented 2 strays (T-974, T-1008) under T-750; dropped all 42 `phase:4` labels.
- `/whats-next`, `/ticket`, ticket-cli.md, CLAUDE.md now gate on
`pql ticket list --under <active-phase-epic> --unblocked`.
- Fixed a doc bug: pql's label action is `add|rm`, not `add|remove`.
- pql-requirements #9 flipped — no milestone entity / labels-as-milestones needed.
### 2. Phase 6 — retire legacy SQLite tooling
The pql cutover is stable (verified live via the clide IDE's pql panels), so remove the
superseded SQLite planning tooling. Surgical: only ticket/decision/raw-SQL scripts
(settledreach.db-bound, replaced by pql) deleted; asset/audio/wiki connectors + shared
`common.py` kept (they only use `common.ensure_venv`).
- Removed tooling/db/{ticket,decision,decisions-sync,decisions_sync.py,sqlite-*}, the
db-backup/db-install ritual + committed settledreach.db.backup, the dead
check-decision-ids stub, Makefile targets, SR_DB_PATH + dead allowlist entries.
- Updated DEVOPS.md / project-structure / asset-pipeline / ticket-cli to pql.
- Net −1500 lines. The live settledreach.db (gitignored) stays on disk as cold rollback.
## Verification
- `pql decisions validate` ok; 357 decisions / 1013 tickets.
- `pql plan rebuild` reconstructs the re-parent + status + label-tombstone mutations.
- `--under T-750 --unblocked` returns the active phase's ready work.
- ruff clean; kept asset connectors still parse + import common.ensure_venv.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Replaces the labels-as-milestones pattern (carried over from the retired SQLite
milestone subsystem) with pql's native initiative/epic hierarchy, which already
modelled this: initiative T-745 (Development Cascade) holds the six phases as epics.
A ticket is in a phase by being parented under that phase epic — self-maintaining,
no label to apply or forget.
The `phase:4` label had already drifted (66 tickets under the Phase-4 epic T-750 but
only 42 labelled). Fixes:
- T-750 (Phase 4) -> in_progress to mark the active phase (sequential per D-166).
- Re-parented the 2 strays (T-974 Atlas-to-tile epic, T-1008 economy task) under T-750.
- Dropped all 42 phase:4 labels (tombstoned in the changelog).
- /whats-next, /ticket, ticket-cli.md, CLAUDE.md now gate on
`pql ticket list --under <active-phase-epic> --unblocked` instead of `--label phase:4`.
- Fixed the label-action verb in the docs: pql uses `add|rm`, not `add|remove`.
- pql-requirements #9 flipped: no milestone entity / labels-as-milestones needed — the
initiative/epic tree is the answer.
Verified: `pql plan rebuild` reconstructs the mutations; `--under T-750 --unblocked`
returns the active phase's ready work.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The pql cutover is stable, so remove the superseded SQLite planning tooling. Surgical
— only the ticket/decision/raw-SQL scripts (all settledreach.db-bound and replaced by
pql) are deleted; the asset/audio/wiki connectors and shared common.py stay.
Removed:
- tooling/db/{ticket,decision,decisions-sync,decisions_sync.py,sqlite-query,sqlite-exec,
sqlite-init,sqlite-seed,sqlite_connector.py}
- tooling/{db-backup,db-install} + docs/backups/settledreach.db.backup (the binary-DB
backup ritual; tickets now live in the git-tracked .pql/changelog/)
- tooling/check-decision-ids (dead stub, superseded by `pql decisions validate`)
- Makefile db-backup/db-install targets; SR_DB_PATH + tooling/db/{ticket,sqlite-*,
decision*} entries from .claude/settings.json (audio entries kept)
Updated docs to pql: DEVOPS.md (SQLite Access + Decisions System → pql), project
structure, ticket-cli closing note, asset-pipeline raw-SQL warning.
Kept (verified still imported by the asset connectors via common.ensure_venv): common.py,
config.json, audio/image/trellis/wiki connectors. The live settledreach.db file
(gitignored, repo-parent) is left on disk as a cold rollback only.
ruff clean; pql decisions validate ok (357 decisions / 1013 tickets).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Review: post-migration-cleanup → main (type: code)
Tyre (architecture) + Hoshe (QA).
Tyre (Architecture): APPROVE
Both changes sound. Phases-as-hierarchy correctly maps D-166's sequential cascade
(initiative T-745 → six phase epics; T-750 in_progress is the active gate), and --under T-750 --unblocked is strictly better than the drifted label (the hierarchy
self-maintains; labels need manual discipline). Label tombstones land correctly. The
Phase-6 deletions are clean — every kept connector imports only common.ensure_venv;
nothing depends on the removed settledreach.db path.
Non-blocking note:
#
File
Issue
–
tooling/db/common.py
Docstring still names deleted scripts (ticket/sprint/sqlite_connector/decisions_sync) as consumers; resolve_db_path/get_connection are now dead settledreach.db code. Cosmetic.
Hoshe (QA): REQUEST_CHANGES
Phase model + deletions verified: --label phase:4 empty, T-750 in_progress, T-974/T-1008
re-parented to T-750, 357 decisions / 1013 tickets survive plan rebuild, decisions validate
ok, no dangling refs to deleted scripts in active files, label verb consistent (add/rm).
One defect:
#
File
Issue
1
docs/DEVOPS.md:19
Repository Layout still lists decisions/ — should be governance/ (line 323 already correct).
Verdict: CHANGES REQUESTED
Both accepted (no pushback). Fixing the DEVOPS layout path + the common.py docstring/dead-code on the branch.
## Review: post-migration-cleanup → main (type: code)
Tyre (architecture) + Hoshe (QA).
### Tyre (Architecture): APPROVE
Both changes sound. Phases-as-hierarchy correctly maps D-166's sequential cascade
(initiative T-745 → six phase epics; T-750 `in_progress` is the active gate), and
`--under T-750 --unblocked` is strictly better than the drifted label (the hierarchy
self-maintains; labels need manual discipline). Label tombstones land correctly. The
Phase-6 deletions are clean — every kept connector imports only `common.ensure_venv`;
nothing depends on the removed settledreach.db path.
Non-blocking note:
| # | File | Issue |
|---|------|-------|
| – | `tooling/db/common.py` | Docstring still names deleted scripts (ticket/sprint/sqlite_connector/decisions_sync) as consumers; `resolve_db_path`/`get_connection` are now dead settledreach.db code. Cosmetic. |
### Hoshe (QA): REQUEST_CHANGES
Phase model + deletions verified: `--label phase:4` empty, T-750 `in_progress`, T-974/T-1008
re-parented to T-750, 357 decisions / 1013 tickets survive `plan rebuild`, `decisions validate`
ok, no dangling refs to deleted scripts in active files, label verb consistent (`add`/`rm`).
One defect:
| # | File | Issue |
|---|------|-------|
| 1 | `docs/DEVOPS.md:19` | Repository Layout still lists `decisions/` — should be `governance/` (line 323 already correct). |
### Verdict: CHANGES REQUESTED
Both accepted (no pushback). Fixing the DEVOPS layout path + the common.py docstring/dead-code on the branch.
Hoshe (QA): docs/DEVOPS.md Repository Layout still listed `decisions/` — corrected to
`governance/` (the DQR tree) and added a `.pql/` entry for the planning store.
Tyre (architecture, non-blocking): tooling/db/common.py docstring named deleted scripts
as consumers and `resolve_db_path`/`load_config`/`get_connection` were dead settledreach.db
code. Trimmed common.py to just `ensure_venv` (the only symbol any kept connector imports)
and rewrote the docstring to name the real consumers.
ruff clean; common.py parses; ensure_venv intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Two post-migration cleanups, following PR #154 (decisions + ticketing on pql).
1. Phases gate on the cascade hierarchy, not labels
The migration carried the old milestone over as a
phase:4label, which had alreadydrifted (66 tickets under the Phase-4 epic but only 42 labelled). pql's native
initiative/epic hierarchy already models this: initiative T-745 (Development Cascade)
holds the six phases as epics. So phase membership is now "parented under the phase epic"
— self-maintaining, no label to forget.
in_progress(active phase; sequential per D-166).phase:4labels./whats-next,/ticket, ticket-cli.md, CLAUDE.md now gate onpql ticket list --under <active-phase-epic> --unblocked.add|rm, notadd|remove.2. Phase 6 — retire legacy SQLite tooling
The pql cutover is stable (verified live via the clide IDE's pql panels), so remove the
superseded SQLite planning tooling. Surgical: only ticket/decision/raw-SQL scripts
(settledreach.db-bound, replaced by pql) deleted; asset/audio/wiki connectors + shared
common.pykept (they only usecommon.ensure_venv).db-backup/db-install ritual + committed settledreach.db.backup, the dead
check-decision-ids stub, Makefile targets, SR_DB_PATH + dead allowlist entries.
Verification
pql decisions validateok; 357 decisions / 1013 tickets.pql plan rebuildreconstructs the re-parent + status + label-tombstone mutations.--under T-750 --unblockedreturns the active phase's ready work.🤖 Generated with Claude Code
The pql cutover is stable, so remove the superseded SQLite planning tooling. Surgical — only the ticket/decision/raw-SQL scripts (all settledreach.db-bound and replaced by pql) are deleted; the asset/audio/wiki connectors and shared common.py stay. Removed: - tooling/db/{ticket,decision,decisions-sync,decisions_sync.py,sqlite-query,sqlite-exec, sqlite-init,sqlite-seed,sqlite_connector.py} - tooling/{db-backup,db-install} + docs/backups/settledreach.db.backup (the binary-DB backup ritual; tickets now live in the git-tracked .pql/changelog/) - tooling/check-decision-ids (dead stub, superseded by `pql decisions validate`) - Makefile db-backup/db-install targets; SR_DB_PATH + tooling/db/{ticket,sqlite-*, decision*} entries from .claude/settings.json (audio entries kept) Updated docs to pql: DEVOPS.md (SQLite Access + Decisions System → pql), project structure, ticket-cli closing note, asset-pipeline raw-SQL warning. Kept (verified still imported by the asset connectors via common.ensure_venv): common.py, config.json, audio/image/trellis/wiki connectors. The live settledreach.db file (gitignored, repo-parent) is left on disk as a cold rollback only. ruff clean; pql decisions validate ok (357 decisions / 1013 tickets). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Review: post-migration-cleanup → main (type: code)
Tyre (architecture) + Hoshe (QA).
Tyre (Architecture): APPROVE
Both changes sound. Phases-as-hierarchy correctly maps D-166's sequential cascade
(initiative T-745 → six phase epics; T-750
in_progressis the active gate), and--under T-750 --unblockedis strictly better than the drifted label (the hierarchyself-maintains; labels need manual discipline). Label tombstones land correctly. The
Phase-6 deletions are clean — every kept connector imports only
common.ensure_venv;nothing depends on the removed settledreach.db path.
Non-blocking note:
tooling/db/common.pyresolve_db_path/get_connectionare now dead settledreach.db code. Cosmetic.Hoshe (QA): REQUEST_CHANGES
Phase model + deletions verified:
--label phase:4empty, T-750in_progress, T-974/T-1008re-parented to T-750, 357 decisions / 1013 tickets survive
plan rebuild,decisions validateok, no dangling refs to deleted scripts in active files, label verb consistent (
add/rm).One defect:
docs/DEVOPS.md:19decisions/— should begovernance/(line 323 already correct).Verdict: CHANGES REQUESTED
Both accepted (no pushback). Fixing the DEVOPS layout path + the common.py docstring/dead-code on the branch.
Re-review after fixes — APPROVED ✅
Both reviewers approve (commit
ccc194d5f):governance/+.pql/entry added; common.py trimmed and parses. APPROVE.Phase model verified (label empty, T-750 in_progress, strays re-parented, 357/1013 survive rebuild); Phase-6 deletions clean (no dangling refs, kept connectors intact). Ready to merge.
Pull request closed