savepoint 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/.claude/settings.local.json +12 -1
  2. package/.github/workflows/ci.yml +20 -0
  3. package/.golangci.yml +11 -0
  4. package/.savepoint/Design.md +40 -38
  5. package/.savepoint/{audit/v1.1/E02-cross-platform-compatibility/proposals.md → releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md} +48 -38
  6. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +195 -0
  7. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +14 -1
  8. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +3 -3
  9. package/.savepoint/{audit/v1.1/E04-epic-navigation/proposals.md → releases/v1.1/epics/E04-epic-navigation/E04-Audit.md} +65 -54
  10. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +237 -0
  11. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +25 -16
  12. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +17 -6
  13. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +15 -5
  14. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +19 -5
  15. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +11 -1
  16. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +9 -6
  17. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +29 -13
  18. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +56 -0
  19. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +63 -0
  20. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +44 -0
  21. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +35 -0
  22. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +40 -0
  23. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +45 -0
  24. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +26 -0
  25. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +33 -0
  26. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +34 -0
  27. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +33 -0
  28. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +336 -0
  29. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +61 -0
  30. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +37 -0
  31. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +28 -0
  32. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +46 -0
  33. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +27 -0
  34. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +25 -0
  35. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +26 -0
  36. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +26 -0
  37. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +333 -0
  38. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +68 -0
  39. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +26 -0
  40. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +27 -0
  41. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +28 -0
  42. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +29 -0
  43. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +27 -0
  44. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +29 -0
  45. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +29 -0
  46. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +27 -0
  47. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +207 -0
  48. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +65 -0
  49. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +24 -0
  50. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +28 -0
  51. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +29 -0
  52. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +27 -0
  53. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +28 -0
  54. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +31 -0
  55. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +36 -0
  56. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +25 -0
  57. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +21 -0
  58. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +22 -0
  59. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +29 -0
  60. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +444 -0
  61. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +45 -0
  62. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +35 -0
  63. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +19 -0
  64. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +29 -0
  65. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +25 -0
  66. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +37 -0
  67. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +118 -0
  68. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +73 -0
  69. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +66 -0
  70. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +35 -0
  71. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +60 -0
  72. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +33 -0
  73. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +37 -0
  74. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +40 -0
  75. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +37 -0
  76. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +267 -0
  77. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +54 -0
  78. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +39 -0
  79. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +42 -0
  80. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +33 -0
  81. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +35 -0
  82. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +27 -0
  83. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +29 -0
  84. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +28 -0
  85. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Audit.md +272 -0
  86. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +60 -0
  87. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +31 -0
  88. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +34 -0
  89. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +30 -0
  90. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +27 -0
  91. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +28 -0
  92. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +26 -0
  93. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +33 -0
  94. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T008-ci-and-release-automation.md +46 -0
  95. package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +25 -0
  96. package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +27 -0
  97. package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +27 -0
  98. package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +29 -0
  99. package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +31 -0
  100. package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +34 -0
  101. package/.savepoint/releases/v1.1/v1.1-PRD.md +67 -7
  102. package/.savepoint/router.md +10 -17
  103. package/AGENTS.md +39 -24
  104. package/Makefile +3 -1
  105. package/README.md +0 -1
  106. package/agent-skills/savepoint-audit/SKILL.md +86 -34
  107. package/agent-skills/savepoint-build-task/SKILL.md +7 -2
  108. package/agent-skills/savepoint-create-plan/SKILL.md +7 -2
  109. package/agent-skills/savepoint-create-task/SKILL.md +44 -31
  110. package/agent-skills/savepoint-draft-prd/SKILL.md +7 -2
  111. package/agent-skills/savepoint-system-design/SKILL.md +7 -2
  112. package/agent_skills_test.go +91 -0
  113. package/cmd/board.go +59 -0
  114. package/cmd/board_test.go +137 -0
  115. package/cmd/doctor.go +53 -0
  116. package/cmd/doctor_test.go +146 -0
  117. package/cmd/init.go +63 -0
  118. package/cmd/init_test.go +104 -0
  119. package/internal/board/board.go +44 -36
  120. package/internal/board/board_test.go +27 -82
  121. package/internal/board/card.go +43 -23
  122. package/internal/board/card_test.go +74 -5
  123. package/internal/board/column.go +75 -15
  124. package/internal/board/column_test.go +76 -2
  125. package/internal/board/debug.go +26 -0
  126. package/internal/board/debug_test.go +108 -0
  127. package/internal/board/detail.go +33 -47
  128. package/internal/board/detail_test.go +48 -0
  129. package/internal/board/epic_panel.go +120 -22
  130. package/internal/board/epic_panel_test.go +302 -17
  131. package/internal/board/help.go +1 -0
  132. package/internal/board/help_test.go +1 -0
  133. package/internal/board/integration_test.go +266 -0
  134. package/internal/board/interfaces.go +65 -0
  135. package/internal/board/interfaces_test.go +114 -0
  136. package/internal/board/io.go +93 -0
  137. package/internal/board/model.go +79 -118
  138. package/internal/board/plain.go +88 -0
  139. package/internal/board/plain_test.go +117 -0
  140. package/internal/board/release.go +1 -9
  141. package/internal/board/release_test.go +6 -6
  142. package/internal/board/status.go +4 -4
  143. package/internal/board/theme.go +24 -0
  144. package/internal/board/theme_test.go +31 -0
  145. package/internal/board/transitions.go +113 -88
  146. package/internal/board/transitions_test.go +164 -141
  147. package/internal/board/tui.go +32 -0
  148. package/internal/board/update.go +344 -215
  149. package/internal/board/update_test.go +326 -18
  150. package/internal/board/util.go +76 -0
  151. package/internal/board/view.go +31 -28
  152. package/internal/board/view_test.go +74 -2
  153. package/internal/board/watch.go +41 -5
  154. package/internal/buildtool/main.go +45 -15
  155. package/internal/buildtool/main_test.go +224 -0
  156. package/internal/data/config.go +17 -3
  157. package/internal/data/config_test.go +49 -0
  158. package/internal/data/discover.go +26 -0
  159. package/internal/data/discover_test.go +34 -10
  160. package/internal/data/errors.go +4 -0
  161. package/internal/data/fuzz_test.go +75 -0
  162. package/internal/data/lifecycle.go +13 -6
  163. package/internal/data/lifecycle_test.go +14 -11
  164. package/internal/data/parser.go +22 -6
  165. package/internal/data/parser_test.go +31 -7
  166. package/internal/data/task.go +0 -9
  167. package/internal/data/testdata/fuzz/FuzzSplitFrontmatterBody/68eb66b0fe91e7e3 +2 -0
  168. package/internal/data/write.go +88 -11
  169. package/internal/data/write_test.go +167 -0
  170. package/internal/doctor/checks.go +567 -0
  171. package/internal/doctor/checks_test.go +716 -0
  172. package/internal/doctor/gates.go +193 -0
  173. package/internal/doctor/gates_test.go +166 -0
  174. package/internal/doctor/interfaces.go +64 -0
  175. package/internal/doctor/interfaces_test.go +104 -0
  176. package/internal/doctor/repairs.go +80 -0
  177. package/internal/doctor/repairs_test.go +81 -0
  178. package/internal/doctor/report.go +157 -0
  179. package/internal/doctor/report_test.go +89 -0
  180. package/internal/init/clipboard.go +146 -0
  181. package/internal/init/clipboard_test.go +74 -0
  182. package/internal/init/install.go +16 -0
  183. package/internal/init/integration_test.go +197 -0
  184. package/internal/init/prompt.go +14 -0
  185. package/internal/init/prompt_test.go +77 -0
  186. package/internal/init/scaffold.go +59 -0
  187. package/internal/init/scaffold_test.go +179 -0
  188. package/internal/init/template_freshness_test.go +56 -0
  189. package/internal/init/validate.go +85 -0
  190. package/internal/init/validate_test.go +141 -0
  191. package/internal/init/write.go +73 -0
  192. package/internal/init/write_test.go +91 -0
  193. package/internal/styles/styles_test.go +133 -0
  194. package/internal/testutil/fixture.go +113 -0
  195. package/internal/testutil/fs.go +26 -0
  196. package/main.go +120 -4
  197. package/package.json +2 -2
  198. package/project-audit/audit_report_glm_5.1.md +411 -0
  199. package/project-audit/audit_report_opus_4.6.md +406 -0
  200. package/project-audit/consolidated-audit-report.md +456 -0
  201. package/templates/project/.savepoint/Design.md +2 -2
  202. package/templates/project/.savepoint/router.md +10 -10
  203. package/templates/project/AGENTS.md +33 -21
  204. package/templates/project/agent-skills/savepoint-audit/SKILL.md +87 -0
  205. package/templates/project/agent-skills/savepoint-build-task/SKILL.md +44 -0
  206. package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +33 -0
  207. package/templates/project/agent-skills/savepoint-create-task/SKILL.md +44 -0
  208. package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +37 -0
  209. package/templates/project/agent-skills/savepoint-system-design/SKILL.md +38 -0
  210. package/templates/prompts/audit-reconciliation.prompt.md +33 -28
  211. package/templates/prompts/design.prompt.md +3 -1
  212. package/.savepoint/audit/v1/E01/proposals.md +0 -168
  213. package/.savepoint/audit/v1/E01/snapshot.md +0 -78
  214. package/.savepoint/audit/v1/E01-go-setup/proposals.md +0 -166
  215. package/.savepoint/audit/v1/E01-go-setup/snapshot.md +0 -71
  216. package/.savepoint/audit/v1/E01-scaffolding/proposals/AGENTS.md +0 -66
  217. package/.savepoint/audit/v1/E01-scaffolding/proposals/Design.md +0 -210
  218. package/.savepoint/audit/v1/E01-scaffolding/proposals/epic-Design.md +0 -117
  219. package/.savepoint/audit/v1/E01-scaffolding/proposals/quality-review.md +0 -101
  220. package/.savepoint/audit/v1/E01-scaffolding/snapshot.md +0 -54
  221. package/.savepoint/audit/v1/E02-data-model/snapshot.md +0 -128
  222. package/.savepoint/audit/v1/E02-data-readers/proposals.md +0 -123
  223. package/.savepoint/audit/v1/E02-data-readers/snapshot.md +0 -54
  224. package/.savepoint/audit/v1/E03-board-tui-core/proposals.md +0 -146
  225. package/.savepoint/audit/v1/E03-board-tui-core/snapshot.md +0 -57
  226. package/.savepoint/audit/v1/E03-cli-foundation/snapshot.md +0 -106
  227. package/.savepoint/audit/v1/E04-board-components/proposals.md +0 -118
  228. package/.savepoint/audit/v1/E04-board-components/snapshot.md +0 -77
  229. package/.savepoint/audit/v1/E04-templates-and-prompts/snapshot.md +0 -115
  230. package/.savepoint/audit/v1/E05-init-command/snapshot.md +0 -125
  231. package/.savepoint/audit/v1/E05-phase-transitions/proposals.md +0 -83
  232. package/.savepoint/audit/v1/E05-phase-transitions/snapshot.md +0 -36
  233. package/.savepoint/audit/v1/E06-atari-noir-layout/proposals.md +0 -130
  234. package/.savepoint/audit/v1/E06-atari-noir-layout/snapshot.md +0 -84
  235. package/.savepoint/audit/v1/E06-tui-board/snapshot.md +0 -64
  236. package/.savepoint/audit/v1/E07-audit-pipeline/snapshot.md +0 -165
  237. package/.savepoint/audit/v1/E08-board-workflow-cleanup/snapshot.md +0 -65
  238. package/.savepoint/audit/v1.1/E02-cross-platform-compatibility/snapshot.md +0 -41
  239. package/.savepoint/audit/v1.1/E04-epic-navigation/snapshot.md +0 -48
  240. package/ink-cli-ui-design.zip +0 -0
  241. package/savepoint +0 -0
  242. package/savepoint.exe +0 -0
@@ -21,7 +21,18 @@
21
21
  "Bash(go doc *)",
22
22
  "Bash(make clean *)",
23
23
  "Bash(make build-linux *)",
24
- "Bash(./savepoint_test_bin --version)"
24
+ "Bash(./savepoint_test_bin --version)",
25
+ "PowerShell(go run *)",
26
+ "Bash(go run *)",
27
+ "PowerShell(Get-ChildItem -Path \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\" -Force | Select-Object Name, @{Name=\"Type\"; Expression={if\\($_.PSIsContainer\\){\"DIR\"}else{\"FILE\"}}} | Format-Table -AutoSize)",
28
+ "PowerShell(Get-ChildItem *)",
29
+ "Bash(Get-ChildItem -Path \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\\\\.savepoint\\\\releases\\\\v1.1\\\\epics\\\\E08-board-command\" -Recurse -Filter \"*.md\")",
30
+ "Bash(Select-Object -ExpandProperty FullName)",
31
+ "Bash(cmd\")",
32
+ "PowerShell(go build *)",
33
+ "PowerShell(go test *)",
34
+ "PowerShell(cd \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\"; $files = @\\(\"agent-skills\\\\savepoint-create-task\\\\SKILL.md\", \"templates\\\\project\\\\agent-skills\\\\savepoint-create-task\\\\SKILL.md\"\\); foreach \\($f in $files\\) { $bytes = [System.IO.File]::ReadAllBytes\\($f\\); Write-Host \"$f first bytes: $\\($bytes[0..9] -join ','\\) \\(CRLF: $\\($bytes[3] -eq 13\\)\\)\" })",
35
+ "PowerShell(cd \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\"; $others = Get-ChildItem agent-skills -Recurse -Filter \"SKILL.md\" | Where-Object { $_.DirectoryName -notmatch \"savepoint-create-task\" }; foreach \\($f in $others\\) { $bytes = [System.IO.File]::ReadAllBytes\\($f.FullName\\); Write-Host \"$\\($f.Name\\) dir=$\\($f.Directory.Name\\) CRLF=$\\($bytes[3] -eq 13\\)\" })"
25
36
  ]
26
37
  }
27
38
  }
@@ -0,0 +1,20 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ ci:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - uses: actions/setup-go@v5
16
+ with:
17
+ go-version: '1.26'
18
+ check-latest: true
19
+
20
+ - run: make ci
package/.golangci.yml ADDED
@@ -0,0 +1,11 @@
1
+ run:
2
+ timeout: 5m
3
+
4
+ linters:
5
+ enable:
6
+ - unused
7
+ - errcheck
8
+ - staticcheck
9
+ - govet
10
+ - ineffassign
11
+ - gosimple
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  type: project-design
3
3
  status: active
4
- last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
4
+ last_audited: v1.1/E15-hardening
5
5
  ---
6
6
 
7
7
  # Savepoint — System Architecture
@@ -20,11 +20,15 @@ last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
20
20
  - Per-task incremental: <2KB.
21
21
  - Audit: 5–15KB.
22
22
  - Anything that breaks these bounds violates the wedge.
23
- - **Go data-reader boundary:** established in epic `E02-data-readers` (2026-05-01). `internal/data` owns Savepoint file parsing and discovery for the Go implementation: task frontmatter models, markdown YAML extraction, router state parsing, config theme defaults, release/epic/task directory listing, and boundary error sentinels.
23
+ - **Go data-reader boundary:** established in epic `E02-data-readers` (2026-05-01). `internal/data` owns Savepoint file parsing and discovery for the Go implementation: task frontmatter models, markdown YAML extraction, router state parsing, config theme defaults, release/epic/task directory listing, task lifecycle validation/defaulting, write-time status validation, and boundary error sentinels.
24
24
  - **Template assets** live under `templates/` with helpers in `src/templates/` (epic E04).
25
- - **Init command** (`savepoint init`) validates, scaffolds, prints prompt, clipboard, optional install (epic E05).
26
- - **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
27
- - **Audit pipeline** (`savepoint audit`) resolves epic, skips, quality gates, snapshots, router transition, proposal review (epic E07).
25
+ - **Init command** (`savepoint init`) validates target directories, scaffolds rendered copies of `templates/project/`, prints the rendered magic prompt, attempts best-effort clipboard copy, and optionally runs `npm install` after scaffolding (v1.1 E07).
26
+ - **Board command** (`savepoint board`, and bare `savepoint`) reads project state, renders the Atari-Noir TUI board when stdout is a TTY, falls back to a deterministic plain table in non-TTY mode, supports `--release`/`--epic` filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), dedicated phase-colored Next Activity line below the header, sentence-boundary checklist rendering in task details, shared status glyph mapping for task cards and the epic sidebar, a forced ANSI256 Lipgloss color profile for board startup (v1.1 E03), a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04), and an epic Detail/Audit tab switch that renders user-facing audit findings from `{epic}/E##-Audit.md` (v1.1 E06).
27
+ - **Doctor command** (`savepoint doctor`, `savepoint doctor --epic E##`) runs read-only integrity diagnostics for config, router state, release/epic/task structure, frontmatter validity, acceptance criteria presence, dependencies, duplicate task IDs, stale audit files, orphaned task IDs, and configured quality gates. It prints a human-readable report with repair suggestions and exits 0 when clean, 1 when problems are diagnosed, and 2 for internal or invocation failures.
28
+ - **Audit remediation baseline** (v1.1 E13) centralizes frontmatter/body splitting and line-ending normalization in `internal/data`, uses typed sentinel errors for doctor repair suggestions, applies a configurable `quality_gates.gate_timeout`, removes tracked build artifacts from source control, adds `.golangci.yml`, and moves board filesystem reads/writes behind Bubble Tea command messages while preserving direct file I/O inside command helpers.
29
+ - **Structural improvement baseline** (v1.1 E14) groups board `Model` fields into focused embedded state structs, defines consumer-side board/doctor data-access interfaces, routes doctor orphan discovery through `Discover.ListRootDirs`, renders audit-tab hidden sections via exact heading matches, improves quality-gate shell tokenization for quoted and escaped arguments, removes the separate `TaskStatus` enum in favor of `ColumnType`, and adds `internal/testutil` for shared Go test fixtures.
30
+ - **Hardening baseline** (v1.1 E15) adds board render/layout benchmarks, data frontmatter fuzz targets, debug logging via CLI `--debug` or `SAVEPOINT_DEBUG`, abbreviation-aware task checklist sentence splitting, root test package isolation, documented audit-tab hidden-section allowlisting, repo-local CI, `make ci`, distribution SHA256 checksums, and Windows amd64/arm64 build outputs.
31
+ - **Agent audit workflow** is skill-driven, not a CLI pipeline. At `audit-pending`, a fresh audit agent writes one epic-local `E##-Audit.md`; the user reviews its Audit tab, then asks an agent to apply the admin proposal blocks, update the visible audit findings to reflect the applied outcome, and close the epic.
28
32
 
29
33
  ## 2. Directory layout
30
34
 
@@ -37,16 +41,13 @@ last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
37
41
  ├── visual-identity.md ← design system; loaded conditionally for TUI work
38
42
  ├── router.md ← state-machine routing
39
43
  ├── config.yml ← theme, quality_gates, verify_strict
40
- ├── audit/
41
- │ └── {E##-epic}/
42
- │ ├── snapshot.md
43
- │ └── proposals.md
44
44
  └── releases/
45
45
  └── {release}/ ← e.g. v1, v1.1
46
46
  ├── {release}-PRD.md ← release-scoped PRD
47
47
  └── epics/
48
48
  └── E##-{epic-name}/
49
49
  ├── E##-Detail.md ← epic delta
50
+ ├── E##-Audit.md ← audit findings + admin apply proposals
50
51
  └── tasks/
51
52
  └── T001-slug.md
52
53
  ```
@@ -64,16 +65,18 @@ AGENTS.md at root (uppercase, cross-vendor spec). Design.md in `.savepoint/` (wo
64
65
 
65
66
  ## 4. Status model & gates
66
67
 
67
- Three statuses, with explicit gates:
68
+ Three statuses, with explicit gates and ownership boundaries:
68
69
 
69
- | Status | Meaning | Entry gate |
70
- | ------------- | -------------------------- | --------------------------------------------------------------- |
71
- | `planned` | Ready to build | plan section non-empty |
72
- | `in_progress` | AI building | all `depends_on` are `done` |
73
- | `done` | Complete for current scope | all implementation items checked; verification per project mode |
70
+ | Status | Meaning | Entry gate | Who may set it |
71
+ | ------------- | -------------------------- | --------------------------------------------------------------- | -------------------------------------- |
72
+ | `planned` | Ready to build | plan section non-empty | User or planning workflow |
73
+ | `in_progress` | AI building | all `depends_on` are `done` | Agent when starting implementation |
74
+ | `done` | Complete for current scope | all implementation items checked; verification per project mode | User only |
74
75
 
75
76
  - `blocked` is a **flag**, not a status — `in_progress` + `blocked: "reason"` is valid.
76
- - `done -> in_progress` is allowed so completed work can be reopened when follow-up work is required.
77
+ - Agents may only advance a task into `in_progress`; they must not set `done` or retreat a task to an earlier status.
78
+ - Only the user may set a task to `done` or retreat it from `done` to `in_progress` when follow-up work is required.
79
+ - Router updates are explicit TUI actions: after setting a task to `in_progress`, the agent prompts the user to press `p` in the board to mark the focused task as router priority. Navigation alone must not change router task priority.
77
80
  - Verification mode: see `config.yml`.
78
81
 
79
82
  ## 5. Dependencies
@@ -82,13 +85,12 @@ Three statuses, with explicit gates:
82
85
  - `src/validation/dependencies.ts` detects duplicate task IDs, missing dependencies, and dependency cycles.
83
86
  - Cross-epic deps allowed but warned (signal that epic boundaries may be wrong).
84
87
 
85
- ## 6. CLI surface (4 commands, no extras)
88
+ ## 6. CLI surface (3 commands, no extras)
86
89
 
87
90
  | Command | Purpose |
88
91
  | ---------------------- | --------------------------------------------------------------------------------- |
89
92
  | `savepoint init` | Scaffold `.savepoint/`, print magic prompt to stdout + clipboard |
90
93
  | `savepoint board` | Launch TUI; auto-falls-back to plain table on non-TTY |
91
- | `savepoint audit` | Run audit pipeline (`--skip --reason`, `--epic`) |
92
94
  | `savepoint doctor` | Integrity check + ad-hoc quality-gate run + Layer-2 prompt for AI semantic review |
93
95
  | `--version` / `--help` | Standard global flags |
94
96
 
@@ -97,29 +99,29 @@ Three statuses, with explicit gates:
97
99
  - **Explicitly rejected:** `task new`, `epic new`, `release new`, `plan`, `next`, `status`, `task done`. All are file edits or TUI actions.
98
100
 
99
101
  **Names:** npm package `savepoint`; binary `savepoint`. No `vk` alias.
100
- ## 7. Audit pipeline (6 steps)
102
+ ## 7. Agent audit workflow
101
103
 
102
104
  ```
103
- 0. Quality Gates — CLI runs configured commands. Halts on failure if block_on_failure: true.
104
- 1. Snapshot CLI writes file tree (gitignore-respecting) + changed-files list. NO code contents.
105
- 2. Diff Brief State flips to audit_pending: {E##-epic}. Magic prompt printed to user.
106
- 3. Reconcile — Agent reads epic E##-Detail.md + snapshot + scoped code. Writes one proposal bundle to
107
- .savepoint/audit/{E##-epic}/proposals.md.
108
- 4. Review TUI shows side-by-side per-proposal diff. Approve / reject / edit each.
109
- 5. Commit — Approved proposals overwrite live files. Epic gets status: audited. Next epic unlocks.
105
+ 0. Quality Gates — Build agent runs configured build/test gates before audit handoff.
106
+ 1. Audit Pending Router enters `audit-pending` for the completed epic.
107
+ 2. Reconcile Fresh audit agent reads router, epic detail, task files, Design.md, AGENTS.md, and scoped source/test files.
108
+ 3. Findings — Agent writes exactly one `{epic}/E##-Audit.md`.
109
+ 4. Review — User reviews the TUI Epic Detail Audit tab.
110
+ 5. Apply + Close After user approval, agent applies proposal blocks, updates the audit file's visible findings, marks the epic audited, updates `last_audited`, and advances router.
110
111
  ```
111
112
 
112
- - `audit_pending` is a **hard gate**: next epic's tasks cannot enter `in_progress` until prior epic is `audited`.
113
- - **High-divergence guard:** if a proposal changes >50% of the live file, TUI requires extra confirmation (threshold tunable in `config.yml`).
114
- - **Skip allowed** via `savepoint audit --skip --reason "..."`. Logged to `.savepoint/audit-log.md`. Permanent `⚠ skipped` badge in TUI.
115
- - **Proposal bundles** use delta-shaped edits: `Insert After`, `Replace`, or `Delete` blocks anchored to exact text.
116
- - **Quality review** is a section inside the proposal bundle.
117
- - **Snapshot availability is an audit precondition.** The router should enter `audit-pending` only after `.savepoint/audit/{release}/{E##-epic}/snapshot.md` exists.
113
+ - `audit-pending` is a **hard gate**: next epic's tasks cannot enter `in_progress` until prior epic is `audited` or the user explicitly skips the audit.
114
+ - `E##-Audit.md` has two user-facing sections: `## Main Findings` and `## Code Style Review`.
115
+ - `## Main Findings` contains narrative audit findings only: AC verification, important drift, and notable risks. It must not contain file-specific replacement blocks.
116
+ - `## Code Style Review` contains the 10 AGENTS.md code style checks.
117
+ - `## Proposed Changes` contains admin/apply metadata using `### Target File`, `### Replace`, and `### With`. The TUI Audit tab intentionally does not render this section to avoid stale file-change details in the Epic Detail panel.
118
+ - Apply/close must rewrite `## Main Findings` and `## Code Style Review` in the same `E##-Audit.md` so the TUI Audit tab shows resolved findings and remaining risks instead of stale pre-apply blockers. `## Proposed Changes` stays as the trace of what was applied unless the user asks otherwise.
119
+ - There is no `savepoint audit` CLI pipeline in the active design. Audit is performed by agents using `agent-skills/savepoint-audit/SKILL.md`.
118
120
 
119
121
  Three layers:
120
122
 
121
123
  - **Layer 1 (mechanical):** user's chosen linter. Recommended: eslint+dependency-cruiser (TS), radon+pylint (Python), gocyclo+staticcheck (Go). Cross-language fallback: `lizard`. Quality gate config: see `.savepoint/config.yml`.
122
- - **Layer 2 (AI semantic review):** baked into the audit reconcile prompt. Outputs a quality-review section in the proposal bundle. **Advisory, not blocking.**
124
+ - **Layer 2 (AI semantic review):** baked into the audit reconcile prompt. Outputs Main Findings and Code Style Review in the epic-local audit file. **Advisory, not blocking.**
123
125
  - **Layer 3:** `savepoint doctor` runs Layer 1 + prints Layer 2 prompt for ad-hoc use.
124
126
 
125
127
  ## 8. TUI
@@ -130,7 +132,7 @@ Acknowledged terminal limits: fonts, scanlines, glows, letter-spacing, mouse-dri
130
132
 
131
133
  **Render fallbacks:** 256-color → 16-color hard-coded → `NO_COLOR=1` monochrome with glyphs → non-TTY plain table.
132
134
 
133
- **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. The header can show a compact right-aligned Next Activity value from router state. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Non-TTY output remains a plain table fallback.
135
+ **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. Active router `next_action` renders as a dedicated full-width line below the header with phase-colored `PLAN`, `BUILD`, or `AUDIT` prefix styling and truncates to terminal width. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. Task detail implementation-plan checkboxes render once per semantic sentence, not once per hard-wrapped markdown line. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Task card and epic sidebar status glyphs share `internal/board/status.go`; task cards use explicit `Task.Status` when available and retain the legacy column/stage glyph fallback when it is not. Non-TTY output remains a plain table fallback.
134
136
 
135
137
  **Visual guardrail:** the terminal board intentionally uses one black background for Background, Surface, and Surface 2. Do not restore subtly different dark panel fills; depth should come from spacing, dividers, glyphs, and focused Atari Orange borders.
136
138
 
@@ -138,11 +140,11 @@ Acknowledged terminal limits: fonts, scanlines, glows, letter-spacing, mouse-dri
138
140
 
139
141
  **Border policy:** focus must not change geometry or introduce terminal-specific broken border rendering. Use one consistent box-border family across columns, cards, and overlays. If rounded borders render as dash bars or broken segments in Warp, prefer the single-line border style already allowed by `.savepoint/visual-identity.md`; do not mix rounded and single-line borders as an ad-hoc per-component workaround.
140
142
 
141
- **Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data plus epic status metadata after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority. Epic status glyphs are cached from each epic's `E##-Detail.md` frontmatter and shown in the wide epic sidebar only.
143
+ **Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. Board update handlers dispatch filesystem reads and writes through Bubble Tea command helpers (`routerWriteMsg`, `taskWriteMsg`, `epicDetailMsg`, `auditContentMsg`, and `errorMsg`) so `Update()` remains an event/message reducer. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data plus epic status metadata after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority. The `p` key explicitly writes the focused non-done task to router state as `task-building`; it does not infer `audit-pending` from task position. Epic status glyphs are cached from each epic's `E##-Detail.md` frontmatter and shown in the wide epic sidebar only.
142
144
 
143
145
  **Implementation modules:** see AGENTS.md Codebase Map.
144
146
 
145
- **Keybindings:** arrow/vim navigation, enter advances, backspace retreats, r/R refreshes, a/A exits toward audit review when proposals exist, q quits.
147
+ **Keybindings:** arrow/vim navigation, enter opens focused task detail, space advances, backspace retreats, `p` marks the focused non-done task as router priority, `r`/`R` opens release selection or refreshes where supported, `?` opens help, and `q` quits or closes overlays.
146
148
 
147
149
  ## 9. Concurrency
148
150
 
@@ -177,8 +179,8 @@ All failure modes are diagnosed by `savepoint doctor`. Doctor diagnoses and prop
177
179
  - **License:** MIT.
178
180
  - **Runtime:** Go CLI binary. Source builds with `go build`; tests run with `go test ./...`.
179
181
  - **Local build:** `make build` delegates to `internal/buildtool`, builds `savepoint` or `savepoint.exe`, and injects `main.version` from `VERSION` or the latest git tag.
180
- - **Cross-platform builds:** `make build-all` cross-compiles linux-amd64, linux-arm64, darwin-amd64, and darwin-arm64 raw binaries into `dist/{platform}-{arch}/savepoint`.
181
- - **Artifacts:** `make dist` creates versioned `.tar.gz` archives in `dist/` for the Linux and Darwin targets using Go archive APIs, not shell `tar`.
182
+ - **Cross-platform builds:** `make build-all` cross-compiles linux-amd64, linux-arm64, darwin-amd64, darwin-arm64, windows-amd64, and windows-arm64 raw binaries into `dist/{platform}-{arch}/savepoint` or `savepoint.exe` for Windows. `make ci` runs the repo-local verification sequence used by CI.
183
+ - **Artifacts:** `make dist` creates versioned `.tar.gz` archives in `dist/` for Linux, Darwin, and Windows targets using Go archive APIs, not shell `tar`, and writes SHA256 hashes to `dist/checksums.txt`.
182
184
  - **Smoke validation:** `make smoke-test` builds the local binary and runs `--version` as a headless exit-0 check.
183
185
  - **No telemetry.** Ever.
184
186
 
@@ -1,10 +1,37 @@
1
- # Audit Proposals: v1.1 E02 Cross-Platform Compatibility
2
-
3
- ## Target File
1
+ ---
2
+ type: audit-findings
3
+ audited: 2026-05-02
4
+ ---
5
+
6
+ # Audit Findings: E02 Cross-Platform Compatibility
7
+
8
+ ## Main Findings
9
+
10
+ E02 found that the cross-platform build work moved Savepoint further into its Go-based distribution path, including version handling, Linux/Darwin build targets, archive generation, and smoke-test coverage.
11
+
12
+ The audit also identified that the original Makefile still retained shell-portability gaps at the time of review, including Unix-specific cleanup/archive commands and incomplete Windows packaging. Those details are retained under Proposed Changes for apply/close testing, while this visible section stays focused on the user-facing audit outcome.
13
+
14
+ ## Code Style Review
15
+
16
+
17
+ - [ ] One job per file
18
+ - [ ] One-sentence functions
19
+ - [ ] Test branches
20
+ - [ ] Types are documentation
21
+ - [ ] Build, don't speculate
22
+ - [ ] Errors at boundaries
23
+ - [ ] One source of truth
24
+ - [ ] Comments explain WHY
25
+ - [ ] Content in data files
26
+ - [ ] Small diffs
27
+
28
+ ## Proposed Changes
29
+
30
+ ### Target File
4
31
 
5
32
  `.savepoint/Design.md`
6
33
 
7
- ## Replace
34
+ ### Replace
8
35
 
9
36
  ```md
10
37
  ## 12. Distribution & build
@@ -18,7 +45,7 @@
18
45
  - **No telemetry.** Ever.
19
46
  ```
20
47
 
21
- ## With
48
+ ### With
22
49
 
23
50
  ```md
24
51
  ## 12. Distribution & build
@@ -34,38 +61,37 @@
34
61
  - **No telemetry.** Ever.
35
62
  ```
36
63
 
37
- ## Target File
64
+ ---
65
+
66
+ ### Target File
38
67
 
39
68
  `AGENTS.md`
40
69
 
41
- ## Replace
70
+ ### Replace
42
71
 
43
72
  ```md
44
73
  | `main.go` | CLI Entrypoint and root command wiring |
45
74
  ```
46
75
 
47
- ## With
76
+ ### With
48
77
 
49
78
  ```md
50
79
  | `main.go` | CLI entrypoint, root command wiring, and `--version` handling via build-time version injection |
51
80
  ```
52
81
 
53
- ## Target File
82
+ ---
83
+
84
+ ### Target File
54
85
 
55
86
  `.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md`
56
87
 
57
- ## Insert After
88
+ ### Insert After
58
89
 
59
90
  ```md
60
91
  ## Architectural notes
61
-
62
- - All Go code uses `path/filepath` — no syscalls are platform-specific
63
- - Bubble Tea handles terminal differences across platforms
64
- - No Go build tags or platform-specific files needed
65
- - This is purely a build-tooling and release-workflow epic
66
92
  ```
67
93
 
68
- ## With
94
+ ### With
69
95
 
70
96
  ```md
71
97
  ## Implemented as
@@ -77,38 +103,22 @@
77
103
  - Windows zip packaging was not implemented in this epic; the final implementation covers the Linux and Darwin targets named in the epic's build-all definition of done.
78
104
  ```
79
105
 
80
- ## Target File
106
+ ---
107
+
108
+ ### Target File
81
109
 
82
110
  `.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md`
83
111
 
84
- ## Replace
112
+ ### Replace
85
113
 
86
114
  ```md
87
115
  - [x] Makefile replaced with Go-native commands (no `rm`, `cp`, `mkdir`)
88
116
  ```
89
117
 
90
- ## With
118
+ ### With
91
119
 
92
120
  ```md
93
121
  - [ ] Makefile replaced with Go-native commands (no `rm`, `cp`, `mkdir`)
94
122
  ```
95
123
 
96
- ## Quality Review
97
-
98
- ## Must Fix Before Close
99
-
100
- - `Makefile`: `clean` still runs `rm -rf dist/`, which violates T001 acceptance criteria: "`make clean` removes the binary without using `rm -f` or other Unix-only commands" and "No shell commands in Makefile are platform-dependent."
101
- - `Makefile`: `build-linux` and `build-darwin` still use `mkdir -p` and inline `GOOS=... GOARCH=...` environment assignment. That is fine for Linux, macOS, Git Bash, and WSL, but it is not a shell-agnostic Makefile implementation.
102
- - `Makefile`: `dist` relies on `tar`, so packaging is not yet toolchain-native or Windows-shell portable.
103
- - `.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md`: the task says `go test ./...` was not run even though the task completion protocol requires the full quality-gate suite before `status: done`.
104
-
105
- ## Carry Forward
106
-
107
- - Windows `.zip` artifacts were deferred in T004. Keep that as a known scope gap unless the project narrows E02 explicitly to Linux and Darwin distribution.
108
- - Consider moving cross-platform build and archive logic into a tiny Go helper if the project wants true shell portability while keeping `make` as the human entrypoint.
109
-
110
- ## Already Fixed
111
-
112
- - `main.go` has a headless `--version` path, so smoke testing no longer needs to start the TUI.
113
- - Linux and Darwin raw binary targets exist for amd64 and arm64.
114
- - `AGENTS.md` already documents `build-all`, `dist`, and `smoke-test`.
124
+ ---
@@ -0,0 +1,195 @@
1
+ ---
2
+ type: audit-findings
3
+ audited: 2026-05-02
4
+ ---
5
+
6
+ # Audit Findings: E03 UI Visual Refinement
7
+
8
+ ## Main Findings
9
+
10
+ E03 verified the visual refinement work around the board header, Next Activity line, task detail checklist rendering, shared status glyphs, and deterministic ANSI256 color profile behavior.
11
+
12
+ The audit found no blocking product-code issue in the reviewed E03 scope. The main drift was documentation/process cleanup: update architecture notes to match the implemented rendering behavior, record where the color profile was actually applied, and check off the completed T006 implementation plan.
13
+
14
+ ## Code Style Review
15
+
16
+
17
+ - [ ] One job per file
18
+ - [ ] One-sentence functions
19
+ - [ ] Test branches
20
+ - [ ] Types are documentation
21
+ - [ ] Build, don't speculate
22
+ - [ ] Errors at boundaries
23
+ - [ ] One source of truth
24
+ - [ ] Comments explain WHY
25
+ - [ ] Content in data files
26
+ - [ ] Small diffs
27
+
28
+ ## Proposed Changes
29
+
30
+ ### Target File
31
+
32
+ `.savepoint/Design.md`
33
+
34
+ ### Replace
35
+
36
+ ```yaml
37
+ last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
38
+ ```
39
+
40
+ ### With
41
+
42
+ ```yaml
43
+ last_audited: v1.1/E03-ui-visual-refinement (2026-05-02)
44
+ ```
45
+
46
+ ---
47
+
48
+ ### Target File
49
+
50
+ `.savepoint/Design.md`
51
+
52
+ ### Replace
53
+
54
+ ```markdown
55
+ - **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
56
+ ```
57
+
58
+ ### With
59
+
60
+ ```markdown
61
+ - **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), dedicated phase-colored Next Activity line below the header, sentence-boundary checklist rendering in task details, shared status glyph mapping for task cards and the epic sidebar, a forced ANSI256 Lipgloss color profile for board startup (v1.1 E03), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
62
+ ```
63
+
64
+ ---
65
+
66
+ ### Target File
67
+
68
+ `.savepoint/Design.md`
69
+
70
+ ### Replace
71
+
72
+ ```markdown
73
+ **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. The header can show a compact right-aligned Next Activity value from router state. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Non-TTY output remains a plain table fallback.
74
+ ```
75
+
76
+ ### With
77
+
78
+ ```markdown
79
+ **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. Active router `next_action` renders as a dedicated full-width line below the header with phase-colored `PLAN`, `BUILD`, or `AUDIT` prefix styling and truncates to terminal width. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. Task detail implementation-plan checkboxes render once per semantic sentence, not once per hard-wrapped markdown line. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Task card and epic sidebar status glyphs share `internal/board/status.go`; task cards use explicit `Task.Status` when available and retain the legacy column/stage glyph fallback when it is not. Non-TTY output remains a plain table fallback.
80
+ ```
81
+
82
+ ---
83
+
84
+ ### Target File
85
+
86
+ `AGENTS.md`
87
+
88
+ ### Replace
89
+
90
+ ```markdown
91
+ | `internal/board/` | TUI board, overlays, epic sidebar, status glyphs |
92
+ ```
93
+
94
+ ## With
95
+
96
+ ```markdown
97
+ | `internal/board/` | TUI board, overlays, epic sidebar, Next Activity line, detail checklist rendering, status glyphs, forced color profile |
98
+ ```
99
+
100
+ ---
101
+
102
+ ### Target File
103
+
104
+ `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
105
+
106
+ ### Replace
107
+
108
+ ```yaml
109
+ status: planned
110
+ ```
111
+
112
+ ### With
113
+
114
+ ```yaml
115
+ status: audited
116
+ ```
117
+
118
+ ---
119
+
120
+ ### Target File
121
+
122
+ `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
123
+
124
+ ### Replace
125
+
126
+ ```markdown
127
+ | `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
128
+ | `internal/board/view_test.go` | Header, formatting, and checkbox tests |
129
+ ```
130
+
131
+ ### With
132
+
133
+ ```markdown
134
+ | `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
135
+ | `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
136
+ | `internal/board/view_test.go` | Header, formatting, and checkbox tests |
137
+ ```
138
+
139
+ ---
140
+
141
+ ### Target File
142
+
143
+ `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
144
+
145
+ ### Insert After
146
+
147
+ ```markdown
148
+ | `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
149
+ | `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
150
+ | `internal/board/view_test.go` | Header, formatting, and checkbox tests |
151
+ ```
152
+
153
+ ### With
154
+
155
+ ```markdown
156
+ ## Implemented as
157
+
158
+ - `internal/board/view.go` renders `next_action` as a separate line below the header through `renderNextActivityLine`, using existing footer phase styles for `PLAN`, `BUILD`, and `AUDIT`.
159
+ - `internal/board/layout.go` accounts for the optional Next Activity line when calculating board chrome and content height.
160
+ - `internal/data/parser.go` joins hard-wrapped checklist continuation lines before rendering so markdown wrap points do not create duplicate checklist items.
161
+ - `internal/board/detail.go` splits checklist item text on semantic sentence boundaries and emits one `[ ]` or `[x]` marker per sentence.
162
+ - `internal/data/task.go` adds `Task.Status` plus status constants, including `audited`, for shared board glyph rendering.
163
+ - `internal/board/status.go` centralizes the planned, in-progress, done, and audited status glyph mapping used by task cards and the epic sidebar.
164
+ - `internal/board/card.go` uses explicit `Task.Status` when present, while preserving the legacy column/stage glyph fallback for older task data.
165
+ - `internal/board/epic_panel.go` delegates epic status glyph rendering to the shared status helper.
166
+ - `internal/board/board.go` sets Lipgloss to the ANSI256 color profile at board startup. This satisfies the deterministic 256-color rendering intent, although the implementation lives at the board boundary instead of `main.go`.
167
+ ```
168
+
169
+ ---
170
+
171
+ ### Target File
172
+
173
+ `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md`
174
+
175
+ ### Replace
176
+
177
+ ```markdown
178
+ ## Implementation Plan
179
+
180
+ - [ ] Read `main.go` — understand startup flow and identify where to inject profile forcing
181
+ - [ ] Edit `main.go` — add `lipgloss.SetColorProfile(lipgloss.Force256Color)` call before `board.Run()`
182
+ - [ ] Run `make build && make test` to verify no regressions
183
+ ```
184
+
185
+ ### With
186
+
187
+ ```markdown
188
+ ## Implementation Plan
189
+
190
+ - [x] Read board startup flow and identify where to inject profile forcing
191
+ - [x] Edit `internal/board/board.go` — add `lipgloss.SetColorProfile(termenv.ANSI256)` before model initialization
192
+ - [x] Run equivalent build and test gates in this Windows shell
193
+ ```
194
+
195
+ ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  type: epic-design
3
- status: planned
3
+ status: audited
4
4
  ---
5
5
 
6
6
  # Epic E03: UI Visual Refinement
@@ -29,4 +29,17 @@ Polish the Atari-Noir TUI rendering across Next Activity indicator repositioning
29
29
  | `internal/data/task.go` | Task markdown parsing for checkbox placement |
30
30
  | `internal/board/status.go` | Shared status glyph mapping helper (new) |
31
31
  | `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
32
+ | `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
32
33
  | `internal/board/view_test.go` | Header, formatting, and checkbox tests |
34
+
35
+ ## Implemented As
36
+
37
+ - `internal/board/view.go` renders `next_action` as a separate line below the header through `renderNextActivityLine`, using existing footer phase styles for `PLAN`, `BUILD`, and `AUDIT`.
38
+ - `internal/board/layout.go` accounts for the optional Next Activity line when calculating board chrome and content height.
39
+ - `internal/data/parser.go` joins hard-wrapped checklist continuation lines before rendering so markdown wrap points do not create duplicate checklist items.
40
+ - `internal/board/detail.go` splits checklist item text on semantic sentence boundaries and emits one `[ ]` or `[x]` marker per sentence.
41
+ - `internal/data/task.go` adds `Task.Status` plus status constants, including `audited`, for shared board glyph rendering.
42
+ - `internal/board/status.go` centralizes the planned, in-progress, done, and audited status glyph mapping used by task cards and the epic sidebar.
43
+ - `internal/board/card.go` uses explicit `Task.Status` when present, while preserving the legacy column/stage glyph fallback for older task data.
44
+ - `internal/board/epic_panel.go` delegates epic status glyph rendering to the shared status helper.
45
+ - `internal/board/board.go` sets Lipgloss to the ANSI256 color profile at board startup. This satisfies the deterministic 256-color rendering intent, although the implementation lives at the board boundary instead of `main.go`.
@@ -17,9 +17,9 @@ depends_on: []
17
17
 
18
18
  ## Implementation Plan
19
19
 
20
- - [ ] Read `main.go` — understand startup flow and identify where to inject profile forcing
21
- - [ ] Edit `main.go` — add `lipgloss.SetColorProfile(lipgloss.Force256Color)` call before `board.Run()`
22
- - [ ] Run `make build && make test` to verify no regressions
20
+ - [x] Read board startup flow and identify where to inject profile forcing
21
+ - [x] Edit `internal/board/board.go` — add `lipgloss.SetColorProfile(termenv.ANSI256)` before model initialization
22
+ - [x] Run equivalent build and test gates in this Windows shell
23
23
 
24
24
  ## Context Log
25
25