Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
393 commits
Select commit Hold shift + click to select a range
0f4a77c
Archive delta validation change and update specs
djm81 Feb 18, 2026
e2c93d1
Update patch version
djm81 Feb 18, 2026
c1c41f5
Potential fix for pull request finding 'Empty except'
djm81 Feb 19, 2026
27063ba
apply review fixes
djm81 Feb 19, 2026
6350aa8
Merge branch 'main' into dev
djm81 Feb 19, 2026
767d5b8
Add cli validation changes
djm81 Feb 19, 2026
3f4e1a3
Merge branch 'main' into dev
djm81 Feb 19, 2026
4f4b2ff
feat: launch central module marketplace lifecycle (#287)
djm81 Feb 21, 2026
78ddf06
Merge branch 'main' into dev
djm81 Feb 21, 2026
6772f0a
fix: resolve bundle-mapper review defects with TDD evidence (#290)
djm81 Feb 22, 2026
4529df1
feat:Add architecture review docs and findings to mitigate
djm81 Feb 22, 2026
cc50388
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 22, 2026
53a0fce
feat(backlog): add backlog add for interactive issue creation (#289)
djm81 Feb 22, 2026
c651c42
chore(openspec): archive completed changes and align architecture doc…
djm81 Feb 22, 2026
d7e8199
docs(change): Archive architecture discrepancy remediation change
djm81 Feb 22, 2026
aa4a9fb
fix(codeql): preserve module contract marker and document fallback ex…
djm81 Feb 22, 2026
176cd09
Merge branch 'main' into dev
djm81 Feb 22, 2026
30e2bbe
fix(backlog): restore installed-runtime discovery parity and add back…
djm81 Feb 23, 2026
9f479e4
fix(version): sync manifests to 0.36.1 and archive backlog-core-04 (#…
djm81 Feb 23, 2026
37a4a30
Merge branch 'main' into dev
djm81 Feb 23, 2026
991d568
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 23, 2026
15194b8
fix: harden module lifecycle bootstrap and signing workflows (#299)
djm81 Feb 24, 2026
a819852
test: simplify monkeypatch callables in module_security tests
djm81 Feb 24, 2026
67cd7e9
Merge branch 'main' into dev
djm81 Feb 24, 2026
078012f
Fix duplicate with statement
djm81 Feb 24, 2026
fa0604a
Merge branch 'main' into dev
djm81 Feb 24, 2026
c3f5bb6
chore(release): bump to v0.37.1 and harden signature gates
djm81 Feb 24, 2026
c0692e9
test: fix init command regression assertions
djm81 Feb 24, 2026
7787ba7
Merge branch 'main' into dev
djm81 Feb 24, 2026
db8d153
fix: release v0.37.2 with runtime crypto deps
djm81 Feb 24, 2026
cce4cf7
fix: address signature-backend warning and module version drift
djm81 Feb 24, 2026
297fb6c
fix: use hatch build in PyPI publish workflow script (#304)
djm81 Feb 24, 2026
e63669c
Merge branch 'main' into dev
djm81 Feb 24, 2026
dad2381
fix: resolve startup module freshness home path dynamically (#306)
djm81 Feb 24, 2026
0e1ac55
Merge branch 'main' into dev
djm81 Feb 24, 2026
764e5c9
Merge branch 'main' into dev
djm81 Feb 24, 2026
fa8708c
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 24, 2026
5d90ced
fix: harden module signing workflow and reduce startup log noise
djm81 Feb 24, 2026
276830e
test: align module migration compatibility with decoupled module vers…
djm81 Feb 24, 2026
effd96f
fix: fail fast on invalid base ref in changed-only module signing
djm81 Feb 24, 2026
798fc1a
fix: stabilize module precedence and backlog github mapping flow
djm81 Feb 25, 2026
f72d6e8
merge: resolve main into dev and retain module/backlog updates
djm81 Feb 25, 2026
c6a05f5
fix(module-registry): persist disables and correct bundled availability
djm81 Feb 25, 2026
c9db837
Re-sign module registry and fix / ignore local temp artifacts
djm81 Feb 25, 2026
db4da83
bump module registry version to 0.1.3
djm81 Feb 25, 2026
48ae89b
fix(registry): restore protocol reporting logs in debug mode
djm81 Feb 25, 2026
c87c2d0
Merge branch 'main' into dev
djm81 Feb 25, 2026
619f2a3
fix(backlog): harden refine writeback, prompts, and any-filter semant…
djm81 Feb 25, 2026
818dd32
fix(hooks,ado): correct format gate and enforce iteration on direct
djm81 Feb 25, 2026
954ff76
Apply review findings and fix tests
djm81 Feb 26, 2026
9825acd
Merge branch 'main' into dev
djm81 Feb 26, 2026
27b4078
Pin virtualenv < 21 to avoid incaopatibility failure
djm81 Feb 26, 2026
f9e9d74
Merge branch 'main' into dev
djm81 Feb 26, 2026
567a303
fix: finalize backlog-core-06 ado comment API versioning (#314)
djm81 Feb 26, 2026
a95e89f
feat: Advanced marketplace features (marketplace-02) - dependency res…
djm81 Feb 27, 2026
4a0620a
Merge branch 'main' into dev
djm81 Feb 27, 2026
c5635c9
fix: complete marketplace publish registry PR flow and bump (#320)
djm81 Feb 27, 2026
4ec9bdc
Merge branch 'main' into dev
djm81 Feb 27, 2026
f48631d
fix: update init ide hint and repair publish workflow
djm81 Feb 27, 2026
37d8475
Merge branch 'main' into dev
djm81 Feb 27, 2026
8be301e
feat(backlog): normalize daily summarize Markdown output (#323)
djm81 Feb 27, 2026
a6dcab0
Update version
djm81 Feb 27, 2026
0b99c6c
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 27, 2026
073ae36
Merge branch 'main' into dev
djm81 Feb 27, 2026
2f13173
Add github skills
djm81 Feb 27, 2026
1e743b5
Add new marketplace changes
djm81 Feb 27, 2026
da80932
feat(cli): category groups and flat shims using real module Typer (#331)
djm81 Feb 28, 2026
c480e19
Update docs regarding module migration change
djm81 Feb 28, 2026
039da8b
feat: module-migration-02 bundle extraction (#332)
djm81 Mar 2, 2026
f4ae6b0
Implement blockers to prepare for module-migration-03 change. (#336)
djm81 Mar 2, 2026
efadc08
feat: module-migration-03 core slimming closeout and registry fixes (…
djm81 Mar 3, 2026
aeeaab0
Finalize module-migration-02 change
djm81 Mar 3, 2026
e1a90be
docs(backlog-auth): update auth docs and OpenSpec task status (#342)
djm81 Mar 3, 2026
d7d7c68
chore(openspec): archive completed changes and sync main specs
djm81 Mar 3, 2026
27ef25a
docs(openspec): prefix module migration proposal titles with IDs
djm81 Mar 3, 2026
594b0fa
Add bug change for ado required fields setting and update change order
djm81 Mar 4, 2026
10c1d6c
Update change order
djm81 Mar 4, 2026
f86b516
feat(core): finalize migration-03 auth removal and 3-core slim packag…
djm81 Mar 4, 2026
8b0e0d8
Archive module-migration-03 change
djm81 Mar 4, 2026
b1e9245
feat: remove flat command shims (category-only CLI) (#344)
djm81 Mar 4, 2026
5f9b537
Archived module-migration-04 and updated specs
djm81 Mar 4, 2026
ebb6e61
docs(openspec): finalize module-migration-05 tracking after modules P…
djm81 Mar 4, 2026
29df29c
Archive module-migration-05 change and update specs
djm81 Mar 4, 2026
1811f68
test(migration-06): move legacy sync tests out of core (#346)
djm81 Mar 5, 2026
61352f7
Archived module-migration-06 change and updated specs
djm81 Mar 5, 2026
9483fea
test: module-migration-07 core test ownership cleanup (#347)
djm81 Mar 5, 2026
c48fadb
Archived backlog-core-07 change and updated specs
djm81 Mar 5, 2026
2dd42f8
Update some docs and archive latest finished changes and specs
djm81 Mar 5, 2026
1e11e0a
Add docs update change
djm81 Mar 5, 2026
1578c6c
feat: add agile-01-feature-hierarchy change and update CHANGE_ORDER.m…
djm81 Mar 5, 2026
32c6fc1
docs: align core docs and sync pending changes (#377)
djm81 Mar 5, 2026
6b518b6
fix: stabilize release test suite after module migration
djm81 Mar 6, 2026
39409c5
Update module
djm81 Mar 6, 2026
675277f
Merge origin/main into dev for v0.40.0 release
djm81 Mar 6, 2026
acb3f88
Fix module install
djm81 Mar 6, 2026
04e96c5
Fix module install
djm81 Mar 6, 2026
4616064
Fix failed tests
djm81 Mar 6, 2026
53ed3a0
Merge branch 'main' into dev
djm81 Mar 6, 2026
e1a239e
Fix marketplace client regression
djm81 Mar 6, 2026
23ef66c
Merge branch 'main' into dev
djm81 Mar 6, 2026
d578657
Fix install regression for specfact-cli (#380)
djm81 Mar 6, 2026
5c8b661
Merge branch 'main' into dev
djm81 Mar 6, 2026
3de7b1c
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Mar 6, 2026
40e9695
Add changes to improve runtime validation and backlog module remainin…
djm81 Mar 6, 2026
978cc82
refactor: remove backlog ownership from core cli (#384)
djm81 Mar 6, 2026
00658a3
Add new command alignment change
djm81 Mar 6, 2026
f8e5af1
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Mar 6, 2026
08f028a
Merge branch 'main' into dev
djm81 Mar 6, 2026
332949e
fix: finalize cli runtime validation regressions (#387)
djm81 Mar 9, 2026
2a4a0ab
docs: archive cli-val-07 change
djm81 Mar 9, 2026
d031281
Archive changes and update specs
djm81 Mar 9, 2026
d21e157
Merge branch 'main' into dev
djm81 Mar 9, 2026
216f03f
Add code-review change proposals
djm81 Mar 10, 2026
e979938
test: align command surface regression coverage
djm81 Mar 10, 2026
9612cff
docs: add OpenSpec change for backlog-core commands migration (#390)
djm81 Mar 10, 2026
bd5badd
fix: use POST instead of PATCH for ADO work item creation (#391)
djm81 Mar 11, 2026
0448022
docs: archive backlog-02-migrate-core-commands change
djm81 Mar 11, 2026
e91e672
feat: document code-review module scaffold (#410)
djm81 Mar 11, 2026
aa494ff
Add change for project codebase ownership
djm81 Mar 11, 2026
b62292c
Merge branch 'main' into dev
djm81 Mar 11, 2026
67aaf31
Realign code import ownership surface (#412)
djm81 Mar 12, 2026
1f4d236
Update code review changes
djm81 Mar 16, 2026
516b4c7
docs: update reward ledger OpenSpec tracking (#413)
djm81 Mar 16, 2026
8579fe5
Track house-rules skill OpenSpec changes (#414)
djm81 Mar 16, 2026
ff8d041
docs: Update change-proposal for code-review-07 (#415)
djm81 Mar 16, 2026
b524f3a
Finalize code-review-07 status
djm81 Mar 16, 2026
097d8ef
Finalize code-review-08 status
djm81 Mar 16, 2026
37efea0
feat: apply code-review-09 pre-commit integration
djm81 Mar 17, 2026
fa503da
fix: fall back when cached hatch test env is broken
djm81 Mar 17, 2026
6e828e7
fix: avoid hatch env for coverage xml export
djm81 Mar 17, 2026
0aa178f
fix: install type-check and lint tools directly in CI
djm81 Mar 17, 2026
9f6a749
fix: install pytest fallback deps in test job
djm81 Mar 17, 2026
c451134
fix: install pytest-cov for test fallback path
djm81 Mar 17, 2026
f328223
Merge branch 'main' into dev
djm81 Mar 17, 2026
9146118
Merge branch 'main' into dev
djm81 Mar 17, 2026
0aa017d
Finalize code-review-09 status
djm81 Mar 17, 2026
f067288
[Change] Align core docs with modules site ownership (#419)
djm81 Mar 17, 2026
e456d46
fix: harden docs parity URL assertions
djm81 Mar 17, 2026
41052e6
Archive finished changes and update specs
djm81 Mar 17, 2026
05e81bb
Merge branch 'main' into dev
djm81 Mar 17, 2026
0648162
docs: fix command syntax parity after lean-core/modules split (v0.42.…
djm81 Mar 17, 2026
a6978a2
Archive finished changes and update specs
djm81 Mar 17, 2026
0273f1a
Update evidence
djm81 Mar 17, 2026
8ec2c11
Potential fix for pull request finding 'Unused global variable'
djm81 Mar 17, 2026
7d63dd8
Merge branch 'main' into dev
djm81 Mar 18, 2026
a77e5fd
docs: align core docs ownership and parity (#424)
djm81 Mar 20, 2026
664d4e4
docs: fix quickstart install guidance
djm81 Mar 20, 2026
09688de
docs: remove generated project plan docs
djm81 Mar 20, 2026
f7cca1e
Merge branch 'main' into dev
djm81 Mar 20, 2026
f4e91be
Add code-review change
djm81 Mar 20, 2026
37dfecb
fix: preserve native backlog import payloads (#429)
djm81 Mar 20, 2026
b54aaa6
fix: add docs review workflow and repair docs links (#428)
djm81 Mar 20, 2026
ae7f05c
fix: keep imported change ids stable across title changes (#431)
djm81 Mar 20, 2026
7449714
Merge branch 'main' into dev
djm81 Mar 20, 2026
65726fb
fix: remove conflicting pages file copies
djm81 Mar 20, 2026
fbb3b83
Merge branch 'main' into dev
djm81 Mar 20, 2026
c6c47fc
Add docs sync changs
djm81 Mar 20, 2026
eaa87ac
docs: update openspec clean-code planning
djm81 Mar 22, 2026
f602dba
Update change status
djm81 Mar 22, 2026
58314e5
fix: code-review-zero-findings dogfood remediation (v0.42.3) (#435)
djm81 Mar 23, 2026
fb3c5fd
Merge branch 'main' into dev
djm81 Mar 23, 2026
2809390
Add docs refactoring changes
djm81 Mar 23, 2026
215df59
Add bug change tracking for encoding and resources
djm81 Mar 24, 2026
2a60f15
docs: restructure core site IA to 6-section progressive nav (#442)
djm81 Mar 24, 2026
81bca26
fix: harden cross-platform runtime and IDE resource discovery (#443)
djm81 Mar 24, 2026
852f446
fix: resolve review type-safety findings
djm81 Mar 24, 2026
2bbde33
Merge branch 'main' into dev
djm81 Mar 24, 2026
8272233
Improve clarity and scope of ide prompt change
djm81 Mar 25, 2026
2f0675c
feat(init): IDE prompt source catalog, --prompts, namespaced exports …
djm81 Mar 25, 2026
278142e
fix tests
djm81 Mar 25, 2026
38a9d21
release: bump version to 0.42.5 and update CHANGELOG
djm81 Mar 25, 2026
f552107
Fix review findings
djm81 Mar 25, 2026
dab2ffe
feat(init): selective IDE prompt export cleanup and VS Code recommend…
djm81 Mar 25, 2026
fbb2307
Fix review findings
djm81 Mar 25, 2026
71e760b
Merge branch 'main' into dev
djm81 Mar 25, 2026
41dc0db
Add missing import
djm81 Mar 25, 2026
2b26098
Bump patch version and changelog
djm81 Mar 25, 2026
90da7da
Fix failed tests
djm81 Mar 25, 2026
1eca7a9
Fix review findings
djm81 Mar 25, 2026
07c19b4
Merge branch 'main' into dev
djm81 Mar 26, 2026
db4ddc3
docs: core vs modules URL contract and OpenSpec alignment (#448)
djm81 Mar 26, 2026
96f35d7
feat(docs-12): docs command validation and cross-site link checks (#449)
djm81 Mar 26, 2026
f11cb9e
fix(scripts): CliRunner without mix_stderr for Click 8.3+ compatibili…
djm81 Mar 26, 2026
7ccb122
fix: review gates (semgrep print, radon CC, icontract, questionary ty…
djm81 Mar 26, 2026
d516657
Merge branch 'main' into dev
djm81 Mar 26, 2026
86bdc7c
Add speckit adapter alignment change and update affected change specs
djm81 Mar 27, 2026
f92c820
feat(adapters): spec-kit v0.4.x adapter alignment (#454)
djm81 Mar 27, 2026
dd1e359
chore: bump version to 0.43.0 for spec-kit v0.4.x alignment (#455)
djm81 Mar 27, 2026
eec640e
fix(packaging): remove workflow prompts from core wheel (packaging-02…
djm81 Mar 27, 2026
f7fefdd
Potential fix for pull request finding 'Empty except'
djm81 Mar 28, 2026
280d158
Merge branch 'main' into dev
djm81 Mar 28, 2026
0cc2c3c
Fix changelog version
djm81 Mar 28, 2026
c1c2e47
docs: unify core docs portal UX (#459)
djm81 Mar 28, 2026
ce49cd5
Harden docs home URL test assertion
djm81 Mar 28, 2026
cb08cbb
Merge branch 'main' into dev
djm81 Mar 29, 2026
715d472
feat: doc frontmatter validation, v0.43.2 review JSON gate, and pre-c…
djm81 Mar 29, 2026
edc89a7
docs: archive doc-frontmatter-schema openspec change
djm81 Mar 29, 2026
85572f2
Apply suggestions from code review
djm81 Mar 29, 2026
117d568
fix: restore protocol stubs for type checking
djm81 Mar 29, 2026
582a53c
Add frontamtter check
djm81 Mar 29, 2026
4c4ef24
fix: harden protocol stubs for code quality
djm81 Mar 29, 2026
52ee695
Add PR test hardening change
djm81 Mar 29, 2026
644474a
fix: remediate review findings and harden review gates
djm81 Mar 30, 2026
3eff782
fix: rebuild review report model for pydantic
djm81 Mar 30, 2026
e44f15a
Merge branch 'main' into dev
djm81 Mar 30, 2026
93ff11e
Add story and onboarding change
djm81 Mar 30, 2026
506679e
Update change tracking
djm81 Mar 30, 2026
f84aa39
Improve scope for ci/cd requirements
djm81 Mar 30, 2026
11391c9
docs: sharpen first-contact story and onboarding (#467)
djm81 Mar 30, 2026
0fc5f1f
fix: harden review blockers and bump patch version
djm81 Mar 30, 2026
ab42fd0
test: harden modules docs url assertions
djm81 Mar 30, 2026
93b6dee
Merge branch 'main' into dev
djm81 Mar 30, 2026
c5efee3
fix: harden trustworthy green checks (#469)
djm81 Mar 30, 2026
30c70f3
fix: address CodeRabbit review findings for ci-02 (#471)
djm81 Mar 30, 2026
7709718
fix: propagate docker actionlint exit code instead of masking failure…
djm81 Mar 30, 2026
1ffdace
fix: assert hook id stability and cd to repo root for local actionlin…
djm81 Mar 30, 2026
4dcf207
Merge branch 'main' into dev
djm81 Mar 30, 2026
9dbe9d4
feat: clean-code-01-principle-gates — 7-principle charter gates, v0.4…
djm81 Mar 31, 2026
9855d35
feat: archive completed openspec changes and update main specs
djm81 Mar 31, 2026
e9e75d4
Merge branch 'main' into dev
djm81 Mar 31, 2026
6663324
Add new user onboarding change
djm81 Apr 1, 2026
b4a7ecf
docs & tooling: new user onboarding + smart-test and pre-commit revie…
djm81 Apr 2, 2026
e87058b
fix: code-review gate (Typer params), typer<0.24 vs semgrep, module u…
djm81 Apr 3, 2026
9696489
docs: restructure README for star conversion (#480)
djm81 Apr 3, 2026
8fe4a26
Merge branch 'main' into dev
djm81 Apr 3, 2026
903b131
Merge branch 'main' into dev
djm81 Apr 5, 2026
f1f1919
archived implemented changes
djm81 Apr 5, 2026
17ac397
Archive and remove outdated changes
djm81 Apr 5, 2026
9900b72
Split and refactor change proposals between both repos
djm81 Apr 8, 2026
2a73434
Merge remote-tracking branch 'origin/main' into dev
djm81 Apr 8, 2026
e8c3848
Archive alignment change
djm81 Apr 8, 2026
98cf86e
Merge branch 'main' into dev
djm81 Apr 8, 2026
5b5bac7
Add changes and github hierarchy scripts
djm81 Apr 9, 2026
280ac57
feat: add GitHub hierarchy cache sync (#492)
djm81 Apr 9, 2026
1b314a1
[codex] Compact agent governance loading (#493)
djm81 Apr 10, 2026
647ce0c
Archived github hierarchy change
djm81 Apr 10, 2026
338aa92
Update from dev
djm81 Apr 10, 2026
c5083cf
Update rules for openspec archive
djm81 Apr 10, 2026
74c566b
Potential fix for pull request finding 'Unused local variable'
djm81 Apr 10, 2026
685bd4e
Add wiki update notes
djm81 Apr 10, 2026
fdcc51a
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Apr 10, 2026
6c9f03b
Archive governance-03 change, format markdown, add wiki instructions …
djm81 Apr 10, 2026
de48d48
Fix review findings
djm81 Apr 10, 2026
186120e
Fix type errors
djm81 Apr 10, 2026
73b8f48
Merge branch 'main' into dev
djm81 Apr 10, 2026
951f3ae
fix: safe VS Code settings merge and project artifact writes (#490) (…
djm81 Apr 12, 2026
b1caa0e
chore(release): bump version to 0.46.0
djm81 Apr 12, 2026
14f3b41
Fix review findings (#498)
djm81 Apr 12, 2026
cabaa30
Merge review fixes from dev
djm81 Apr 12, 2026
4eea38e
fix: CodeRabbit review remediations for release 0.46.0 (#499)
djm81 Apr 13, 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
4 changes: 3 additions & 1 deletion .github/workflows/pr-orchestrator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ jobs:
if-no-files-found: ignore

linting:
name: Linting (ruff, pylint)
name: Linting (ruff, pylint, safe-write guard)
runs-on: ubuntu-latest
needs: [changes, verify-module-signatures]
if: needs.changes.outputs.code_changed == 'true' && needs.changes.outputs.skip_tests_dev_to_main != 'true'
Expand Down Expand Up @@ -545,10 +545,12 @@ jobs:
mkdir -p logs/lint
LINT_LOG="logs/lint/lint_$(date -u +%Y%m%d_%H%M%S).log"
{
set -euo pipefail
ruff format . --check
python -m basedpyright --pythonpath "$(python -c 'import sys; print(sys.executable)')"
ruff check .
pylint src tests tools
python scripts/verify_safe_project_writes.py
} 2>&1 | tee "$LINT_LOG"
exit "${PIPESTATUS[0]:-$?}"
- name: Upload lint logs
Expand Down
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,46 @@ All notable changes to this project will be documented in this file.

---

## [0.46.0] - 2026-04-13
Comment thread
djm81 marked this conversation as resolved.

### Added

- **GitHub hierarchy cache sync** (#492) for backlog metadata used in agent and automation workflows.
- **Agent governance loading** (#493): leaner, deterministic bootstrap for canonical rule documentation.

### Fixed

- **Tests / CI**: marketplace install mocks accept `install_module(module_id, InstallModuleOptions(...))`;
dynamic script loaders register modules in `sys.modules` before `exec_module` (doc frontmatter and
verify-bundle-published gates; Python 3.11 compatibility job).
- **Code review follow-ups**: safer DevOps/source-tracking edge cases, stricter parsers and validators, and
reduced duplication in analysis and sync helpers (see commits on `dev`).

### Changed

- **Governance / OpenSpec**: archived completed changes and aligned internal wiki maintenance notes.

---

## [0.45.2] - 2026-04-12

### Fixed

- **`specfact init ide` and `.vscode/settings.json`**: invalid JSON or non-mergeable `chat` blocks no longer
wipe unrelated VS Code settings; the command fails safe with guidance. Use `--force` only when you accept
replacing the file after a timestamped backup under `.specfact/recovery/`.
- **VS Code settings path**: resolved settings paths must stay inside the repository root (blocks symlink
escape); settings are parsed with **JSON5** so JSONC-style comments and trailing commas load correctly.
Serialized output is canonical JSON (comments from the original file are not preserved on rewrite).
- **`create_vscode_settings`**: an explicit empty `prompts_by_source` mapping no longer falls back to the
full prompt catalog when finalizing recommendations.
- **Regression gate**: lint now runs `scripts/verify_safe_project_writes.py` so IDE settings JSON I/O stays
routed through the shared merge helper.
- **Dev / Semgrep**: Hatch and `[dev]` extras pin `setuptools<82`
so Semgrep’s OpenTelemetry import chain still resolves `pkg_resources` (setuptools 82+ may omit it).

---

## [0.45.1] - 2026-04-03

### Changed
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ uvx specfact-cli code review run --path . --scope full
**Sample output:**

```text
SpecFact CLI - v0.45.1
SpecFact CLI - v0.46.0

Running Ruff checks...
Running Radon complexity checks...
Expand Down Expand Up @@ -84,7 +84,7 @@ It exists because delivery drifts in predictable ways:

```yaml
- repo: https://github.com/nold-ai/specfact-cli
rev: v0.45.1
rev: v0.46.0
hooks:
- id: specfact-smart-checks
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"

CLI_VERSION="${CLI_VERSION:-0.45.1}"
CLI_VERSION="${CLI_VERSION:-0.46.0}"
REPO_SLUG="${REPO_SLUG:-nold-ai/specfact-demo-repo}"
CAPTURE_REF="${CAPTURE_REF:-${CAPTURE_COMMIT:-2b5ba8cd57d16c1a1f24463a297fdb28fbede123}}"
WORK_DIR="${WORK_DIR:-/tmp/specfact-demo-repo}"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# README sample output capture

- CLI version: `0.45.1`
- CLI version: `0.46.0`
- Repo: `nold-ai/specfact-demo-repo`
- Repo ref: `2b5ba8cd57d16c1a1f24463a297fdb28fbede123`
- Review exit code: `1`
Expand All @@ -9,8 +9,8 @@
- Command:

```bash
uvx --from "specfact-cli==0.45.1" specfact init --profile solo-developer
uvx --from "specfact-cli==0.45.1" --with ruff --with radon --with semgrep --with basedpyright --with pylint --with crosshair-tool specfact code review run --path . --scope full
uvx --from "specfact-cli==0.46.0" specfact init --profile solo-developer
uvx --from "specfact-cli==0.46.0" --with ruff --with radon --with semgrep --with basedpyright --with pylint --with crosshair-tool specfact code review run --path . --scope full
```

- Raw output: `/workspace/docs/_support/readme-first-contact/sample-output/review-output.txt`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Downloading z3-solver (30.3MiB)
Downloaded basedpyright
Downloaded nodejs-wheel-binaries
Installed 111 packages in 394ms
SpecFact CLI - v0.45.1
SpecFact CLI - v0.46.0


⏱️ Started: 2026-04-03 20:55:28
Expand Down
5 changes: 5 additions & 0 deletions docs/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ specfact init ide --ide cursor --install-deps

**Important**: SpecFact CLI does **not** ship with built-in AI. `specfact init ide` installs prompt templates for supported IDEs so your chosen AI copilot can call SpecFact commands in a guided workflow.

For VS Code / Copilot, the CLI **merges** prompt recommendations into `.vscode/settings.json` and keeps your other
settings keys. If that file is **not parseable or mergeable by the CLI** (including a `chat` block the merge helper
cannot reconcile), the command stops without rewriting it; use `specfact init ide --force` only when you accept
replacing the file after a timestamped backup under `.specfact/recovery/`.

[More options ↓](#more-options)

## More options
Expand Down
6 changes: 3 additions & 3 deletions modules/bundle-mapper/module-package.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: bundle-mapper
version: 0.1.7
version: 0.1.9
commands: []
category: core
pip_dependencies: []
Expand All @@ -20,8 +20,8 @@ publisher:
url: https://github.com/nold-ai/specfact-cli-modules
email: hello@noldai.com
integrity:
checksum: sha256:6b078e7855d9acd3ce9abf0464cdab7f22753dd2ce4b5fc7af111ef72bc50f02
signature: v6/kVxxR/CNNnXkS2TTgeEAKPFS5ErPRf/GbwM0U9H20txu9kwZb6r5rQP9Spu5EZ+IdTs4JJ9cInicPwmE1Bw==
checksum: sha256:4a85297c8413d795e86aafa484df99aa499b2facde0481d2feb44db4bc3fe9b9
signature: znHhPC1AEKTQJUz7m1/e3wOt1LVIqOYedjXCov9Up7Bb/7N2rPY4EnboTIe9IO6Gj9cepTpd/12NZ/QISWrwBQ==
dependencies: []
description: Map backlog items to best-fit modules using scoring heuristics.
license: Apache-2.0
48 changes: 27 additions & 21 deletions modules/bundle-mapper/src/bundle_mapper/mapper/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from __future__ import annotations

import re
from dataclasses import dataclass
from pathlib import Path
from typing import Any, cast

Expand All @@ -30,6 +31,18 @@
HISTORY_CAP = 10.0


@dataclass(frozen=True, slots=True)
class _SignalContribution:
bundle_id: str
score: float
weight: float
source: str


def _signal_contribution(bundle_id: str, score: float, weight: float, source: str) -> _SignalContribution:
return _SignalContribution(bundle_id=bundle_id, score=score, weight=weight, source=source)


def _tokenize(text: str) -> set[str]:
"""Lowercase, split by non-alphanumeric."""
return set(re.findall(r"[a-z0-9]+", text.lower()))
Expand Down Expand Up @@ -154,19 +167,16 @@ def _apply_signal_contribution(
primary_bundle_id: str | None,
weighted: float,
reasons: list[str],
bundle_id: str,
score: float,
weight: float,
source: str,
signal: _SignalContribution,
) -> tuple[str | None, float]:
"""Apply one signal contribution to the primary score."""
if bundle_id and score > 0:
contrib = weight * score
if signal.bundle_id and signal.score > 0:
contrib = signal.weight * signal.score
if primary_bundle_id is None:
primary_bundle_id = bundle_id
primary_bundle_id = signal.bundle_id
weighted += contrib
reasons.append(self._explain_score(bundle_id, score, source))
elif bundle_id == primary_bundle_id:
reasons.append(self._explain_score(signal.bundle_id, signal.score, signal.source))
elif signal.bundle_id == primary_bundle_id:
weighted += contrib
return primary_bundle_id, weighted

Expand Down Expand Up @@ -210,19 +220,13 @@ def compute_mapping(self, item: BacklogItem) -> BundleMapping:
primary_bundle_id,
weighted,
reasons,
explicit_bundle or "",
explicit_score,
WEIGHT_EXPLICIT,
"explicit_label",
_signal_contribution(explicit_bundle or "", explicit_score, WEIGHT_EXPLICIT, "explicit_label"),
)
primary_bundle_id, weighted = self._apply_signal_contribution(
primary_bundle_id,
weighted,
reasons,
hist_bundle or "",
hist_score,
WEIGHT_HISTORICAL,
"historical",
_signal_contribution(hist_bundle or "", hist_score, WEIGHT_HISTORICAL, "historical"),
)

if content_list:
Expand All @@ -231,10 +235,12 @@ def compute_mapping(self, item: BacklogItem) -> BundleMapping:
primary_bundle_id,
weighted,
reasons,
best_content_bundle,
best_content_score,
WEIGHT_CONTENT,
"content_similarity",
_signal_contribution(
best_content_bundle,
best_content_score,
WEIGHT_CONTENT,
"content_similarity",
),
)

confidence = min(1.0, weighted)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# TDD evidence — profile-04-safe-project-artifact-writes

## Failing-first (targeted)

- **When**: 2026-04-12 (Europe/Berlin)
- **Command**:

```bash
cd ../specfact-cli-worktrees/bugfix/profile-04-safe-project-artifact-writes
hatch run pytest \
tests/unit/utils/test_project_artifact_write.py \
tests/unit/utils/test_ide_setup.py \
tests/unit/scripts/test_verify_safe_project_writes.py \
tests/unit/modules/init/test_init_ide_prompt_selection.py \
-q
```

- **Note**: New scenarios (`malformed_json_raises`, `preserves_unrelated_keys`, verify script) were added
before the safe-merge implementation; prior behavior treated invalid JSON as `{}` and could destroy user
settings (issue #487).

## Passing-after (targeted + e2e)

- **When**: 2026-04-12
- **Commands**:

```bash
hatch run pytest tests/unit/utils/test_project_artifact_write.py \
tests/unit/utils/test_ide_setup.py tests/unit/scripts/test_verify_safe_project_writes.py \
tests/unit/modules/init/test_init_ide_prompt_selection.py tests/e2e/test_init_command.py -q
hatch run format && hatch run type-check && hatch run lint
hatch run contract-test
hatch run smart-test
hatch test --cover -v
```

- **Full suite + coverage (`tasks.md` 4.3)**: same worktree; `hatch test --cover -v` — **exit 0**. Pytest summary:
`2450 passed, 9 skipped in 358.61s (0:05:58)`. Coverage footer (pytest-cov): `TOTAL ... 62%` on the combined
`src/` + `tools/` table (see run log for per-file lines).
Comment thread
djm81 marked this conversation as resolved.

- **Module signatures**: run
`hatch run ./scripts/verify-modules-signature.py --require-signature` — pass without bumping
`src/specfact_cli/modules/init/module-package.yaml` (init UX errors are raised from `ide_setup` so the init
module payload checksum is unchanged).

## Code review gate

- **Pass (2026-04-12)**: after `hatch run specfact module install nold-ai/specfact-codebase` and
`hatch run specfact module install nold-ai/specfact-code-review` (user scope), run:

```bash
hatch run specfact code review run --json --out .specfact/code-review.json \
src/specfact_cli/utils/project_artifact_write.py \
src/specfact_cli/utils/ide_setup.py \
scripts/verify_safe_project_writes.py
```

- Report: `.specfact/code-review.json` (exit 0, no blocking findings after merge-helper refactor and setuptools
pin).

## OpenSpec strict validation

- **Pass (2026-04-12)**:
`openspec validate profile-04-safe-project-artifact-writes --strict` — exit 0 (recorded at sign-off per
`tasks.md` 4.7).

## Worktree cleanup (post-merge on developer machine)

- Remove worktree, delete branch, prune — see `tasks.md` section 5 (not executed in this implementation
session).
65 changes: 47 additions & 18 deletions openspec/changes/profile-04-safe-project-artifact-writes/tasks.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,64 @@
## 1. Branch, coordination, and issue sync

- [ ] 1.1 Create `bugfix/profile-04-safe-project-artifact-writes` in a dedicated worktree from `origin/dev` and bootstrap Hatch in that worktree.
- [ ] 1.2 Sync the change proposal to GitHub under parent feature `#365`, link bug `#487`, and update `proposal.md` Source Tracking with issue metadata.
- [ ] 1.3 Confirm the paired modules-side change `project-runtime-01-safe-artifact-write-policy` is available and note the dependency in both PR descriptions/change evidence.
- [x] 1.1 Create `bugfix/profile-04-safe-project-artifact-writes` in a dedicated worktree from
`origin/dev`; run `hatch env create`, then pre-flight status checks `hatch run smart-test-status` and
`hatch run contract-test-status`.
- [ ] 1.2 Sync the change proposal to GitHub under parent feature `#365`, link bug `#487`, and update
`proposal.md` Source Tracking with issue metadata. *(human / PR author)*
- [ ] 1.3 Confirm the paired modules-side change `project-runtime-01-safe-artifact-write-policy` is
available and note the dependency in both PR descriptions/change evidence. *(human)*

## 2. Specs, regression fixtures, and failing evidence

- [ ] 2.1 Add or update regression fixtures for existing user-owned project artifacts such as `.vscode/settings.json` with unrelated custom settings.
- [ ] 2.2 Write tests from the new scenarios covering partial ownership, malformed settings fail-safe behavior, backup creation, and preservation of unrelated settings.
- [ ] 2.3 Write tests for the CI/static unsafe-write gate so direct writes to protected project artifacts are rejected unless routed through the sanctioned helper.
- [ ] 2.4 Run the targeted tests before implementation, capture the failing results, and record commands/timestamps in `openspec/changes/profile-04-safe-project-artifact-writes/TDD_EVIDENCE.md`.
- [x] 2.1 Add or update regression fixtures for existing user-owned project artifacts such as
`.vscode/settings.json` with unrelated custom settings. *(pytest tmp_path fixtures in
`test_project_artifact_write.py`)*
- [x] 2.2 Write tests from the new scenarios covering partial ownership, malformed settings fail-safe
behavior, backup creation, and preservation of unrelated settings.
- [x] 2.3 Write tests for the CI/static unsafe-write gate so direct writes to protected project
artifacts are rejected unless routed through the sanctioned helper.
- [x] 2.4 Run the targeted tests before implementation, capture the failing results, and record
commands/timestamps in `openspec/changes/profile-04-safe-project-artifact-writes/TDD_EVIDENCE.md`.

## 3. Core safe-write implementation

- [ ] 3.1 Implement the core safe-write helper and ownership model with `@beartype` and `@icontract` on public APIs.
- [ ] 3.2 Route `src/specfact_cli/utils/ide_setup.py` settings mutation through the helper so `.vscode/settings.json` preserves unrelated user-managed settings and strips only SpecFact-managed entries when needed.
- [ ] 3.3 Route applicable init/setup artifact copy flows through the helper or explicit safe modes, including fail-safe handling for malformed structured files and backup creation for explicit replacement.
- [ ] 3.4 Implement the CI/static guard for protected user-project artifacts in init/setup code paths and integrate it into the relevant local/CI quality workflow.
- [x] 3.1 Implement the core safe-write helper and ownership model with `@beartype` and `@icontract`
on public APIs.
- [x] 3.2 Route `src/specfact_cli/utils/ide_setup.py` settings mutation through the helper so
`.vscode/settings.json` preserves unrelated user-managed settings and strips only SpecFact-managed
entries when needed.
- [x] 3.3 Route applicable init/setup artifact copy flows through the helper or explicit safe modes,
including fail-safe handling for malformed structured files and backup creation for explicit
replacement. *(VS Code settings path; `init ide` surfaces errors + `--force` + backup)*
- [x] 3.4 Implement the CI/static guard for protected user-project artifacts in init/setup code paths
and integrate it into the relevant local/CI quality workflow. *(`scripts/verify_safe_project_writes.py`
+ `hatch run lint`)*

## 4. Verification, docs, and cross-repo handoff

- [ ] 4.1 Re-run the targeted tests and any broader init/setup regression coverage, capture passing results, and update `TDD_EVIDENCE.md`.
- [ ] 4.2 Research and update affected docs (`README.md`, installation/quickstart/init references) to document preservation guarantees, backup behavior, and explicit replacement semantics.
- [ ] 4.3 Run quality gates: `hatch run format`, `hatch run type-check`, `hatch run lint`, `hatch run yaml-lint`, `hatch run contract-test`, and `hatch run smart-test`.
- [ ] 4.4 Run `hatch run ./scripts/verify-modules-signature.py --require-signature`; if any bundled module manifests changed, bump versions, re-sign as required, and re-run verification.
- [ ] 4.5 Ensure `.specfact/code-review.json` is fresh, remediate all findings, and record the final review command/timestamp in `TDD_EVIDENCE.md` or PR notes.
- [ ] 4.6 Apply the appropriate version/changelog update for a bugfix release if implementation changes user-facing behavior, then open a PR to `dev` referencing the paired modules change.
- [x] 4.1 Re-run the targeted tests and any broader init/setup regression coverage, capture passing
results, and update `TDD_EVIDENCE.md`.
- [x] 4.2 Research and update affected docs (`README.md`, installation/quickstart/init references) to
document preservation guarantees, backup behavior, and explicit replacement semantics.
*(installation.md + version pins in README / samples)*
- [x] 4.3 Run quality gates: `hatch run format`, `hatch run type-check`, `hatch run lint`,
`hatch run yaml-lint`, `hatch run contract-test`, `hatch run smart-test`, and `hatch test --cover -v`.
- [x] 4.4 Run `hatch run ./scripts/verify-modules-signature.py --require-signature`; if any bundled
module manifests changed, bump versions, re-sign as required, and re-run verification. *(no
`modules/init` payload change — error UX handled in `ide_setup` to avoid re-signing)*
- [x] 4.5 Ensure `.specfact/code-review.json` is fresh, remediate all findings, and record the final
review command/timestamp in `TDD_EVIDENCE.md` or PR notes.
- [x] 4.6 Apply the appropriate version/changelog update for a bugfix release if implementation changes
user-facing behavior, then open a PR to `dev` referencing the paired modules change.
*(version/changelog done; PR human)*
- [x] 4.7 Run strict OpenSpec validation before sign-off:
`openspec validate profile-04-safe-project-artifact-writes --strict`; fix any validation errors until
it passes; record the successful run command and timestamp in `TDD_EVIDENCE.md` (or PR notes).

## 5. Worktree cleanup

- [ ] 5.1 Remove the worktree used for this change (for example `git worktree remove ../specfact-cli-worktrees/bugfix/profile-04-safe-project-artifact-writes`).
- [ ] 5.1 Remove the worktree used for this change (for example
`git worktree remove ../specfact-cli-worktrees/bugfix/profile-04-safe-project-artifact-writes`).
- [ ] 5.2 Delete the local branch after merge (`git branch -d bugfix/profile-04-safe-project-artifact-writes`).
- [ ] 5.3 Prune stale worktree metadata (`git worktree prune`).
- [ ] 5.4 Record cleanup completion in `TDD_EVIDENCE.md` alongside the 4.x verification notes.
Loading
Loading