@gobing-ai/spur 0.3.80 → 0.3.82

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 (177) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +31 -18
  3. package/config/config.global.yaml +13 -11
  4. package/config/pipeline-budgets.json +34 -2
  5. package/config/plugin-scripts.json +25 -0
  6. package/config/rules/boundary/config-loading-ownership.yaml +0 -3
  7. package/config/rules/boundary/dao-boundary.yaml +4 -17
  8. package/config/rules/boundary/planning-folder-hardcode.yaml +0 -1
  9. package/config/rules/boundary/sp-no-vendor-refs.yaml +3 -2
  10. package/config/rules/boundary/sp-runtime-path.yaml +3 -14
  11. package/config/rules/quality/coverage-gate.yaml +3 -14
  12. package/config/rules/quality/tsdoc-exports.yaml +4 -7
  13. package/config/rules/strict/http-boundaries.yaml +5 -8
  14. package/config/rules/strict/runtime-boundaries.yaml +1 -5
  15. package/config/rules/structure/protected-files.yaml +9 -3
  16. package/config/rules/structure/test-focus-skip.yaml +0 -2
  17. package/config/rules/structure/test-location.yaml +0 -5
  18. package/config/rules/surface/check-cli-surface.yaml +3 -2
  19. package/config/rules/typescript/bun-tooling.yaml +5 -7
  20. package/config/rules/typescript/guarded-happy-dom-register.yaml +0 -2
  21. package/config/rules/typescript/happy-dom-teardown.yaml +0 -2
  22. package/config/rules/typescript/no-biome-suppressions.yaml +0 -2
  23. package/config/rules/typescript/no-debugger.yaml +0 -2
  24. package/config/rules/typescript/no-eslint-suppressions.yaml +0 -4
  25. package/config/rules/typescript/no-leaky-module-mocks.yaml +6 -13
  26. package/config/rules/typescript/no-module-scope-import-calls.yaml +0 -2
  27. package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +0 -3
  28. package/config/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -3
  29. package/config/rules/typescript/output-boundaries.yaml +0 -3
  30. package/config/rules/typescript/prefer-accessible-role-for-button-queries.yaml +0 -3
  31. package/config/rules/ui/ui-import-boundary.yaml +1 -5
  32. package/config/templates/docs/99_PROJECT_CONSTITUTION.md +75 -13
  33. package/config/transition-shims.json +0 -7
  34. package/config/workflows/basic.yaml +4 -0
  35. package/config/workflows/docs-pipeline.yaml +13 -14
  36. package/config/workflows/feature-dev.yaml +20 -65
  37. package/config/workflows/history-anatomy.yaml +22 -1
  38. package/config/workflows/idea-pipeline.yaml +53 -97
  39. package/config/workflows/pr-review.yaml +21 -33
  40. package/config/workflows/task-pipeline.yaml +87 -330
  41. package/config/workflows/wayfinder-resolution.yaml +12 -26
  42. package/config/workflows/wrapup-pipeline.yaml +48 -189
  43. package/package.json +9 -9
  44. package/plugins/sp/README.md +12 -3
  45. package/plugins/sp/agents/expert-spur.md +41 -19
  46. package/plugins/sp/lib/idea-handoff.generated.d.mts +17 -0
  47. package/plugins/sp/lib/idea-handoff.generated.mjs +1301 -0
  48. package/plugins/sp/plugin.json +1 -1
  49. package/plugins/sp/scripts/feature-dev-precheck.mjs +146 -0
  50. package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
  51. package/plugins/sp/scripts/idea-handoff.mjs +27 -0
  52. package/plugins/sp/scripts/idea-handoff.ts +44 -0
  53. package/plugins/sp/scripts/inline-run-setup.ts +69 -1
  54. package/plugins/sp/scripts/quality-gate.mjs +216 -0
  55. package/plugins/sp/scripts/quality-gate.ts +287 -0
  56. package/plugins/sp/scripts/surface-drift-inventory.ts +0 -2
  57. package/plugins/sp/scripts/task-size-precheck.ts +44 -16
  58. package/plugins/sp/scripts/verify-answer-lint.ts +17 -1
  59. package/plugins/sp/scripts/workflow-step-profile.mjs +319 -0
  60. package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
  61. package/plugins/sp/scripts/wrapup-steps.mjs +350 -0
  62. package/plugins/sp/scripts/wrapup-steps.ts +466 -0
  63. package/plugins/sp/skills/code-review/references/review-lenses.md +3 -0
  64. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  65. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +29 -0
  66. package/plugins/sp/skills/spur-cli/SKILL.md +4 -8
  67. package/plugins/sp/skills/spur-cli/references/agent.md +44 -69
  68. package/plugins/sp/skills/spur-cli/references/message.md +30 -3
  69. package/plugins/sp/skills/spur-cli/references/projects.md +25 -1
  70. package/plugins/sp/skills/spur-cli/references/self.md +6 -5
  71. package/plugins/sp/skills/spur-cli/references/serve.md +8 -7
  72. package/plugins/sp/skills/spur-cli/references/tasks.md +1 -1
  73. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +6 -3
  74. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +57 -18
  75. package/plugins/sp/skills/spur-composer/SKILL.md +145 -0
  76. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +10 -0
  77. package/plugins/sp/skills/spur-dev/references/execution-batch.md +1 -1
  78. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +4 -6
  79. package/plugins/sp/skills/spur-dev/references/glossary.md +1 -1
  80. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +11 -1
  81. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +24 -0
  82. package/plugins/sp/skills/spur-doctor/SKILL.md +138 -0
  83. package/plugins/sp/skills/taste-refactoring-api/README.md +43 -0
  84. package/plugins/sp/skills/taste-refactoring-api/SKILL.md +334 -0
  85. package/plugins/sp/skills/taste-refactoring-api/checklists/daily-api-review.md +71 -0
  86. package/plugins/sp/skills/taste-refactoring-api/examples/refactor-example.md +72 -0
  87. package/plugins/sp/skills/taste-refactoring-api/examples/review-template.md +93 -0
  88. package/plugins/sp/skills/taste-refactoring-api/references/api-refactoring-playbook.md +253 -0
  89. package/plugins/sp/skills/taste-refactoring-api/references/protocol-modes.md +79 -0
  90. package/plugins/sp/skills/taste-refactoring-api/references/research-basis.md +58 -0
  91. package/plugins/sp/skills/taste-refactoring-architect/README.md +26 -0
  92. package/plugins/sp/skills/taste-refactoring-architect/SKILL.md +471 -0
  93. package/plugins/sp/skills/taste-refactoring-architect/checklists/daily-architecture-review.md +48 -0
  94. package/plugins/sp/skills/taste-refactoring-architect/examples/refactor-example.md +55 -0
  95. package/plugins/sp/skills/taste-refactoring-architect/examples/review-template.md +51 -0
  96. package/plugins/sp/skills/taste-refactoring-architect/references/architecture-refactoring-playbook.md +173 -0
  97. package/plugins/sp/skills/taste-refactoring-architect/references/research-basis.md +28 -0
  98. package/plugins/sp/skills/taste-refactoring-tests/README.md +28 -0
  99. package/plugins/sp/skills/taste-refactoring-tests/SKILL.md +482 -0
  100. package/plugins/sp/skills/taste-refactoring-tests/checklists/daily-test-review.md +39 -0
  101. package/plugins/sp/skills/taste-refactoring-tests/examples/refactor-example.md +85 -0
  102. package/plugins/sp/skills/taste-refactoring-tests/examples/review-template.md +59 -0
  103. package/plugins/sp/skills/taste-refactoring-tests/references/research-basis.md +47 -0
  104. package/plugins/sp/skills/taste-refactoring-tests/references/test-refactoring-playbook.md +222 -0
  105. package/plugins/sp/skills/taste-refactoring-ui/README.md +12 -0
  106. package/plugins/sp/skills/taste-refactoring-ui/SKILL.md +290 -0
  107. package/plugins/sp/skills/taste-refactoring-ui/checklists/daily-ui-review.md +72 -0
  108. package/plugins/sp/skills/taste-refactoring-ui/examples/review-template.md +51 -0
  109. package/plugins/sp/skills/taste-refactoring-ui/references/refactoring-ui-playbook.md +170 -0
  110. package/plugins/sp/skills/wayfinder/SKILL.md +2 -2
  111. package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +30 -0
  112. package/schemas/spur-config.schema.json +105 -85
  113. package/spur.js +44616 -43320
  114. package/web/_astro/BoardApp.D-WlxiN2.js +1 -0
  115. package/web/_astro/{BoardApp.CHQ1lycZ.js → BoardApp.D8bM9pKL.js} +97 -95
  116. package/web/_astro/{TaskDetail.GKfQJ60c.js → TaskDetail.BPRqgVUE.js} +1 -1
  117. package/web/_astro/{arc.DWEtA3Tx.js → arc.BPrPES3z.js} +1 -1
  118. package/web/_astro/{architectureDiagram-3BPJPVTR.DB42oWmP.js → architectureDiagram-3BPJPVTR.qX_7q02P.js} +1 -1
  119. package/web/_astro/{blockDiagram-GPEHLZMM.rhv-zNQV.js → blockDiagram-GPEHLZMM.CUZfj5V7.js} +1 -1
  120. package/web/_astro/{c4Diagram-AAUBKEIU.Ci4-4VvY.js → c4Diagram-AAUBKEIU.CTaOr8hH.js} +1 -1
  121. package/web/_astro/channel.DGZaFHZx.js +1 -0
  122. package/web/_astro/{chunk-2J33WTMH.Cc9veUgf.js → chunk-2J33WTMH.Dt-9wf3h.js} +1 -1
  123. package/web/_astro/{chunk-4BX2VUAB.Bec9c4eI.js → chunk-4BX2VUAB.CTC2sdoN.js} +1 -1
  124. package/web/_astro/{chunk-55IACEB6.DoV8S1iB.js → chunk-55IACEB6.DQcxt2_g.js} +1 -1
  125. package/web/_astro/{chunk-727SXJPM.DwR-Qlyj.js → chunk-727SXJPM.DXFPSn-a.js} +1 -1
  126. package/web/_astro/{chunk-AQP2D5EJ.ND_a81WY.js → chunk-AQP2D5EJ.BCx3U4bT.js} +1 -1
  127. package/web/_astro/{chunk-FMBD7UC4.Wv_jwG48.js → chunk-FMBD7UC4.DL2tJkdO.js} +1 -1
  128. package/web/_astro/{chunk-ND2GUHAM.CXKXCMmp.js → chunk-ND2GUHAM.DZyflMro.js} +1 -1
  129. package/web/_astro/{chunk-QZHKN3VN.nkaoNYQq.js → chunk-QZHKN3VN.CUI2mT09.js} +1 -1
  130. package/web/_astro/{classDiagram-4FO5ZUOK.cMQcVlQu.js → classDiagram-4FO5ZUOK.g4rX4Fr1.js} +1 -1
  131. package/web/_astro/{classDiagram-v2-Q7XG4LA2.cMQcVlQu.js → classDiagram-v2-Q7XG4LA2.g4rX4Fr1.js} +1 -1
  132. package/web/_astro/{cose-bilkent-S5V4N54A.OaDJ7Mr2.js → cose-bilkent-S5V4N54A.CzWJLqp0.js} +1 -1
  133. package/web/_astro/{cynefin-OW5HDTMX.Chi8IphF.js → cynefin-OW5HDTMX.WgsvQeCR.js} +1 -1
  134. package/web/_astro/{cytoscape.esm.DzSz-X2X.js → cytoscape.esm.BB4DxJjf.js} +1 -1
  135. package/web/_astro/{dagre-BM42HDAG.CzK2t_Fp.js → dagre-BM42HDAG.Dzv6ngql.js} +1 -1
  136. package/web/_astro/{diagram-2AECGRRQ.DRvxlVS7.js → diagram-2AECGRRQ.CpJ4a9rU.js} +1 -1
  137. package/web/_astro/{diagram-5GNKFQAL.CnYvNdwA.js → diagram-5GNKFQAL.CzPlF_dq.js} +1 -1
  138. package/web/_astro/{diagram-KO2AKTUF.CpLpMw5R.js → diagram-KO2AKTUF.TAkZNTcQ.js} +1 -1
  139. package/web/_astro/{diagram-LMA3HP47.JTb78qUA.js → diagram-LMA3HP47.uCjoKSag.js} +1 -1
  140. package/web/_astro/{diagram-OG6HWLK6.Bk-1jDIb.js → diagram-OG6HWLK6.eMplIjoK.js} +1 -1
  141. package/web/_astro/{erDiagram-TEJ5UH35.D8hN9GZq.js → erDiagram-TEJ5UH35.Bf7zoXGz.js} +1 -1
  142. package/web/_astro/{flowDiagram-I6XJVG4X.-6zQr6m5.js → flowDiagram-I6XJVG4X.B_bHj3gN.js} +1 -1
  143. package/web/_astro/{ganttDiagram-6RSMTGT7.DboLQ9ca.js → ganttDiagram-6RSMTGT7.BasrHRMj.js} +1 -1
  144. package/web/_astro/{gitGraphDiagram-PVQCEYII.4tYvJKGR.js → gitGraphDiagram-PVQCEYII.C6iphq1x.js} +1 -1
  145. package/web/_astro/index.DayyIngm.css +1 -0
  146. package/web/_astro/{infoDiagram-5YYISTIA.Bd9rXpsB.js → infoDiagram-5YYISTIA.HXmDMhW4.js} +1 -1
  147. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CvMoaf67.js → ishikawaDiagram-YF4QCWOH.BSmW8NiU.js} +1 -1
  148. package/web/_astro/{journeyDiagram-JHISSGLW.Ccy1CA7y.js → journeyDiagram-JHISSGLW.DEQow5fo.js} +1 -1
  149. package/web/_astro/{kanban-definition-UN3LZRKU.0MaMqHNS.js → kanban-definition-UN3LZRKU.IVm9cTdc.js} +1 -1
  150. package/web/_astro/{linear.CHXgcIbN.js → linear.CrsM73_9.js} +1 -1
  151. package/web/_astro/{mermaid.core.Ca-kcelG.js → mermaid.core.CfBeDJls.js} +6 -6
  152. package/web/_astro/{mindmap-definition-RKZ34NQL.BUIDlHa0.js → mindmap-definition-RKZ34NQL.C3j60Y-0.js} +1 -1
  153. package/web/_astro/ordinal.BYWQX77i.js +1 -0
  154. package/web/_astro/{pieDiagram-4H26LBE5.2dX3CU1s.js → pieDiagram-4H26LBE5.B-aCMeEA.js} +1 -1
  155. package/web/_astro/{quadrantDiagram-W4KKPZXB.B3LBlRiv.js → quadrantDiagram-W4KKPZXB.Cib965yq.js} +1 -1
  156. package/web/_astro/{requirementDiagram-4Y6WPE33.X12I2uNx.js → requirementDiagram-4Y6WPE33.D61cS4O-.js} +1 -1
  157. package/web/_astro/{sankeyDiagram-5OEKKPKP.BXohIHqx.js → sankeyDiagram-5OEKKPKP.GKF2qVPy.js} +1 -1
  158. package/web/_astro/{sequenceDiagram-3UESZ5HK.C37ZIUzg.js → sequenceDiagram-3UESZ5HK.DZnq8F2h.js} +1 -1
  159. package/web/_astro/{stateDiagram-AJRCARHV.BRgz317z.js → stateDiagram-AJRCARHV.DXUFmdgM.js} +1 -1
  160. package/web/_astro/{stateDiagram-v2-BHNVJYJU.7VYSXN9-.js → stateDiagram-v2-BHNVJYJU.BtHmhLEz.js} +1 -1
  161. package/web/_astro/{timeline-definition-PNZ67QCA.BVNz_HiN.js → timeline-definition-PNZ67QCA.Cy-WW2ln.js} +1 -1
  162. package/web/_astro/{vennDiagram-CIIHVFJN.CHVDkPX4.js → vennDiagram-CIIHVFJN.SLp5b9KI.js} +1 -1
  163. package/web/_astro/{wardleyDiagram-YWT4CUSO.EQQ_qT9v.js → wardleyDiagram-YWT4CUSO.Bww45mWV.js} +1 -1
  164. package/web/_astro/{xychartDiagram-2RQKCTM6.DrAT9WoP.js → xychartDiagram-2RQKCTM6.DR4swI6a.js} +1 -1
  165. package/web/apple-touch-icon.png +0 -0
  166. package/web/favicon.ico +0 -0
  167. package/web/favicon.svg +17 -4
  168. package/web/icon-192.png +0 -0
  169. package/web/icon-512.png +0 -0
  170. package/web/index.html +2 -2
  171. package/web/site.webmanifest +31 -0
  172. package/web/spur_logo.svg +1 -0
  173. package/plugins/sp/skills/spur-cli/references/team.md +0 -145
  174. package/web/_astro/BoardApp.DV9kx0wo.js +0 -1
  175. package/web/_astro/channel.BAI6xLeV.js +0 -1
  176. package/web/_astro/index.Dcr_8fiK.css +0 -1
  177. package/web/_astro/ordinal.DBvzRdQf.js +0 -1
@@ -0,0 +1,51 @@
1
+ # Reusable UI Review Template
2
+
3
+ ## Diagnosis
4
+ The screen’s main problem is **[hierarchy / density / unclear grouping / inconsistent system / weak typography / noisy color / over-decoration]**. The target direction is **[clear, calm, focused, premium, playful, dense-but-scannable, etc.]**.
5
+
6
+ ## Highest-impact changes
7
+
8
+ ### 1. [Issue]
9
+ **Observation:** …
10
+ **Why it matters:** …
11
+ **Refactor:** …
12
+ **System rule:** …
13
+
14
+ ### 2. [Issue]
15
+ **Observation:** …
16
+ **Why it matters:** …
17
+ **Refactor:** …
18
+ **System rule:** …
19
+
20
+ ### 3. [Issue]
21
+ **Observation:** …
22
+ **Why it matters:** …
23
+ **Refactor:** …
24
+ **System rule:** …
25
+
26
+ ## System decisions
27
+ - Type scale: …
28
+ - Font weights: …
29
+ - Spacing scale: …
30
+ - Content widths: …
31
+ - Radius scale: …
32
+ - Shadow/elevation scale: …
33
+ - Primary/neutral/semantic color ramps: …
34
+ - Icon sizes: …
35
+
36
+ ## Implementation notes
37
+ - Component changes: …
38
+ - Responsive behavior: …
39
+ - Interaction states: …
40
+ - Empty/loading/error handling: …
41
+ - Media constraints: …
42
+
43
+ ## Final quality gate
44
+ - [ ] Primary task obvious
45
+ - [ ] Hierarchy works in grayscale
46
+ - [ ] Grouping is unambiguous
47
+ - [ ] Typography is readable
48
+ - [ ] Colors are systematic and accessible
49
+ - [ ] Borders/shadows are purposeful
50
+ - [ ] States are covered
51
+ - [ ] No decorative fix is hiding a structural issue
@@ -0,0 +1,170 @@
1
+ # Refactoring UI — Operational Playbook
2
+
3
+ This is a concise operational distillation of the source material, organized by the book’s major sections.
4
+
5
+ ## 1. Starting from scratch
6
+
7
+ ### Start with a feature, not a layout
8
+ Design actual functionality before global shell decisions. The shell should emerge from the needs of the features, not the reverse.
9
+
10
+ ### Detail comes later
11
+ Explore structure in low fidelity. Grayscale is useful because it forces hierarchy to be carried by spacing, size, and contrast. Treat early wireframes as disposable.
12
+
13
+ ### Don’t design too much
14
+ Work in short design → implementation cycles. Build the smallest useful version first. Do not imply functionality that is not ready to ship.
15
+
16
+ ### Choose a personality
17
+ Personality is built from concrete choices: typeface, color, border radius, imagery, and language. Keep these choices coherent.
18
+
19
+ ### Limit your choices
20
+ Predefine scales and tokens. Use process-of-elimination between neighboring values instead of endless micro-adjustment. Systematize recurring low-level choices.
21
+
22
+ ## 2. Hierarchy is everything
23
+
24
+ ### Not all elements are equal
25
+ A polished interface makes relative importance obvious. Primary, secondary, and tertiary elements should not compete equally.
26
+
27
+ ### Size isn’t everything
28
+ Use weight and contrast to create hierarchy so headings do not become oversized and support text does not become unreadably small.
29
+
30
+ ### Don’t use grey text on colored backgrounds
31
+ The real goal is lower contrast, not “grey.” Choose text colors that harmonize with the surface instead of simply applying grey or low opacity.
32
+
33
+ ### Emphasize by de-emphasizing
34
+ If an important item still does not stand out, quiet its competitors before adding more emphasis.
35
+
36
+ ### Labels are a last resort
37
+ Remove labels where format/context already explains the value. Combine label + value into natural language when possible. When labels are necessary, style them according to the user’s scan target.
38
+
39
+ ### Separate visual hierarchy from document hierarchy
40
+ Semantic markup and visual appearance are different concerns. Keep accessible/semantic structure while styling visual importance appropriately.
41
+
42
+ ### Balance weight and contrast
43
+ Heavy visual elements may need lower contrast; low-contrast elements may need more weight. Use these as counterbalances.
44
+
45
+ ### Semantics are secondary
46
+ Buttons, links, and actions do not all need the same visual treatment. Style according to action priority, while preserving correct semantics and interaction behavior.
47
+
48
+ ## 3. Layout and spacing
49
+
50
+ ### Start with too much white space
51
+ It is easier to tighten a spacious design than to rescue a cramped one. Density can be valid, but make it intentional.
52
+
53
+ ### Establish a spacing and sizing system
54
+ Use a scale with perceptible, non-linear jumps. Fine differences matter more at small sizes than large sizes.
55
+
56
+ ### You don’t have to fill the whole screen
57
+ Use max widths and intrinsic content dimensions. Empty space is not wasted space when it improves comprehension.
58
+
59
+ ### Grids are overrated
60
+ Do not force unrelated sections to line up to one universal grid. Use the local structure the content needs.
61
+
62
+ ### Relative sizing doesn’t scale
63
+ Avoid overusing relative percentages for things that need stable emphasis or readable dimensions. Use intentional widths and breakpoints.
64
+
65
+ ### Avoid ambiguous spacing
66
+ Spacing must make relationships obvious. A gap should clearly say whether two things belong together or apart.
67
+
68
+ ## 4. Designing text
69
+
70
+ ### Establish a type scale
71
+ Use a small, predefined scale instead of pixel-by-pixel typography.
72
+
73
+ ### Use good fonts
74
+ For UI, prioritize families designed for legibility at small sizes. Popular, well-tested neutral sans-serifs are safe defaults; use personality faces intentionally.
75
+
76
+ ### Keep your line length in check
77
+ Long lines are hard to read. Limit prose width even on wide screens.
78
+
79
+ ### Baseline, not center
80
+ Text and icons often look more natural when aligned optically/baseline rather than mechanically center-aligned.
81
+
82
+ ### Line-height is proportional
83
+ Small text generally needs more line-height; large headlines can use tighter line-height.
84
+
85
+ ### Not every link needs a color
86
+ Context and interaction styling may be enough. Too many colored links create noise.
87
+
88
+ ### Align with readability in mind
89
+ Left-align most multi-line text. Center alignment is better suited to short isolated blocks.
90
+
91
+ ### Use letter-spacing effectively
92
+ Uppercase text can benefit from added tracking. Large headlines in wide-spaced UI fonts may benefit from tighter tracking. Do not try to turn display faces into body faces by spacing alone.
93
+
94
+ ## 5. Working with color
95
+
96
+ ### Ditch hex for HSL
97
+ Thinking in hue, saturation, and lightness makes relationships between colors easier to reason about.
98
+
99
+ ### You need more colors than you think
100
+ A useful palette needs multiple shades for text, surfaces, borders, hover states, fills, and semantic feedback.
101
+
102
+ ### Define your shades up front
103
+ Create ramps for key colors and neutrals before styling individual elements.
104
+
105
+ ### Don’t let lightness kill your saturation
106
+ Lighter/darker colors often need saturation and sometimes hue adjustments to stay rich and natural.
107
+
108
+ ### Greys don’t have to be grey
109
+ Slightly tinted neutrals can give the interface more character and cohesion.
110
+
111
+ ### Accessible doesn’t have to mean ugly
112
+ Use contrast deliberately and employ multiple tones/weights rather than making everything equally dark.
113
+
114
+ ### Don’t rely on color alone
115
+ Pair color with copy, icons, shapes, borders, or placement so status remains understandable without color perception.
116
+
117
+ ## 6. Creating depth
118
+
119
+ ### Emulate a light source
120
+ Use consistent highlights and shadows so surfaces feel physically coherent.
121
+
122
+ ### Use shadows to convey elevation
123
+ Shadow size and softness should map to distance from the base surface and can help direct focus.
124
+
125
+ ### Shadows can have two parts
126
+ A realistic UI shadow can combine a tight contact shadow with a broader ambient shadow.
127
+
128
+ ### Even flat designs can have depth
129
+ Borders, background shifts, highlights, and overlap can create separation without large shadows.
130
+
131
+ ### Overlap elements to create layers
132
+ Controlled overlap can communicate relationships and produce stronger composition.
133
+
134
+ ## 7. Working with images
135
+
136
+ ### Use good photos
137
+ Source quality matters more than effects.
138
+
139
+ ### Text needs consistent contrast
140
+ Text over images must remain readable regardless of image variation. Use overlays, contrast reduction, colorization, or subtle text glow/shadow as tools.
141
+
142
+ ### Everything has an intended size
143
+ Do not enlarge small-detail icons until they look chunky. Do not shrink dense screenshots until content becomes unreadable. Crop or redesign the presentation.
144
+
145
+ ### Beware user-uploaded content
146
+ Expect arbitrary aspect ratios, colors, and quality. Use fixed frames, cropping, safe contrast regions, and fallbacks.
147
+
148
+ ## 8. Finishing touches
149
+
150
+ ### Supercharge the defaults
151
+ Default controls can often be improved with coherent radius, typography, iconography, spacing, and state styling.
152
+
153
+ ### Add color with accent borders
154
+ Thin, intentional accents can introduce brand color without turning large surfaces into saturated blocks.
155
+
156
+ ### Decorate your backgrounds
157
+ Subtle shapes, patterns, gradients, or illustrations can add personality, but they should remain subordinate to content.
158
+
159
+ ### Don’t overlook empty states
160
+ Use empty states to teach the next action, set expectations, or explain what will appear there.
161
+
162
+ ### Use fewer borders
163
+ When possible, create separation with spacing, surface color, or depth instead of boxing everything in.
164
+
165
+ ### Think outside the box
166
+ Do not default every section to a rectangular card. Allow imagery, backgrounds, overlap, or asymmetrical composition when they better serve the content.
167
+
168
+ ## 9. Leveling up
169
+
170
+ The larger lesson is to build visual judgment through deliberate observation, comparison, and repetition. Collect good patterns, notice why they work, and turn recurring insights into reusable systems rather than isolated tricks.
@@ -128,7 +128,7 @@ Invoked when the operator has a loose idea and the destination itself is foggy.
128
128
 
129
129
  ### Work Through the Map
130
130
 
131
- Invoked when a map already exists (operator provides the feature ID). A ticket is **optional** — without one, pick the next frontier ticket, not the operator's preference.
131
+ Invoked when a map already exists (operator provides the feature ID). A ticket is **optional** — without one, pick the next frontier ticket, not the operator's preference. Pipeline runs: `references/pipeline-resolution.md`.
132
132
 
133
133
  0. **Branch first.** `git checkout -b wayfind/<wbs>-<slug>`, for the same reason as charting: steps 6 and 7 below remove fog from the map, and the gate that checks the removal was paid for measures the branch, not the commit. On the default branch the check silently passes no matter what you delete.
134
134
  1. **Load the map** — the feature description (the low-res view), not every task body. Read the destination and Decisions-so-far to orient.
@@ -266,7 +266,7 @@ The operator invokes this skill directly: `Skill(skill="sp:wayfinder", args="<lo
266
266
 
267
267
  ## Reference Files
268
268
 
269
- - **`../spur-dev/references/decision-brief.md`** — Decision-brief format for HITL choices during charting
269
+ - **`../spur-dev/references/decision-brief.md`** — Decision-brief format for HITL choices during charting.
270
270
  - **`../spur-dev/references/cross-cutting.md`** — Verification-before-completion rule (one-ticket-per-session discipline)
271
271
  - **`../spur-dev/references/execution-batch.md`** — Batch execution model (pairs with one-ticket-per-session loop)
272
272
 
@@ -0,0 +1,30 @@
1
+ # Wayfinder resolution-pipeline authoring contract
2
+
3
+ Reference for the `wayfinder-resolution` workflow's `investigate` hop. The pipeline passes a
4
+ bounded pointer prompt; this page carries the full authoring contract the hop must follow.
5
+ Context variables (`${vars.wbs}`, `${vars.resolutionMode}`, `${vars.evidencePolicy}`) are
6
+ resolved by the engine before the hop runs.
7
+
8
+ ## Research boundary (preserve the research boundary)
9
+
10
+ - Work only from the prepared local bundle `.spur/run/<runId>-wayfinder-input.json`, local
11
+ shell/file reads, and the `spur` CLI. Do not use network search or MCP tools.
12
+ - Do not invoke `task-pipeline.yaml`, `/sp:dev-run`, `/sp:dev-runall`, or any code
13
+ implementation pipeline. This hop authors research/specification sections — it never
14
+ implements.
15
+
16
+ ## Procedure
17
+
18
+ 1. Read the task file for `<wbs>` and map its existing Requirements and Acceptance Criteria
19
+ onto the existing Design/Plan/References sections.
20
+ 2. Author concise Solution, Testing, and Review sections through
21
+ `spur task update --section --from-file` (write each section to a file, then pass it).
22
+ 3. Finish with a short summary and stop.
23
+
24
+ ## Evidence-anchor contract (mandatory — 0299 R1 line-anchor rule)
25
+
26
+ When the task's evidence lives in a shared evidence file, anchor every Solution/Testing
27
+ `file:line` citation truthfully — resolve the section's real start line with
28
+ `grep -n "^## <wbs> " <evidence-file>` and cite that exact line. NEVER copy a line number
29
+ from another ticket's example; each WBS anchors to its own section. Before finishing, re-read
30
+ each cited line and confirm it names the requirement's subject.
@@ -173,6 +173,62 @@
173
173
  }
174
174
  }
175
175
  },
176
+ "fleet": {
177
+ "type": "object",
178
+ "description": "The project's agent fleet (G65 / 0858): the single declaration of composition, the on/off switch, and the dispatch strategy. PROJECT LAYER ONLY — a global-layer agent.fleet fails the load. Replaces the retired .spur/fleet.json (0835) and agent.team (0857). Mirrors @gobing-ai/spur-config AgentFleetSchema (Zod is SSOT).",
179
+ "properties": {
180
+ "enabled": {
181
+ "type": "boolean",
182
+ "default": false,
183
+ "description": "The single fleet switch. `spur serve` materializes and autostarts the roster only when true; an absent or disabled fleet starts nothing."
184
+ },
185
+ "strategy": {
186
+ "type": "string",
187
+ "enum": ["rest", "gtd"],
188
+ "default": "rest",
189
+ "description": "Dispatch strategy, reconciled into project_strategy at serve start (0859). One name is added by a typed code change, not by config."
190
+ },
191
+ "orchestrator": {
192
+ "type": "string",
193
+ "minLength": 1,
194
+ "description": "memberLocalId of the one planner-role member carrying purpose: orchestrator. Absent = no orchestrator declared (never inferred)."
195
+ },
196
+ "members": {
197
+ "type": "array",
198
+ "default": [],
199
+ "description": "The roster. Each member declares a role or an executor. `enabled: false` keeps the member's derived <role>-<n> id index but does not materialize it.",
200
+ "items": {
201
+ "type": "object",
202
+ "properties": {
203
+ "id": {
204
+ "type": "string",
205
+ "minLength": 1,
206
+ "description": "Explicit stable id; wins over the derived <role>-<n> form."
207
+ },
208
+ "role": {
209
+ "type": "string",
210
+ "enum": ["scribe", "coder", "reviewer", "planner"],
211
+ "description": "Layer-1 role id (closed vocabulary)."
212
+ },
213
+ "executor": {
214
+ "type": "string",
215
+ "minLength": 1,
216
+ "description": "Executor profile name or a raw canonical agent type."
217
+ },
218
+ "purpose": {
219
+ "type": "string",
220
+ "description": "Free-form member purpose; `orchestrator` is the value the orchestrator pointer binds to."
221
+ },
222
+ "enabled": {
223
+ "type": "boolean",
224
+ "description": "Default true. False preserves the member's derived id index without materializing it."
225
+ }
226
+ },
227
+ "anyOf": [{ "required": ["role"] }, { "required": ["executor"] }]
228
+ }
229
+ }
230
+ }
231
+ },
176
232
  "roles": {
177
233
  "type": "object",
178
234
  "description": "Per-role tier/stage overrides over DEFAULT_AGENT_ROLES (0572 / ADR-061). Keys are the closed role vocabulary (scribe, coder, reviewer, planner); a present field replaces the default for that role, an omitted field keeps it. Mirrors @gobing-ai/spur-config AgentRoleConfigSchema (Zod is SSOT).",
@@ -192,91 +248,6 @@
192
248
  }
193
249
  }
194
250
  }
195
- },
196
- "team": {
197
- "type": "object",
198
- "description": "Declarative agent teams keyed by team id (the map key is the teamId). Each team materializes a roster of agent specs (feature M). Mirrors @gobing-ai/spur-config TeamConfigSchema (Zod is SSOT).",
199
- "additionalProperties": {
200
- "type": "object",
201
- "required": ["name", "work_dir", "members"],
202
- "properties": {
203
- "name": {
204
- "type": "string",
205
- "minLength": 1,
206
- "description": "Human-readable team label."
207
- },
208
- "work_dir": {
209
- "type": "string",
210
- "minLength": 1,
211
- "description": "Default member workspace. A leading `~` is tilde-expanded at load."
212
- },
213
- "autostart": {
214
- "type": "boolean",
215
- "description": "Team-wide autostart default; per-member autostart overrides (effective = member.autostart ?? team.autostart ?? false)."
216
- },
217
- "members": {
218
- "type": "array",
219
- "minItems": 1,
220
- "description": "Roster of member references (>= 1). A bare string is shorthand for { executor: <string> }; the composed agent id is <teamId>-<id ?? executor>.",
221
- "items": {
222
- "oneOf": [
223
- {
224
- "type": "string",
225
- "minLength": 1
226
- },
227
- {
228
- "type": "object",
229
- "properties": {
230
- "executor": {
231
- "type": "string",
232
- "minLength": 1,
233
- "description": "Executor name \u2014 resolved against agent.executors first, else a raw canonical agent type. Optional since 0543: a role-only member (no executor) resolves one through the tier ladder at materialization; at least one of role or executor is required."
234
- },
235
- "id": {
236
- "type": "string",
237
- "minLength": 1,
238
- "description": "Local member id; composed id is <teamId>-<id ?? executor> (must match ^[a-z][a-z0-9_-]{1,63}$)."
239
- },
240
- "purpose": {
241
- "type": "string"
242
- },
243
- "role": {
244
- "type": "string",
245
- "enum": ["scribe", "coder", "reviewer", "planner"],
246
- "description": "Layer-1 role id (0538 R3): typed routing field carried onto the materialized spec; purpose stays prose."
247
- },
248
- "workspace": {
249
- "type": "string",
250
- "minLength": 1,
251
- "description": "Per-member workspace override. A leading `~` is tilde-expanded at load."
252
- },
253
- "model": {
254
- "type": "string",
255
- "minLength": 1
256
- },
257
- "autonomy": {
258
- "type": "string"
259
- },
260
- "systemPrompt": {
261
- "type": "string"
262
- },
263
- "command": {
264
- "type": "array",
265
- "items": {
266
- "type": "string",
267
- "minLength": 1
268
- }
269
- },
270
- "autostart": {
271
- "type": "boolean"
272
- }
273
- }
274
- }
275
- ]
276
- }
277
- }
278
- }
279
- }
280
251
  }
281
252
  }
282
253
  },
@@ -333,6 +304,55 @@
333
304
  }
334
305
  }
335
306
  },
307
+ "builder": {
308
+ "type": "object",
309
+ "description": "Builder noun configuration. Currently hosts the release plumbing knobs for `spur builder bump-ver` / `drop-tags`; every field defaults to the built-in release convention, so an absent builder section keeps default behavior.",
310
+ "properties": {
311
+ "bump-ver": {
312
+ "type": "object",
313
+ "description": "Release knobs for bump-ver/drop-tags. Defaults: -v separator, publish.yml workflow, chore(release) commit, gh run list limit 5.",
314
+ "properties": {
315
+ "tagVersionSeparator": {
316
+ "type": "string",
317
+ "minLength": 1,
318
+ "description": "Release tag format: <package><separator><version>. Default \"-v\"."
319
+ },
320
+ "publishWorkflow": {
321
+ "type": "string",
322
+ "minLength": 1,
323
+ "description": "GitHub Actions workflow file the pushed release tag triggers. Default \"publish.yml\"."
324
+ },
325
+ "releaseCommitType": {
326
+ "type": "string",
327
+ "minLength": 1,
328
+ "description": "Conventional commit type for the release commit. Default \"chore\"."
329
+ },
330
+ "releaseCommitScope": {
331
+ "type": "string",
332
+ "minLength": 1,
333
+ "description": "Conventional commit scope for the release commit. Default \"release\"."
334
+ },
335
+ "ghRunListLimit": {
336
+ "type": "integer",
337
+ "minimum": 1,
338
+ "description": "gh run list --limit used to point at the triggered publish run. Default 5."
339
+ },
340
+ "versionCarriers": {
341
+ "type": "array",
342
+ "description": "Extra version carriers beyond workspace package.json files. Default: none. Types are registered in apps/cli/src/version-carriers.ts (registerCarrierType), which validates instances at release time; registering a new type extends this description in the same commit.",
343
+ "items": {
344
+ "type": "object",
345
+ "description": "One carrier instance. Required field: type (string). Built-ins: plugin-manifest { paths: [..] } — repo-wide manifests synced to the release version (e.g. per-platform plugin.json mirrors); ts-literal { file?, identifier? } — version constant in a package source file (defaults src/config.ts / binaryVersion).",
346
+ "properties": {
347
+ "type": { "type": "string", "minLength": 1 }
348
+ },
349
+ "required": ["type"]
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
355
+ },
336
356
  "tasks": {
337
357
  "type": "object",
338
358
  "description": "Task-folder registration (design \u00a79). Absorbs the legacy docs/.tasks/config.json folders + baseCounter concepts. Mirrors @gobing-ai/spur-config tasksConfigSchema (Zod is SSOT).",