Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
01ddfe1
Fix doc inventory drift and stale MSSQL refs
developzoneio Jul 17, 2026
3e10717
Add manifest and docs-consistency self-check
developzoneio Jul 17, 2026
11eca8e
Harden /sd:spec validate into a structural linter
developzoneio Jul 17, 2026
9ea251f
Add severity-tagged output and lint fixture to /sd:spec validate
developzoneio Jul 17, 2026
d24f3d2
Complete SW-4 lint-rule coverage in spec fixture
developzoneio Jul 20, 2026
afd34bd
Add hook conformance runner + spec-gate fixtures
developzoneio Jul 20, 2026
f0f8fbd
Add prompt-router conformance fixtures
developzoneio Jul 20, 2026
beeb6d7
Add subagent-retro conformance fixtures
developzoneio Jul 20, 2026
c60a40a
Fix bash hooks to honor explicit enabled:false
developzoneio Jul 20, 2026
0a4ef86
Strip CRLF from protected-path values in spec-gate
developzoneio Jul 20, 2026
d1cd60f
Clarify jq workaround comments in bash hooks
developzoneio Jul 20, 2026
4b15c44
Wire hook conformance suite into CI
developzoneio Jul 20, 2026
84594dc
Assert hook reasons and stderr in conformance
developzoneio Jul 20, 2026
075611a
Apply built-in defaults when config is absent
developzoneio Jul 20, 2026
bef6e8d
Match spec-gate paths case-insensitively
developzoneio Jul 20, 2026
668aa15
Cover subagent-retro debounce branch
developzoneio Jul 20, 2026
3f8f9fa
Fix spec-gate bash path-traversal protected-path bypass
developzoneio Jul 20, 2026
f00105b
Fix relative-path and trailing-separator bypass in spec-gate.ps1
developzoneio Jul 20, 2026
18e52de
Add SW-5 hook conformance implementation plan
developzoneio Jul 20, 2026
2323066
Add SW-6 gate hardening implementation plan
developzoneio Jul 21, 2026
f76bfdf
Add SC/AC traceability IDs and Covers task field
developzoneio Jul 21, 2026
748cf77
Fix stale 9-field count in spec-architect anti-patterns
developzoneio Jul 21, 2026
506eba0
Fix stale field ordinal and enumeration gaps
developzoneio Jul 21, 2026
326745d
Add /sd:verify traceability gate command
developzoneio Jul 21, 2026
33ba567
Gate feature close-out on /sd:verify pass
developzoneio Jul 21, 2026
b132295
Enforce /sd:verify pass on index done transition
developzoneio Jul 21, 2026
9d6cacc
Fix ID extraction and verifyGate parity in spec-gate
developzoneio Jul 21, 2026
4f34517
Document /sd:verify and bump command count to 12
developzoneio Jul 21, 2026
8b83f9f
Show SC/AC traceability in clean example fixture
developzoneio Jul 21, 2026
21e80c5
Add fixture verify artifacts and disclaimers
developzoneio Jul 21, 2026
4287a73
Scope verify gate to feature specs and harden docs
developzoneio Jul 21, 2026
26a1a7a
Fold verify-gate scoping into SW-6 Added entry
developzoneio Jul 21, 2026
d2059c0
Add privacy-safe spec metrics event log
developzoneio Jul 21, 2026
aa6cd10
Add structured retro lessons schema and validator
developzoneio Jul 21, 2026
6497d2c
Derive selftest-docs corruption count from disk
developzoneio Jul 21, 2026
6f0e7f6
Add lesson aggregator with byte-parity fixtures
developzoneio Jul 21, 2026
c611f2b
Pin lesson fixtures to LF via .gitattributes
developzoneio Jul 21, 2026
9e47e78
Surface retro lessons from subagent-retro
developzoneio Jul 21, 2026
9fdefba
Add task-block field grammar and SL060 gate (SW-11)
developzoneio Jul 22, 2026
fcc6280
Add complexity triage gate to /sd:feature (SW-13)
developzoneio Jul 22, 2026
a4a43f3
Add sanctioned re-plan loop (SW-14)
developzoneio Jul 22, 2026
85726c2
Add size cap and rotation for events.jsonl (SW-15)
developzoneio Jul 22, 2026
70da943
Add /sd:status metrics reader (SW-16)
developzoneio Jul 22, 2026
d6a826d
Close three Check 7 blind spots (SW-24)
developzoneio Jul 22, 2026
6080ddf
Pin shell scripts to LF via .gitattributes
developzoneio Jul 23, 2026
8a8e0be
Merge branch 'fix/sw-21-gitattributes-lf' into feature/optimize-workf…
developzoneio Jul 23, 2026
889160c
Fix PS truthiness in hook config reads (SW-22)
developzoneio Jul 23, 2026
ee25288
Pin lessons-* retro fixtures to fresh mtime (SW-23)
developzoneio Jul 23, 2026
5cc3efe
Fix three CI-only failures on PR #23
developzoneio Jul 23, 2026
03f3e3b
Fix mapfile bash-4-only builtin in validate.sh (macOS)
developzoneio Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
50 changes: 50 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Line-ending policy. Normalize all text to LF in the repo; check shell and PowerShell scripts out
# as LF on every platform so shebangs and heredocs parse and cross-platform parity holds (SW-21).
# PowerShell 5.1 reads either; pinning LF is cheap consistency and is unaffected by the pure-ASCII
# rule for *.ps1 (CLAUDE.md). With core.autocrlf=true (the Git default on Windows and on the
# windows-latest CI runner) an unpinned *.sh checks out CRLF, putting a trailing CR on the
# `#!/usr/bin/env bash` shebang (bad interpreter) and mis-parsing heredocs and `[[ ... ]]`.
* text=auto

*.sh text eol=lf
*.ps1 text eol=lf

# Byte-comparison fixtures must keep LF on every platform.
#
# scripts/aggregate-lessons.{ps1,sh} deliberately render LF and compare the
# result against tests/lessons/fixtures/expected-lessons.md byte for byte. With
# core.autocrlf=true (the Git default on Windows, and on the windows-latest CI
# runner) that fixture would be checked out as CRLF, and the comparison would
# fail for a reason that has nothing to do with the code under test.
#
# The `* text=auto` default above normalizes to LF in the repo but still yields a
# native (CRLF) checkout on Windows, so these fixture trees keep an explicit eol=lf pin.
tests/lessons/** text eol=lf

# tests/task-format/** are field-grammar fixtures (SW-11). They assert how a
# reader splits a task block into fields; a CRLF checkout on Windows would make
# any byte-level or line-ending-sensitive reader disagree with the same file on
# Linux. Pinned for the same reason as the lesson fixtures above.
tests/task-format/** text eol=lf

# tests/revision-log/** are revision-log integrity fixtures (SW-14). The
# valid-revision case proves the original plan prose stays byte-intact while a
# revision is appended below it; a CRLF checkout on Windows would break any
# byte-level comparison. Pinned for the same reason as the fixtures above.
tests/revision-log/** text eol=lf

# tests/hooks/fixtures/**/_metrics/events.jsonl are pre-seeded rotation inputs
# (SW-15). The rotation trigger compares the file's raw byte size against
# maxSizeKb*1024, so a CRLF checkout on Windows would change the seed's size.
# The seed clears the 1 KB cap by a wide margin either way and the conformance
# comparison is JSON-normalized, so correctness does not depend on this - but
# pin LF anyway so the byte size is identical on every platform. Same reasoning
# as the fixture pins above.
tests/hooks/fixtures/**/_metrics/events.jsonl text eol=lf

# tests/metrics/** is the /sd:status verification corpus (SW-16). The command
# counts events by exact substring over an LF-terminated log, and the malformed
# fixture asserts an exact skipped count - a CRLF checkout on Windows would
# change both the line contents under test and the well-formed-line test that
# anchors on a trailing '}'. Pinned for the same reason as the fixtures above.
tests/metrics/** text eol=lf
76 changes: 76 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,82 @@ jobs:
shell: pwsh
run: ./scripts/smoke-hooks.ps1

# --- Lesson privacy validator, both directions. The clean fixture passing
# proves the grammar is accepted; the leaky fixture FAILING is what proves
# the checks still fire. Only the second one catches a validator that has
# rotted into a no-op ---------------------------------------------------
- name: Lesson validator (bash)
if: runner.os == 'Linux' || runner.os == 'macOS'
shell: bash
run: |
bash scripts/validate-lessons.sh tests/lessons/fixtures/clean-lessons.md
if bash scripts/validate-lessons.sh tests/lessons/fixtures/leaky-lessons.md; then
echo "::error::leaky fixture passed the validator - checks are not firing"
exit 1
fi

- name: Lesson validator (PowerShell)
if: runner.os == 'Windows'
shell: pwsh
run: |
./scripts/validate-lessons.ps1 tests/lessons/fixtures/clean-lessons.md
if ($LASTEXITCODE -ne 0) { throw "clean fixture failed the validator" }
./scripts/validate-lessons.ps1 tests/lessons/fixtures/leaky-lessons.md
if ($LASTEXITCODE -eq 0) { throw "leaky fixture passed the validator - checks are not firing" }
# The leaky fixture is EXPECTED to exit non-zero; without this reset, the
# implicit "exit $LASTEXITCODE" GitHub Actions appends to every pwsh step
# would fail the step on its own correctly-detecting assertion.
exit 0

# --- Lesson aggregator: pin the rendered output against a committed
# expected file, then assert idempotence via --check. Both implementations
# must land on the SAME bytes; the expected file is what makes a
# culture-aware sort or a CRLF write fail loudly instead of drifting -----
- name: Lesson aggregator (bash)
if: runner.os == 'Linux' || runner.os == 'macOS'
shell: bash
run: |
bash scripts/aggregate-lessons.sh \
--spec-dir tests/lessons/fixtures/corpus \
--out tests/lessons/fixtures/expected-lessons.md --check
bash scripts/validate-lessons.sh tests/lessons/fixtures/expected-lessons.md

- name: Lesson aggregator (PowerShell)
if: runner.os == 'Windows'
shell: pwsh
run: |
./scripts/aggregate-lessons.ps1 -SpecDir tests/lessons/fixtures/corpus `
-Out tests/lessons/fixtures/expected-lessons.md -Check
if ($LASTEXITCODE -ne 0) { throw "PowerShell aggregator output differs from the expected fixture" }
./scripts/validate-lessons.ps1 tests/lessons/fixtures/expected-lessons.md
if ($LASTEXITCODE -ne 0) { throw "generated lessons file failed the privacy validator" }

# --- Docs-consistency self-test: the validator above proves the docs are
# right; this proves the validator would NOTICE if they were wrong. Without
# it, a Check 7 that rotted into a no-op would still report green ---------
- name: Docs-consistency self-test (bash)
if: runner.os == 'Linux' || runner.os == 'macOS'
shell: bash
run: bash scripts/selftest-docs.sh

- name: Docs-consistency self-test (PowerShell)
if: runner.os == 'Windows'
shell: pwsh
run: ./scripts/selftest-docs.ps1

# --- Cross-impl hook conformance: pipe each golden fixture into BOTH
# implementations (bash + pwsh); normalized decisions must match the
# golden and each other. Runs under pwsh on every OS: ubuntu/macos get
# bash natively + pwsh preinstalled, windows gets pwsh natively + Git
# Bash. A divergence in only one impl fails with a three-way diff ----
- name: Hook conformance (bash vs PowerShell)
shell: pwsh
run: ./tests/hooks/run-conformance.ps1

- name: Hook conformance self-test (divergence detection)
shell: pwsh
run: ./tests/hooks/run-conformance.ps1 -SelfTest

# --- Install -> uninstall round-trip (CLAUDE.md sandbox recipe) --------
- name: Install -> uninstall round-trip (bash)
if: runner.os == 'Linux' || runner.os == 'macOS'
Expand Down
Loading
Loading