diff --git a/CHANGELOG.md b/CHANGELOG.md index 31215f6..125098e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,24 @@ All notable changes to this project will be documented in this file. --- +## [0.30.4] - 2026-02-12 + +### Fixed (0.30.4) + +- **Backlog refine mixed-format parsing hardening** + - Prevented duplicate `Notes` content in normalized writeback output when mixed `## Description` + inline `**Notes**:` formatting is returned by Copilot. + - Preserved internal headings (for example `## Risks`) inside label-style `Notes:` blocks instead of truncating at the heading line. + - Improved parser section-boundary handling so label capture flushes only at canonical section boundaries. +- **Copilot refinement instruction quality** + - Added explicit expected output scaffold for refinement responses. + - Added explicit rule to omit unknown metadata fields (no placeholders such as `(unspecified)` or `provide area path`). + +### Changed (0.30.4) + +- **Version**: Bumped to `0.30.4` (patch). + +--- + ## [0.30.3] - 2026-02-12 ### Fixed (0.30.3) diff --git a/MEMORY.md b/MEMORY.md new file mode 100644 index 0000000..d0621eb --- /dev/null +++ b/MEMORY.md @@ -0,0 +1,51 @@ +# MEMORY.md — Non-Negotiable Guardrails + +This file survives context compression. Re-read on every interaction. + +## 1. OpenSpec Gate (HARD BLOCK) + +**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. + +## 2. Branch Protection + +`dev` and `main` are protected. Never commit directly. Always use: +- `feature/` → minor version bump +- `bugfix/` → patch version bump +- `hotfix/` → patch version bump + +## 3. Pre-Commit Checklist (ordered, all must pass) + +1. `hatch run format` +2. `hatch run type-check` +3. `hatch run lint` +4. `hatch run yaml-lint` +5. `hatch run contract-test` +6. `hatch run smart-test` (or `smart-test-full` for larger changes) + +## 4. Contract-First Development + +- 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 + +## 5. No print() — Ever + +Use `from specfact_cli.common import get_bridge_logger`. Debug logs go to `~/.specfact/logs/specfact-debug.log`. + +## 6. Version Sync + +Bump in lockstep: `pyproject.toml`, `setup.py`, `src/specfact_cli/__init__.py`. Update `CHANGELOG.md` in the same commit as the version bump. + +## 7. Commits & Style + +- Conventional Commits: `feat:`, `fix:`, `docs:`, `test:`, `refactor:` +- Python 3.11+, line length 120, Google-style docstrings +- Pydantic `BaseModel` for all data structures +- `rich~=13.5.2` is pinned — do not upgrade without checking semgrep compat diff --git a/pyproject.toml b/pyproject.toml index 8893981..2e2878e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "specfact-cli" -version = "0.30.3" +version = "0.30.4" description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases." readme = "README.md" requires-python = ">=3.11" diff --git a/setup.py b/setup.py index 6bf118e..9e2af69 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ if __name__ == "__main__": _setup = setup( name="specfact-cli", - version="0.30.3", + version="0.30.4", description=( "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with " "validation and contract enforcement for new projects and long-lived codebases." diff --git a/src/__init__.py b/src/__init__.py index 534238e..06a2ff7 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -3,4 +3,4 @@ """ # Package version: keep in sync with pyproject.toml, setup.py, src/specfact_cli/__init__.py -__version__ = "0.30.3" +__version__ = "0.30.4" diff --git a/src/specfact_cli/__init__.py b/src/specfact_cli/__init__.py index b86071b..5eeac3a 100644 --- a/src/specfact_cli/__init__.py +++ b/src/specfact_cli/__init__.py @@ -8,6 +8,6 @@ - Supporting agile ceremonies and team workflows """ -__version__ = "0.30.3" +__version__ = "0.30.4" __all__ = ["__version__"]