Addresses all blocking + minor items from PR #136 review.
Architectural change (T2/H3 — the review's main complaint):
generate_brands was previously a separate Rust binary that produced a TOML
artifact, with its stamp written "on behalf" by import_economics.py at the
end of its own run. Reviewers flagged the invisible coupling: two sources
of truth in a system designed to have one, and no way to tell from the
stamp that one "generator" was really a subroutine of the other.
import_economics now invokes tooling/generate-brands as the first step of
its main() flow, before opening its own DB connection. The TOML artefact
is still produced and still committed (useful for diff-review of brand
changes), but there's now one pipeline owner. The meta table carries two
rows (import_economics, generate_atlas) not three; the Rust binary's
source SHA folds into import_economics' stamp via IMPORT_ECONOMICS_SOURCES.
A MIGRATION_SQL DELETE cleans up pre-merge DBs that still have the
orphan generate_brands row.
Other review items addressed in-line:
H1 generate_atlas._write_stamp no longer commits — transaction ownership
stays with the caller (matches import_economics pattern). Stamp +
atlas data now commit atomically; a failed stamp rolls back the
atlas data rather than leaving a stamp-missing-data intermediate.
H2 _file_sha1 (in both import_economics, generate_atlas,
check-systems-db-stamp) raises FileNotFoundError on missing sources
instead of silently contributing an empty-bytes hash. A ghost-SHA
convergence could otherwise produce vacuous "fresh" passes.
H4 pre-push no-meta-table warning rephrased — was "run after next
regeneration", now "run now if this DB was generated by you".
T1 asset-pipeline.md determinism claim softened: the stamp is
deterministic (same source → same recorded SHA), the DB binary is
not (generated_at + SQLite rowids/freelist churn).
T3 asset-pipeline.md gains a "migration escape hatch" section naming
MIGRATION_SQL in import_economics.py as the only sanctioned path
for direct writes, and forbidding hand-run sqlite-exec / one-off
patch scripts / SQLite-GUI edits.
T4 Makefile regen-db now runs as a single shell with `set -e`. A
failure in one generator halts the pipeline immediately, preventing
the "stale data, fresh stamp" state where a later step stamped a
DB whose earlier step had failed. import_economics' exit code 2
(coverage gate warning) remains explicitly tolerated.
T5 pre-push stamp check now runs on a branch's first push too —
compares against origin/main instead of origin/$BRANCH, closing
the gap where a new branch could ship a stale DB via the first push.
T6 check-systems-db-stamp fails closed on unknown generator_names in
meta — a future branch adding a new generator without registering
it in GENERATOR_SOURCES will now be rejected, not silently skipped.
T7 /pr-push watch list gains a mutual cross-reference comment with
GENERATOR_SOURCES in check-systems-db-stamp, plus the missing
names.rs source file, so the two lists cannot silently drift.
Follow-up tickets created:
#887 T8 decisions-orphan-tickets CLI — surfaces tickets whose
decision_ref points at a non-existent D-record.
#888 T9 meta.schema_version monotonic semver — for savegame migration
lineage in Phase 5+ (SHA comparison can't be ordered).
Verified:
make regen-db end-to-end — OK
make check-systems-db — OK, 2 generator(s) up to date
STALE detection — OK, verified by touching generate_atlas.py
/pr-push watch list — OK, flags this branch's changed sources
decision show D-159 — OK, structured output with tickets + refs
Refs: #855#856#857#858#859 PR #136
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sprint 37 observed Opus 4.7 teammates in team mode ignoring scope
rules ("don't modify files outside your team"), leaving tasks
half-done, and failing to report back via SendMessage. Closest public
issues are anthropics/claude-code#47598 (4.6 subagent delegation
regression) and claude-agent-sdk-python#577 (SendMessage delivery in
team mode). No 4.7-specific team-mode issue published yet but symptoms
are real.
Fix: every Task spawn with a team_name argument now passes
model: "sonnet". The team lead (the session running the skill) stays
on whatever model the user selected — typically Opus.
Inline Agent spawns without team_name (one-shot reviewers in
/pr-review, research subagents, general-purpose one-offs) are
exempt — they keep their default model. The pin targets long-running
coordination specifically, not every Agent call.
Affected skills:
- sprint-start: step 8d Task template adds model: "sonnet" and
documents the rule with the 4.7 regression context
- workshop-start: step 5 spawn list adds the model pin with a
one-line reason
Adds `.claude/rules/asset-pipeline.md` describing the full pipeline —
generators, meta stamp, pre-push hook, how to make DB/schema changes,
and why direct systems.db edits are forbidden. CLAUDE.md and DEVOPS.md
point at the rules file; sprint-start template now reminds teammates
to read it before touching DB sources.
CLAUDE.md also gains the missing `decision show` row in the CLI tool
table (companion to #723's `decision show` subcommand).
Refs: #859#723
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new step 4a that detects generator-source or economy-data changes
vs origin/main and runs `make regen-db` before the push, staging the
updated systems.db. Pairs with the pre-push hook (#857) — instead of
rejecting a stale DB, /pr-push proactively freshens it.
Refs: #858
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The worktree cleanup step was documented as "safe to skip if the
sprint didn't use ephemeral worktrees" — which invited a pre-check.
Sprint 36 close did that pre-check from inside the repo root, where
.sprint/ doesn't exist, concluded no worktrees, and skipped teardown.
Three stale worktrees persisted until Sprint 37 planning surfaced them.
Fix: always run the script (idempotent, prints a graceful message when
empty). Document that .sprint/ is a sibling of the repo root, not a
child, so future sessions don't repeat the same ls-based pre-check.
Add a post-run verification step.
- pr-review: require manual smoke test for merge-path PRs (pre-game flow,
scene transitions, save/load, connection handshake). Unchecked
author-side smoke boxes downgrade verdict from APPROVED to
REQUEST_CHANGES. Triggered by #872 — New Game hangs on 'connecting'
landed through PR #134 with the exact smoke box unchecked.
- pr-push: wipe Godot script class cache before the runtime smoke check
so cold-start parse-order bugs surface pre-push instead of failing
the next fresh-clone parse. Sprint 36 hit this post-merge — MetaScreen
base class not found because the cache was warm on developer machines
but cold in CI / post-merge. Cold-cache check stays in the skill (not
the pre-push hook) to keep iteration fast.
Two Sprint 36 lessons folded into the pr-push skill's pre-push
workflow.
1a (new, mandatory). Orphan Godot process check. `ps -eo pid,etimes,cmd
| awk` filter for `godot.*gdunit4-run` processes running longer than
5 minutes. Ask the user before killing. Blocks Sprint 36's failure
mode where stale background test-runner invocations (from an earlier
hung run) silently wedged fresh test runs by stealing CPU — an hour
of verification time lost to exactly this.
1c (widened). Headless parse + scanner check. The old grep was
`grep -i "SCRIPT ERROR"`, which missed Godot's resource scanner
category errors like "Export type can only be built-in, a resource,
a node, or an enum" — those surface as plain `ERROR` lines, not
prefixed `SCRIPT ERROR`. Widened to
`grep -iE "^(SCRIPT )?ERROR|Parse Error|Export type"` and filtered
against the known pre-existing autoload class_name parse-order
noise (Messagepack, LocalBridge, ServerProcess, Constants — per
CLAUDE.md's documented trap). Commit 84105916 shipped an
`@export var descriptor: CharacterVisualDescriptor` issue that the
narrower grep missed; Tyre caught it five commits later.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Qdrant index (commonwealth collection, 475 points) was stale —
pointing at old worktree paths from previous sprints with no
maintenance. Grep covers all current search needs.
Removed: qdrant_connector.py, wrapper scripts (qdrant-search,
qdrant-index, qdrant-health, qdrant-count), /docs-search skill,
Qdrant/Ollama config entries, and all active references in agents,
rules, briefings, DEVOPS, CLAUDE.md, and TEAM.md. The commonwealth
collection was dropped from tower-of-joy:6333.
Historical references in discussion archives and sprint briefings
are preserved as-is.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clarify that every /pr-review invocation must start fresh — fetch,
check PRs, and re-read the diff even if the branch was reviewed
earlier in the same conversation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tickets with no team assignment caused start-sprint.sh to create
a spurious "sprint-N/None" worktree and Ptyxis tab. Filter at both
the SQL level (AND team IS NOT NULL) and Python level (if r['team']).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove severity tiers from PR reviews. Every comment must be addressed
before merge — no "suggestion" category that gets skipped. Teams can
push back on specific comments with a technical rationale; team lead
evaluates and can retract. Bar: "the reviewer was wrong" not "we don't
want to."
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Team worktree windows stay on their sprint branch. PR reviews run from
main. Updated step 9b to explicitly stop the team lead from spawning
reviewers — push the PR and wait for feedback instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pass "claude /sprint-start" as the initial tmux command so each team
tab loads its briefing and spawns agents automatically — no manual
step needed after tabs open.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
start-sprint.sh now uses --tab for all teams (opens in active Ptyxis
window) instead of --new-window. No separate main tab — the caller
is already on main.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move start-sprint.sh into .claude/skills/sprint-start/scripts/ (was
standalone at parent directory level). Sprint-start Case B now calls
the script automatically after activating a sprint — creates ephemeral
worktrees and opens Ptyxis tabs for each active team.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Persistent worktrees (server, client, copy, audio, visual, ci, planning,
maintenance) caused agents crossing boundaries, stuck agents leaving
uncommitted work, and index.lock collisions. Replaced with ephemeral
sprint branches (sprint-{N}/{team}) and worktrees created on demand.
Changes:
- New start-sprint script replaces start-session (dynamic tabs per active team)
- Sprint teardown integrated into sprint-start skill (A1c step)
- SR_DB_PATH env var for database access from any directory
- CLAUDE.md team boundaries rewritten (scope-based, not directory-based)
- Agent Rule 0 updated to team scope dirs instead of worktree isolation
- PR review uses git show instead of cross-directory reads
- Briefing template updated for sprint-{N}/{team} branch naming
- Deleted worktree-update skill (obsolete)
- Removed WORKTREE_TEAM env var and cross-directory Read permissions
- All 8 persistent worktrees removed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sprint 30 showed that grepping source files does not distinguish
committed code from uncommitted agent work. Added mandatory
git status + git diff --stat check from repo root before accepting
"already done" claims, and a warning about CWD path resolution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New `list-systems` subcommand with --sector, --hop, --finished, --unfinished
filters. Also adds --sector flag to existing `unfinished` and `next` commands
for corridor-scoped queries during atlas authoring.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
atlas-update-field: update system-level fields across star_systems,
system_gates, and system_history tables with field whitelist.
atlas-commit-and-sync: full per-system pipeline (verify → wipe → commit
→ sync-wiki → git commit). Updated atlas SKILL.md with new commands.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rewrite atlas-verify as proper Python script (was inline Python in
bash with path injection risk). Adds star_type/spectral_class
consistency check. Supports multiple files via glob.
- Add atlas-names and atlas-systems-done query helpers (clean versions
of what the copy branch created — supersedes atlas-helpers.sh)
- Wire atlas-verify into Makefile (make atlas-verify, pre-pr-content)
- Update atlas skill references to point to the script
- Merge diff-based skip into pre-push hook: only lint client/ or
server/ when those dirs actually changed in the push. Combined with
existing directory-existence guards for cold worktrees.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rust binary (server/src/bin/atlas.rs) with commands: show-system,
show-body, show-station, list-bodies, list-stations, add-body,
add-station, stats, populate. Reads from server/data/systems.db.
Wrapper at tooling/atlas, skill at .claude/skills/atlas/SKILL.md.
Scope note: atlas will grow to cover the full geographic hierarchy
(planetary surfaces, settlements, districts) as the cascade progresses.
Also: removed stale star_systems table from settledreach.db (belongs
in systems.db only) and ran initial populate pass (329 bodies + 301
horizon stations across 301 systems).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sprint 28 lesson: 3 review rounds without launching the game missed
critical bugs. Now enforced:
- pr-push: mandatory headless smoke test before pushing, visual
verification question for UI changes
- pr-review: parse check before spawning reviewers, process gap flag
if runtime testing wasn't performed
- Araminta: check Poly Haven + Quaternius before creating assets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full parameter reference for image_to_3d (9 params) and extract_glb
(3 params) with failure mode table. Added Godot embedded_image_handling
guidance and input requirements for concept images.
Fix Blender export_image_format from 'PNG' to 'AUTO' (Blender 5.0
removed PNG as a valid option).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Python wrapper for the Gemini image generation API, used by the
image-gen skill to produce concept art for the 3D pipeline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplified image-gen SKILL.md, removed obsolete DDS/style references
(replaced by Gemini API connector). Updated audio_connector, gitignore,
and CLAUDE.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New skill for converting concept images to game-ready .glb models via
Trellis (image-to-3D) and Blender post-processing (scale normalization,
material setup, recolor mask generation).
Connectors: trellis_connector.py (Gradio API), image_connector.py
(Gemini API for concept art).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix D-134 cross-references to point to architecture.md (not content.md)
- Fix stale #620 reference in D-147 body (now #679)
- Fix content.md footer count (44, not 45)
- Add D-145, D-146, D-147 to decisions/README.md index
- Add Q-WTF-041 entry to questions-content.md (was referenced but untracked)
- Fix sprint-28-candidates.md totals line
- Align spelling to British "customisation" throughout new decisions
- Add information boundary classification to D-147 (public trait, per D-010)
- Add "first message" instruction to proposer rules in sprint-start skill
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sprint 27 planning session exposed that discussion agents (Ozzie) can
unilaterally write decisions and modify the DB before consensus is
reached. Add step 8d-planning to /sprint-start that classifies agents
as proposers (analyze only) or executors (SI, Qatux — wait for
consensus). Also add planning to valid team branches.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tea-comment now accepts @/path/to/file.md syntax to read comment body
from a file, avoiding $() subshells that break permission matching.
Updated pr-review skill and tea-cli rules with the new pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Between rounds: mandatory AskUserQuestion checkpoint before next round launches
- Wrap-up: user explicitly controls team dismissal
- Hard requirements before close: D-records filed, discussion captured, tickets created
- User reviews workshop-outcomes.md before finalization
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Insert A1b retrospective step between sprint close and version bump.
Covers: what shipped, what didn't, what we learned, process notes.
Process improvements are optional — only proposed when something was
actually broken.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The in-universe setting name is "the Settled Reach", not
"Commonwealth" (Hamilton's protected IP). Updated all 17 agent
description lines and intro paragraphs, plus file-specific
references in araminta, gore, ozzie, paula, and tiger.
Kept book references in miri.md (inspiration) and si.md (namesake).
Also updated pr-review and git-commit skill references.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace worktree-centric language with team-centric framing across
CLAUDE.md and skills. Agents now identify by $WORKTREE_TEAM env var
instead of resolving git internals. This prevents agents from
following .git pointers back to the main repo and crossing boundaries.
- CLAUDE.md: rename section to "Team boundaries", reference $WORKTREE_TEAM
- sprint-start: add TEAM BOUNDARY rule to agent spawn prompt
- sprint-plan: replace "worktree-relative paths" with "relative paths only"
- pr-review: replace "worktree" with "team directory", note cross-dir
reading is a main-team privilege only
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidates all connector scripts under tooling/ per project
structure conventions. Symlink at db/connectors → tooling/db/
preserves backwards compatibility (remove after Sprint 22).
Updated references in CLAUDE.md, Makefile, DEVOPS.md, all skill
files, agent files, rules, schema comments, and Sprint 21
briefings. Python scripts updated with correct SCHEMA_PATH
(now relative to WORKTREE_ROOT/db/schema.sql).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaced /var/home/jeroenschweitzer/Projects/ with /var/mnt/data/projects/
across 13 files (skills, docs, workshops, discussions).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Supports design discussion tickets that run on the planning branch
with a purpose-assembled agent panel. Includes Qatux (documenter)
and SI (project manager) for bookkeeping alongside domain agents.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>