This file survives context compression. Re-read on every interaction.
Do NOT edit any codebase file unless an active OpenSpec change in openspec/changes/ explicitly covers the requested scope. If none exists, stop and ask:
- a) Create new change (
/opsx:new) - b) Continue an existing change
- c) Add a delta to an existing change
Skip ONLY when the user says "skip openspec" or "implement without openspec change".
Read openspec/CHANGE_ORDER.md first — it is the single source of truth for sequencing, blockers, and archive status. Update it in the same commit as any change lifecycle event.
dev and main are protected. Never commit directly. Always use:
feature/→ minor version bumpbugfix/→ patch version bumphotfix/→ patch version bump
hatch run formathatch run type-checkhatch run linthatch run yaml-linthatch run contract-testhatch run smart-test(orsmart-test-fullfor larger changes)
- All public APIs:
@icontract(@require,@ensure,@invariant) +@beartype - Contracts are the primary validation; unit tests are secondary
- Never write redundant tests that just re-check what contracts enforce
Use from specfact_cli.common import get_bridge_logger. Debug logs go to ~/.specfact/logs/specfact-debug.log.
Bump in lockstep: pyproject.toml, setup.py, src/specfact_cli/__init__.py. Update CHANGELOG.md in the same commit as the version bump.
- Conventional Commits:
feat:,fix:,docs:,test:,refactor: - Python 3.11+, line length 120, Google-style docstrings
- Pydantic
BaseModelfor all data structures rich~=13.5.2is pinned — do not upgrade without checking semgrep compat