@gobing-ai/spur 0.4.3 → 0.4.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 (117) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/rules/docs/verdict-confidence.yaml +68 -0
  3. package/config/rules/quality/coverage-gate.yaml +13 -0
  4. package/config/rules/recommended-pre-check.yaml +6 -2
  5. package/config/rules/strict/runtime-boundaries.yaml +3 -0
  6. package/config/rules/surface/check-cli-surface.yaml +1 -3
  7. package/config/templates/AGENTS.md +7 -0
  8. package/config/workflows/feature-verification.yaml +9 -1
  9. package/config/workflows/task-lifecycle.yaml +50 -0
  10. package/config/workflows/task-pipeline.yaml +15 -9
  11. package/package.json +10 -10
  12. package/plugins/sp/agents/super-reviewer.md +5 -2
  13. package/plugins/sp/commands/dev-changelog.md +1 -1
  14. package/plugins/sp/commands/dev-gitmsg.md +6 -2
  15. package/plugins/sp/commands/dev-handover.md +1 -0
  16. package/plugins/sp/commands/dev-job-dump.md +2 -1
  17. package/plugins/sp/commands/dev-refine.md +14 -2
  18. package/plugins/sp/commands/dev-refineall.md +7 -1
  19. package/plugins/sp/commands/dev-review.md +1 -0
  20. package/plugins/sp/lib/history-anatomy.generated.mjs +18 -18
  21. package/plugins/sp/lib/idea-handoff.generated.mjs +91 -91
  22. package/plugins/sp/lib/inline-run.generated.mjs +233 -277
  23. package/plugins/sp/lib/plan-projection.generated.mjs +62 -38
  24. package/plugins/sp/lib/quality-gate.generated.d.mts +1 -0
  25. package/plugins/sp/lib/quality-gate.generated.mjs +13793 -13966
  26. package/plugins/sp/lib/residual-scan.generated.d.mts +13 -0
  27. package/plugins/sp/lib/residual-scan.generated.mjs +51 -21
  28. package/plugins/sp/lib/step-profile.generated.mjs +8 -8
  29. package/plugins/sp/plugin.json +1 -1
  30. package/plugins/sp/scripts/batch-plan.mjs +62 -40
  31. package/plugins/sp/scripts/batch-preflight.mjs +34 -12
  32. package/plugins/sp/scripts/commit-guard.mjs +6 -6
  33. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +26 -28
  34. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +11 -11
  35. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +4 -4
  36. package/plugins/sp/scripts/feature-verification-steps.mjs +15 -4
  37. package/plugins/sp/scripts/feature-verification-steps.ts +29 -1
  38. package/plugins/sp/scripts/history-anatomy-cache.mjs +19 -19
  39. package/plugins/sp/scripts/idea-handoff.mjs +2 -2
  40. package/plugins/sp/scripts/inline-run-dispatch.mjs +2 -2
  41. package/plugins/sp/scripts/inline-run-setup.mjs +20 -20
  42. package/plugins/sp/scripts/persist-out-check.mjs +5 -5
  43. package/plugins/sp/scripts/pr-reviewing.mjs +13 -13
  44. package/plugins/sp/scripts/quality-gate.mjs +13715 -13884
  45. package/plugins/sp/scripts/residual-scan.mjs +58 -27
  46. package/plugins/sp/scripts/residual-scan.ts +8 -8
  47. package/plugins/sp/scripts/run-summary.mjs +15 -15
  48. package/plugins/sp/scripts/script-root.mjs +6 -6
  49. package/plugins/sp/scripts/session-timeline.mjs +16 -16
  50. package/plugins/sp/scripts/task-diffstat.mjs +8 -8
  51. package/plugins/sp/scripts/workflow-step-profile.mjs +12 -12
  52. package/plugins/sp/scripts/wrapup-drift-probe.mjs +9 -9
  53. package/plugins/sp/scripts/wrapup-steps.mjs +25 -25
  54. package/plugins/sp/skills/next-router/SKILL.md +3 -1
  55. package/plugins/sp/skills/next-router/references/routing-table.md +9 -3
  56. package/plugins/sp/skills/spur-cli/references/tasks.md +24 -4
  57. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +8 -1
  58. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -11
  59. package/plugins/sp/skills/spur-dev/references/execution-batch.md +6 -3
  60. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +4 -2
  61. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +22 -2
  62. package/schemas/section-matrix.schema.json +3 -2
  63. package/spur.js +24403 -32459
  64. package/web/_astro/{BoardApp.5IIl2O-z.js → BoardApp.Niubpe6z.js} +1 -1
  65. package/web/_astro/{BoardApp.Drnx-KeM.js → BoardApp.hF0RAIrg.js} +112 -112
  66. package/web/_astro/TaskDetail.DJpapt38.js +1 -0
  67. package/web/_astro/{arc.j2EVkYVd.js → arc.BgKcK0i8.js} +1 -1
  68. package/web/_astro/{architectureDiagram-3BPJPVTR.DZWSFqEG.js → architectureDiagram-3BPJPVTR.ChP-Ig0V.js} +1 -1
  69. package/web/_astro/{blockDiagram-GPEHLZMM.DE6GpXCN.js → blockDiagram-GPEHLZMM.BVaCBoeN.js} +1 -1
  70. package/web/_astro/{c4Diagram-AAUBKEIU.DoVR1G6B.js → c4Diagram-AAUBKEIU.CHSDpEO5.js} +1 -1
  71. package/web/_astro/channel.DkpvN2tD.js +1 -0
  72. package/web/_astro/{chunk-2J33WTMH.Do6-Gbyf.js → chunk-2J33WTMH.MYRcYVRa.js} +1 -1
  73. package/web/_astro/{chunk-4BX2VUAB.BYV1HGHx.js → chunk-4BX2VUAB.S5j22Zqa.js} +1 -1
  74. package/web/_astro/{chunk-55IACEB6.CvI1zkrc.js → chunk-55IACEB6.gciRPvmZ.js} +1 -1
  75. package/web/_astro/{chunk-727SXJPM.DNGSCRlX.js → chunk-727SXJPM.CdqrSQkX.js} +1 -1
  76. package/web/_astro/{chunk-AQP2D5EJ.DXhhgT5z.js → chunk-AQP2D5EJ.CyokdHT3.js} +1 -1
  77. package/web/_astro/{chunk-FMBD7UC4.dzkRKP2u.js → chunk-FMBD7UC4.Bg9KJhjW.js} +1 -1
  78. package/web/_astro/{chunk-ND2GUHAM.DujGLeEf.js → chunk-ND2GUHAM.1gxxI-vD.js} +1 -1
  79. package/web/_astro/{chunk-QZHKN3VN.BWtIT3ZU.js → chunk-QZHKN3VN.DDEYtCKU.js} +1 -1
  80. package/web/_astro/{classDiagram-4FO5ZUOK.DyApg0Nn.js → classDiagram-4FO5ZUOK.Ch3zi37T.js} +1 -1
  81. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DyApg0Nn.js → classDiagram-v2-Q7XG4LA2.Ch3zi37T.js} +1 -1
  82. package/web/_astro/{cose-bilkent-S5V4N54A.DJQB-u_l.js → cose-bilkent-S5V4N54A.D2q5AINI.js} +1 -1
  83. package/web/_astro/{cynefin-OW5HDTMX.bi3D_siV.js → cynefin-OW5HDTMX.BA9kC2YT.js} +1 -1
  84. package/web/_astro/{dagre-BM42HDAG.C-f7TrRg.js → dagre-BM42HDAG.CHO08nRp.js} +1 -1
  85. package/web/_astro/{diagram-2AECGRRQ.DrPfjHQB.js → diagram-2AECGRRQ.BfFQt0LW.js} +1 -1
  86. package/web/_astro/{diagram-5GNKFQAL.C9S4WUHO.js → diagram-5GNKFQAL.CHMwMTe4.js} +1 -1
  87. package/web/_astro/{diagram-KO2AKTUF.Dzzye8QH.js → diagram-KO2AKTUF.BJ-7gK-w.js} +1 -1
  88. package/web/_astro/{diagram-LMA3HP47.DX-LRiof.js → diagram-LMA3HP47.C5xqcc0t.js} +1 -1
  89. package/web/_astro/{diagram-OG6HWLK6.Z-kAKwIz.js → diagram-OG6HWLK6.C2pQjfrC.js} +1 -1
  90. package/web/_astro/{erDiagram-TEJ5UH35.D6dyClSv.js → erDiagram-TEJ5UH35._FoNyxgC.js} +1 -1
  91. package/web/_astro/{flowDiagram-I6XJVG4X.Cx3q2cxD.js → flowDiagram-I6XJVG4X.B_ENkT2I.js} +1 -1
  92. package/web/_astro/{ganttDiagram-6RSMTGT7.DU3gH6CT.js → ganttDiagram-6RSMTGT7.B3q8h77C.js} +1 -1
  93. package/web/_astro/{gitGraphDiagram-PVQCEYII.ISmCnJ87.js → gitGraphDiagram-PVQCEYII.QWZFDboZ.js} +1 -1
  94. package/web/_astro/index.BFyW13JJ.css +1 -0
  95. package/web/_astro/{infoDiagram-5YYISTIA.DR6_iNOK.js → infoDiagram-5YYISTIA.Cs6eEc92.js} +1 -1
  96. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js → ishikawaDiagram-YF4QCWOH.BU9DJMHA.js} +1 -1
  97. package/web/_astro/{journeyDiagram-JHISSGLW.DkP9-WK8.js → journeyDiagram-JHISSGLW.D35k6Jpe.js} +1 -1
  98. package/web/_astro/{kanban-definition-UN3LZRKU.wtgY98M2.js → kanban-definition-UN3LZRKU.DBqcAT4m.js} +1 -1
  99. package/web/_astro/{linear.CI6djNi7.js → linear.D-LSNK8W.js} +1 -1
  100. package/web/_astro/{mermaid.core.CuQPxS8b.js → mermaid.core.CSruWVOa.js} +4 -4
  101. package/web/_astro/{mindmap-definition-RKZ34NQL.5HNIEG7R.js → mindmap-definition-RKZ34NQL.BiFaUsfj.js} +1 -1
  102. package/web/_astro/{pieDiagram-4H26LBE5.CchhDFjE.js → pieDiagram-4H26LBE5.D1KTKqb9.js} +1 -1
  103. package/web/_astro/{quadrantDiagram-W4KKPZXB.PYXXJPSJ.js → quadrantDiagram-W4KKPZXB.DBHflsMG.js} +1 -1
  104. package/web/_astro/{requirementDiagram-4Y6WPE33.cUQuNAKU.js → requirementDiagram-4Y6WPE33.hwX9CNdk.js} +1 -1
  105. package/web/_astro/{sankeyDiagram-5OEKKPKP.BO7MnRIA.js → sankeyDiagram-5OEKKPKP.DkI8mJiE.js} +1 -1
  106. package/web/_astro/{sequenceDiagram-3UESZ5HK.D9bElyD6.js → sequenceDiagram-3UESZ5HK.DMz7jBDx.js} +1 -1
  107. package/web/_astro/{stateDiagram-AJRCARHV.DhGdRz7I.js → stateDiagram-AJRCARHV.B6Ef2xJ1.js} +1 -1
  108. package/web/_astro/{stateDiagram-v2-BHNVJYJU.5GvLeAoL.js → stateDiagram-v2-BHNVJYJU.CgoaufB9.js} +1 -1
  109. package/web/_astro/{timeline-definition-PNZ67QCA.LtAT9haM.js → timeline-definition-PNZ67QCA.B3c8h1t-.js} +1 -1
  110. package/web/_astro/{vennDiagram-CIIHVFJN.DRth1yLA.js → vennDiagram-CIIHVFJN.BdHPAxAb.js} +1 -1
  111. package/web/_astro/{wardleyDiagram-YWT4CUSO.h9MlZfcr.js → wardleyDiagram-YWT4CUSO.BrJXPPAj.js} +1 -1
  112. package/web/_astro/{xychartDiagram-2RQKCTM6.DHqy9DYA.js → xychartDiagram-2RQKCTM6.CMH5yFsV.js} +1 -1
  113. package/web/index.html +2 -2
  114. package/web/spur_logo.svg +1 -1
  115. package/web/_astro/TaskDetail.Ci4LNn9S.js +0 -1
  116. package/web/_astro/channel.DmdDxGsq.js +0 -1
  117. package/web/_astro/index.Do2lLdgo.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.4.3",
10
+ "version": "0.4.4",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -0,0 +1,68 @@
1
+ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
+ # Verdict-confidence rules (report corpus) — a committed verification record that states
3
+ # a machine `Verdict:` line must also state the verifier's confidence, so a reader can
4
+ # tell a PASS the verifier stands behind from one it would not.
5
+ #
6
+ # Contract owners: `Confidence: HIGH|MEDIUM|LOW` is specified for verify answers by
7
+ # plugins/sp/skills/code-verification/SKILL.md (one `Verdict: PASS|PARTIAL|FAIL` line, one
8
+ # `Confidence:` line, then the traceability tables) and for review reports by
9
+ # plugins/sp/agents/super-reviewer.md. Both are already enforced for pipeline answers —
10
+ # packages/app/src/services/verify-answer-lint.ts (`confidence-missing`,
11
+ # `confidence-value`, and the coherence pair `confidence-unwarranted` /
12
+ # `confidence-understated`) plus the verify stamp in config/workflows/task-pipeline.yaml —
13
+ # but no rule read the standalone report documents agents commit under `docs/`. This file
14
+ # is that backstop: the same three-level vocabulary, checked at the document level.
15
+ #
16
+ # Shape: one file-spanning forbidden match (`multiline: true` hands the evaluator the whole
17
+ # document and the negative lookahead spans the newline) instead of line counting. The
18
+ # lookahead demands a valid level, so a hedge (`Confidence: mostly`) reads as missing too.
19
+ # The verdict prefix requires the closed `PASS|PARTIAL|FAIL` value on its own line, which is
20
+ # what separates a record from prose: docs/reports/i31/0912-workflow-baseline.md:84 and
21
+ # i31/1107-runall-p1-pilot.md:9 both open a bolded *conclusion* sentence
22
+ # ("**Verdict: `partial — INSUFFICIENT_EVIDENCE retained`.**") and are not this contract.
23
+ #
24
+ # Severity `info`, and deliberately not in a preset — the same calibration choice the `docs`
25
+ # category makes for sourced claims: findings surface for review without reddening gates
26
+ # (`recommended-pre-check` runs `--fail-on warning`). To promote it, add `- docs` to that
27
+ # preset's `extends` once the residual is triaged.
28
+ #
29
+ # Calibration (2026-10-13, `spur rule run --file config/rules/docs/verdict-confidence.yaml
30
+ # --json`, unsuppressed): 3 findings over the 91 documents the include globs matched at that
31
+ # timestamp (29 under docs/reports/, 62 under docs/plans/), all three the hole this closes —
32
+ # docs/reports/2026-09-12-i21-verifyall.md:3,
33
+ # docs/reports/2026-10-01-E71-force-verification.md:3 and
34
+ # docs/reports/g61-verifyall-2026-09-12.md:3 each open `Verdict: PASS` and state no
35
+ # confidence level anywhere in the document. They stay visible rather than suppressed:
36
+ # retro-fitting a level into a historical record would invent the verifier's own claim.
37
+ # Both directions were controlled in the same run: a scratch report holding
38
+ # `Verdict: PASS` + `Confidence: HIGH` is not flagged, and the same file with
39
+ # `Confidence: mostly` is.
40
+ #
41
+ # Include is deliberately the report corpus. `docs/plans/*brainstorm*.md` states confidence
42
+ # as prose with its rationale (`**Confidence: HIGH.** All primitives … are verified present`,
43
+ # 61 such lines across 18 plans) — a different, human-facing contract that a
44
+ # level-only vocabulary check would drown in false positives, and those plans carry no
45
+ # machine verdict line to anchor on.
46
+ include:
47
+ - "docs/reports/**/*.md"
48
+ - "docs/plans/**/*.md"
49
+ exclude:
50
+ - "docs/tasks*/**"
51
+ rules:
52
+ - id: verdict-line-confidence-missing
53
+ description: >
54
+ A committed verification record that asserts a machine verdict line
55
+ (`Verdict: PASS|PARTIAL|FAIL`) must follow it with the verifier's confidence level —
56
+ `Confidence: HIGH|MEDIUM|LOW` — so a reader can tell a verdict the verifier stands
57
+ behind from one it would not. Contract in sp-code-verification (verify answers) and
58
+ sp-super-reviewer (review reports); a missing level is a lint failure for pipeline
59
+ answers (`confidence-missing`), and this rule is the backstop for the reports those
60
+ surfaces do not read.
61
+ severity: info
62
+ evaluator:
63
+ type: regex
64
+ config:
65
+ mode: forbid
66
+ multiline: true
67
+ flags: "i"
68
+ pattern: "^[ \\t]*\\**Verdict\\**:\\**[ \\t]*(?:PASS|PARTIAL|FAIL)\\**[ \\t]*\\n(?:[ \\t]*\\n)*(?![ \\t]*\\**Confidence\\**:\\**[ \\t]*\\**(?:HIGH|MEDIUM|LOW)\\**[ \\t]*\\.?[ \\t]*$)"
@@ -1,5 +1,18 @@
1
1
  $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
2
  # Coverage gate — per-file line coverage meets threshold from Bun's lcov output.
3
+ #
4
+ # PROVENANCE (task 1203): since task 1203 the repository post-check scripts
5
+ # (`test-post-check`, `test-post-check:full`) validate canonical coverage
6
+ # certification BEFORE this rule evaluates: only a completed successful canonical
7
+ # full-suite run (`bun run test`, `test:coverage`, `test:full`) certifies
8
+ # .coverage/lcov.info (marker: .coverage/coverage-certification.json, written by
9
+ # scripts/commands/run-tests.ts --publish-coverage). Missing/pending/superseded/
10
+ # stale-tree/byte-mismatched artifacts fail the post-check with a
11
+ # `coverage-artifact:` diagnostic before per-file findings; recovery is rerunning
12
+ # `bun run test:full`. Running this rule directly via `spur rule run` outside the
13
+ # repository wrapper bypasses that certification wrapper and is outside this
14
+ # repository's certification contract. This rule and its evaluator are unchanged.
15
+ #
3
16
  # Absorbed from ts-libs/.spur/rules/quality/coverage-gate.yaml, re-scoped to
4
17
  # Spur's monorepo layout:
5
18
  # - lcovPath kept at .coverage/lcov.info (Spur's `bun run test:coverage`
@@ -8,8 +8,12 @@ $schema: "@gobing-ai/spur/schemas/preset.schema.json"
8
8
  # post-check alongside coverage-gate.
9
9
  #
10
10
  # TEMPORARY (2026-10-08): `docs` removed from extends to unblock the gate —
11
- # restore it (add `- docs` back) once sourced-api-claims finding noise is
12
- # triaged. Recapture the raw-json-baseline fixtures in the same change.
11
+ # restore it (add `- docs` back) once sourcing-claim finding noise is triaged.
12
+ # The category now holds two files and both residuals must be triaged first:
13
+ # `docs/sourced-api-claims.yaml` (advisory citation/level checks on claim lines) and
14
+ # `docs/verdict-confidence.yaml` (a machine `Verdict:` report must state its
15
+ # HIGH/MEDIUM/LOW level; 3 historical reports under docs/reports/ predate the
16
+ # contract). Recapture the raw-json-baseline fixtures in the same change.
13
17
  name: recommended-pre-check
14
18
  extends:
15
19
  - typescript
@@ -70,6 +70,7 @@ rules:
70
70
  - "packages/app/src/services/token-ledger-service.ts" # FD byte-window log tailing
71
71
  - "packages/app/src/services/token-ledger-watcher.ts" # node:fs watch() live watcher
72
72
  - "packages/app/src/services/project-registry.ts" # atomic projects.json persistence
73
+ - "packages/app/src/services/project-process.ts" # port/pid probes moved verbatim out of project-registry.ts to break the registry↔stop import cycle (same exemption)
73
74
  - "packages/app/src/services/project-server-owner.ts" # atomic mkdir lifetime claim + unique-marker stale recovery; FileSystem has no exclusive mkdir primitive (1082)
74
75
  - "packages/app/src/services/slash-commands-service.ts" # synchronous ~/.config/spur/slash_commands.json persistence (mirrors project-registry.ts)
75
76
  - "packages/app/src/services/agent-usage-producer.ts" # atomic agent-usage snapshot write (tmp + rename, mirrors project-registry.ts; task 0892 R1)
@@ -82,6 +83,7 @@ rules:
82
83
  - "packages/app/src/services/quality-gate.ts" # gate artifacts (log/findings/receipt) written directly; merged-fd gate log and fsync-free atomic writes must stay byte-stable; bundled standalone for the bare-node plugin twin (task 1006 R1; mirrors history-anatomy.ts)
83
84
  - "packages/app/src/workflow/feature-verification-run.ts" # the pass opens the run's single merged log fd (`openSync(path,'a')`) and mkdirs the run dir beside the receipt writer, exactly as the plugin entry did before the move; the fd cannot be expressed through the FileSystem seam (task 1176 R2; same class as the quality-gate exemption above)
84
85
  - "packages/app/src/services/run-storage.ts" # durable-evidence migration core (task 1025 R4): atomic tmp+rename byte copies with digest reread and atomic manifest publish must stay byte-stable (mirrors agent-usage-producer.ts / project-registry.ts exemptions)
86
+ - "packages/app/src/services/durable-plane-ignore.ts" # .git/info/exclude append moved verbatim out of run-storage.ts to break an import cycle (same exemption)
85
87
 
86
88
  # Electron Node adapters cannot load Bun runtime implementations; keep the
87
89
  # synchronous existence/directory probes injected for unit testing (desktop contract).
@@ -91,6 +93,7 @@ rules:
91
93
  # Synchronous bootstrap & path resolution:
92
94
  - "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
93
95
  - "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
96
+ - "packages/config/src/config-layers.ts" # sync resolveConfigLayers() existence probes moved verbatim out of loader.ts to break the loader↔executor-update cycle (same exemption)
94
97
  - "packages/config/src/executor-update.ts" # atomic single-entry config update (task 0797): O_EXCL lock, fsync'd tmp+rename commit, lstat symlink refusal, mode preservation — ts-runtime FileSystem seam has no lstat/fsync/chmod/O_EXCL
95
98
  - "packages/app/src/services/project-start.ts" # sync CLI binary path checks before daemon spawn
96
99
  - "apps/cli/src/commands/serve.ts" # sync resolveServeCwd() directory validation before server startup (task 0805 R2); mirrors task.ts sync-template exemption
@@ -10,9 +10,7 @@ include:
10
10
  - "apps/cli/src/commands/*.ts"
11
11
 
12
12
  exclude:
13
- # Not command files: stubs.ts is an empty module shim (consistency.test.ts
14
- # excludes it too); shared-options.ts is the option registry.
15
- - "apps/cli/src/commands/stubs.ts"
13
+ # Not a command file: shared-options.ts is the option registry.
16
14
  - "apps/cli/src/commands/shared-options.ts"
17
15
 
18
16
  rules:
@@ -147,6 +147,13 @@ _(Fill from package manifests / README — or during `sp:doc-evolve` customize.)
147
147
  **Done gate (minimum):** lint + tests clean; only intentional `git status` changes; no
148
148
  `--no-verify` / silent suppressions. Harness task done ⇒ real verify **PASS** when the pipeline ran.
149
149
 
150
+ **Gate scope:** the gate verifies code changes. Scribe commands — `/sp:dev-gitmsg`,
151
+ `/sp:dev-changelog`, `/sp:dev-handover`, `/sp:dev-job-dump` — produce text or a commit and run no
152
+ gate (lint, typecheck, tests) unless asked: `gitmsg --check <cmd>`, or `/sp:dev-gtd --no-push` for
153
+ gate → fix → commit. Commands that own a gate (`dev-run`, `dev-runall`, `dev-fixall`, `dev-gtd`,
154
+ `dev-fixgha`, `dev-unit`, `--check` loops) run exactly what their contract names — no extra
155
+ completion-gate pass on top.
156
+
150
157
  ---
151
158
 
152
159
  ## Spur CLI surface
@@ -51,6 +51,14 @@ vars:
51
51
  featureId: "X"
52
52
  spurBin: "spur"
53
53
  verificationCmd: "bun run spur-check-feature"
54
+ # Operator-declared confidence level; empty derives it from the pass (HIGH when the selected
55
+ # definition's own command exited 0 with an unchanged proof-input digest, MEDIUM under a caller
56
+ # `--cmd` override, LOW otherwise). The completion boundary refuses a PASS carrying no level or
57
+ # LOW unless the receipt records the acknowledgement below.
58
+ confidence: ""
59
+ # Operator acknowledgement of a LOW level. It rides the receipt, so the transition reads it from
60
+ # the evidence rather than from whatever flags a later command happens to pass.
61
+ ackLowConfidence: "false"
54
62
  __runId: ""
55
63
 
56
64
  states:
@@ -70,7 +78,7 @@ states:
70
78
  - kind: shell
71
79
  options:
72
80
  command: >-
73
- mkdir -p .spur/run; eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/feature-verification-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/feature-verification-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; [ -f "$S" ] && "$RUNNER" "$S" verify --feature-id "$featureId" --run-id "$__runId" --spur-bin "$spurBin" || printf 'FAIL feature-verification failed closed — script not found — run superskill install sp --marketplace gobing-ai/spur\n' > ".spur/run/$__runId-feature-verification.status"; exit 0
81
+ mkdir -p .spur/run; eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/feature-verification-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/feature-verification-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; ACK=""; [ "$ackLowConfidence" = "true" ] && ACK="--ack-low-confidence"; [ -f "$S" ] && "$RUNNER" "$S" verify --feature-id "$featureId" --run-id "$__runId" --spur-bin "$spurBin" --confidence "$confidence" $ACK || printf 'FAIL feature-verification failed closed — script not found — run superskill install sp --marketplace gobing-ai/spur\n' > ".spur/run/$__runId-feature-verification.status"; exit 0
74
82
 
75
83
  - id: done
76
84
  description: Terminal — repo-wide checks passed and the receipt is bound.
@@ -64,6 +64,11 @@ states:
64
64
  Completed. Re-enterable (reopen with warning + mandatory History entry).
65
65
  - id: cancelled
66
66
  description: Terminal — abandoned.
67
+ - id: deprecated
68
+ description: >
69
+ Retained and frozen (ADR-137). Non-terminal: the record stays readable and
70
+ countable, nothing new may attach to it, and leaving it is explicit —
71
+ un-deprecate to todo, or cancelled once the task is removed.
67
72
 
68
73
  transitions:
69
74
  # Forward path: backlog → todo → wip → testing → done
@@ -157,3 +162,48 @@ transitions:
157
162
  description: Cancel task
158
163
  guard:
159
164
  kind: always
165
+
166
+ # Deprecate: any non-terminal-or-done state → deprecated (frozen, retained — ADR-137)
167
+ - from: backlog
168
+ to: deprecated
169
+ description: Deprecate task (frozen, retained)
170
+ guard:
171
+ kind: always
172
+ - from: todo
173
+ to: deprecated
174
+ description: Deprecate task (frozen, retained)
175
+ guard:
176
+ kind: always
177
+ - from: wip
178
+ to: deprecated
179
+ description: Deprecate task (frozen, retained)
180
+ guard:
181
+ kind: always
182
+ - from: testing
183
+ to: deprecated
184
+ description: Deprecate task (frozen, retained)
185
+ guard:
186
+ kind: always
187
+ - from: blocked
188
+ to: deprecated
189
+ description: Deprecate task (frozen, retained)
190
+ guard:
191
+ kind: always
192
+ - from: done
193
+ to: deprecated
194
+ description: Deprecate task (frozen, retained)
195
+ guard:
196
+ kind: always
197
+
198
+ # Exits out of deprecated: un-deprecate or remove only. Any other edge is
199
+ # undeclared and refused by the graph (ADR-135).
200
+ - from: deprecated
201
+ to: todo
202
+ description: Un-deprecate (mandatory History entry)
203
+ guard:
204
+ kind: always
205
+ - from: deprecated
206
+ to: cancelled
207
+ description: Remove deprecated task
208
+ guard:
209
+ kind: always
@@ -1312,11 +1312,16 @@ transitions:
1312
1312
  # re-enters quality → review → verify on a fresh digest. Before 1088 a FAIL review had no
1313
1313
  # outgoing edge at all; before 1122 a PASS-with-findings cost a full re-certification cycle per
1314
1314
  # attempt (knowledge-kit 0210/0213). The reviewer writes `Verdict: PASS|FAIL` in its answer;
1315
- # both plain and bold forms are accepted. Under `profile=auto` the approve gate is skipped, so
1316
- # the PASS+auto edge is tried first and the interactive PASS edge second.
1315
+ # both plain and bold forms are accepted. Since 1204 a PASS must also be GRADED: the reviewer
1316
+ # states `Confidence: HIGH|MEDIUM|LOW` (verify-chain semantics, 1068), HIGH/MEDIUM cross the
1317
+ # PASS edges unadorned, and LOW or an absent line needs the operator's `ackLowConfidence` —
1318
+ # otherwise the PASS falls to the catch-all like any other verdict the reviewer would not stand
1319
+ # behind (same policy as the verify confidence gate). Review stays advisory: verify certifies.
1320
+ # Under `profile=auto` the approve gate is skipped, so the PASS+auto edge is tried first and the
1321
+ # interactive PASS edge second.
1317
1322
  - from: review
1318
1323
  to: verify
1319
- description: profile=auto, the review certified PASS, and no open P1-P3 review finding — skip the human approval gate.
1324
+ description: profile=auto, the review certified a HIGH/MEDIUM-confidence PASS (LOW/absent needs ackLowConfidence) with no open P1-P3 finding — skip the human approval gate.
1320
1325
  guard:
1321
1326
  kind: shell
1322
1327
  options:
@@ -1324,23 +1329,24 @@ transitions:
1324
1329
  test "$profile" = auto &&
1325
1330
  grep -qiE '^[[:space:]]*\**Verdict:\** *PASS' ".spur/run/$__runId-review-answer.txt" &&
1326
1331
  eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/residual-scan.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/residual-scan.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)" &&
1327
- [ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" >&2
1332
+ [ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" --review-answer ".spur/run/$__runId-review-answer.txt" >&2
1328
1333
  - from: review
1329
1334
  to: approve
1330
- description: Review certified PASS with no open P1-P3 review finding — gate on human approval before verification.
1335
+ description: Review certified a HIGH/MEDIUM-confidence PASS (LOW/absent needs ackLowConfidence) with no open P1-P3 finding — gate on human approval before verification.
1331
1336
  guard:
1332
1337
  kind: shell
1333
1338
  options:
1334
1339
  command: >-
1335
1340
  grep -qiE '^[[:space:]]*\**Verdict:\** *PASS' ".spur/run/$__runId-review-answer.txt" &&
1336
1341
  eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/residual-scan.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/residual-scan.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)" &&
1337
- [ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" >&2
1342
+ [ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" --review-answer ".spur/run/$__runId-review-answer.txt" >&2
1338
1343
  - from: review
1339
1344
  to: review-fail-triage
1340
1345
  description: >-
1341
- No certified PASS without an open P1-P3 finding (FAIL, PARTIAL, missing, unparseable, or
1342
- a PASS whose review-gate check found an open P1-P3 row — fail closed) — classify the
1343
- failure and route it into the bounded repair hop instead of dead-ending the run.
1346
+ No certified PASS without an open P1-P3 finding (FAIL, PARTIAL, missing, unparseable, a
1347
+ PASS whose review-gate check found an open P1-P3 row, or a PASS the reviewer graded below
1348
+ HIGH/MEDIUM — or left ungraded — without the operator's ackLowConfidence; fail closed) —
1349
+ classify the failure and route it into the bounded repair hop instead of dead-ending the run.
1344
1350
  guard:
1345
1351
  kind: always
1346
1352
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -57,15 +57,15 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@commander-js/extra-typings": "^14.0.0",
60
- "@gobing-ai/ts-db": "^0.5.24",
61
- "@gobing-ai/ts-ai-runner": "^0.5.24",
62
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.24",
63
- "@gobing-ai/ts-infra": "^0.5.24",
64
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.24",
65
- "@gobing-ai/ts-rule-engine": "^0.5.24",
66
- "@gobing-ai/ts-runtime": "^0.5.24",
67
- "@gobing-ai/ts-utils": "^0.5.24",
68
- "@types/bun": "1.3.14",
60
+ "@gobing-ai/ts-db": "^0.5.28",
61
+ "@gobing-ai/ts-ai-runner": "^0.5.28",
62
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.28",
63
+ "@gobing-ai/ts-infra": "^0.5.28",
64
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.28",
65
+ "@gobing-ai/ts-rule-engine": "^0.5.28",
66
+ "@gobing-ai/ts-runtime": "^0.5.28",
67
+ "@gobing-ai/ts-utils": "^0.5.28",
68
+ "@types/bun": "1.4.3",
69
69
  "@types/figlet": "^1.7.0",
70
70
  "@types/node-notifier": "8.0.5",
71
71
  "commander": "^14.0.3",
@@ -245,8 +245,11 @@ before it were never asked for a level, so pre-adoption artifacts read as debt,
245
245
  `residual-scan review-gate` reads the recorded `### Review` body, and a missing, duplicated or
246
246
  out-of-enum level becomes a **blocking** `review-contract` item — `review → verify` stops and the run
247
247
  enters `review-fail-triage` with the bounded repair hop, exactly as an open P1–P3 row does. The gate
248
- checks presence and vocabulary only: whether a level is *earned* stays a judgement call (see the
249
- earning rule above), so the report must still argue it.
248
+ checks the recorded section's presence and vocabulary; the same scanner grades the answer passed
249
+ by both PASS edges and refuses a `LOW` (or ungraded) PASS unless the operator sets
250
+ `ackLowConfidence` exactly to `true` (task 1204 — the same policy the verify
251
+ chain enforces), so whether a level is *earned* stays a judgement call (see the earning rule above):
252
+ the report must still argue it.
250
253
 
251
254
  **Source citations for external claims (one claim contract, 2026-10-12).** A Finding cell or a
252
255
  Functional Traceability `Evidence` cell that asserts an external API/library claim carries a
@@ -26,5 +26,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
26
26
 
27
27
  ## Implementation
28
28
 
29
- Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (lint, tests, `spur-check`, rules, citation checks).
29
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (`bun run gate`, lint, typecheck, tests, `spur-check`, rules, citation checks) — a generic "verify before finishing" rule does not apply here.
30
30
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Generate conventional commit message(s) from the current change set via one bounded gather call, optionally commit
3
3
  role: scribe
4
- argument-hint: "[--commit] [--squash] [--all] [--scope <path>]"
4
+ argument-hint: "[--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]"
5
5
  allowed-tools: ["Bash", "Read"]
6
6
  ---
7
7
 
@@ -17,12 +17,13 @@ Implements an inline procedure — see [dev-operations.md](../skills/spur-dev/re
17
17
  | `--squash` | Collapse every concern into one message and one commit; implies `--commit`. | off |
18
18
  | `--all` | Widen the change set past the index to every change in the tree — unstaged **and untracked**. | off |
19
19
  | `--scope` `<path>` | Path filter on the change set; always wins over change-set auto-discovery. | the whole change set |
20
+ | `--check` `<cmd>` | Run `<cmd>` (e.g. `"bun run gate"`) once before committing; non-zero → commit nothing. | off |
20
21
 
21
22
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
22
23
 
23
24
  ## Usage
24
25
 
25
- /sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>]
26
+ /sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]
26
27
 
27
28
  ## Implementation
28
29
 
@@ -35,3 +36,6 @@ commit per concern, split automatically, so the operator is never asked to re-st
35
36
  `--squash` → one commit for everything. An empty index widens to the whole tree only on a
36
37
  message-only run, and says so; a committing run stops there and prints the exact `--all` re-run line
37
38
  instead of guessing.
39
+ No quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`) runs unless `--check <cmd>`
40
+ names one — then it runs once, before any commit, and a failure commits nothing. Gate → auto-fix →
41
+ commit is `/sp:dev-gtd --no-push`.
@@ -24,4 +24,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
24
24
  ## Implementation
25
25
 
26
26
  Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#11-handover) (handover).
27
+ Run no quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`); cite results already on record.
27
28
 
@@ -24,6 +24,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
24
24
  ## Implementation
25
25
 
26
26
  Follow [job-dump](../skills/spur-dev/references/dev-operations.md#11a-job-dump), using the shared
27
- handoff template to capture the current job and its remaining work.
27
+ handoff template to capture the current job and its remaining work. Run no quality gate
28
+ (`bun run gate`, lint, typecheck, tests, `spur-check`); copy existing gate results or write `not run`.
28
29
 
29
30
  Skill(skill="sp:spur-dev", args="job-dump $ARGUMENTS")
@@ -18,6 +18,14 @@ Wraps the **sp:spur-dev** skill. Three jobs:
18
18
  `standard` checks only that target sections are structurally complete. It never re-checks what
19
19
  they say. Use `ready` whenever the existing content itself is in doubt.
20
20
 
21
+ **Refine never writes `feature_id`.** It may *report* an orphan task in its result, but linking a
22
+ task to a feature is an operator decision with a lifecycle blast radius: `spur task update <wbs>
23
+ --feature <id>` reopens a `verifying` parent unless `--no-reopen` is passed. Route linking through
24
+ the opt-in [feature-link helper](../skills/spur-dev/references/feature-link-helper.md) (never
25
+ gate-time, never automatic, always confirmed) — observed 2026-10-13: the ready-preparation refine
26
+ that `spur task create` dispatches by default linked a fresh task to `P1` on its own and demoted
27
+ that feature `verifying → active`.
28
+
21
29
  ## Argument Flags
22
30
 
23
31
  | Flag | Description | Default |
@@ -47,9 +55,13 @@ implement without inventing design:
47
55
  1. Audit every existing claim against the current tree: facts, cited sources, fix soundness across
48
56
  all callers, test observability, environment, concurrent work, and scope.
49
57
  2. Correct what is wrong and record each change in a dated `**Refine corrections (<date>)**` block
50
- in Background.
58
+ in Background. When the task bundles several issues, triage each one. An issue that is invalid,
59
+ already fixed or owned elsewhere is removed together with its R-items, Design/Solution notes,
60
+ Plan steps and ACs. If no issue stays valid, cancel the task (`spur task update <wbs> cancelled`)
61
+ and report `cancelled` instead of promoting it.
51
62
  3. Run `spur task check <wbs> --as todo --json`, fill unset priority/estimate, and promote
52
- `backlog → todo`.
63
+ `backlog → todo`. If triage dropped issues, re-estimate and record old → new. Also record a
64
+ title that still names dropped scope; the CLI cannot rename a task.
53
65
  4. Report checklist rows `{id, pass, evidence}`.
54
66
 
55
67
  Refine targets `backlog`/`todo` tasks; a `wip`-or-later task needs explicit operator consent and is
@@ -54,7 +54,13 @@ not a bug.
54
54
  **Depth:** default `standard` keeps the cheap L3 SKIP gate under `--auto`. Use
55
55
  `--depth ready` when handing a feature to another implementer (frozen Design/Requirements/Plan),
56
56
  or when the tasks' existing content is in doubt; thread `--depth` into each per-task refine. Ready
57
- report rows add corrections count, status before → after, and failed checklist ids.
57
+ report rows add corrections count, dropped issues, status before → after, and failed checklist ids.
58
+ Each task's issues are triaged one by one: invalid ones are dropped with their fixes, and a task
59
+ with no valid issue left is `cancelled`. The ready report also proposes merges between overlapping
60
+ tasks, ordering or a shared step for complementary ones, and owning features for tasks without a
61
+ `feature_id`. It executes neither unless
62
+ `--description` names the task and action, for example
63
+ `--description "cancel 0273 and merge its issues into 0269; link 0260 and 0274 to G11"`.
58
64
 
59
65
  > **`--next` dropped** (feature H8, 2026-07-31). Batch-level chaining was a token bomb — each refine
60
66
  > hop is an LLM call, and a large feature means N refine chains fanned out at once. For batch
@@ -43,6 +43,7 @@ Put the target first: a bare token after `--worktree` is read as the worktree na
43
43
  - **WBS mode (per task target):** `Skill(skill="sp:functional-review", args="<wbs> $FLAGS")` + `Skill(skill="sp:code-verification", args="review <wbs> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<wbs> $FLAGS")` (functional traceability + SECUA framework + architectural depth — each skill receives its one resolved WBS exactly once plus `$FLAGS` = `$ARGUMENTS` minus the selector (`--tasks`/`--feature`/`--scope` or positional) and its value, never the raw selector, and returns a review fragment only — F92 0593 R1)
44
44
  - **Task fan-out (`--tasks` / `--feature`).** One WBS-mode review per task in the frozen set. Tasks in `backlog`/`todo`/`blocked` are reported NOT-STARTED and skipped (§ 3a outcome vocabulary); a per-task failure does not stop the remaining tasks. Each implemented task gets its own merged `## Review`; the run ends with a combined summary table (WBS, verdict, P1/P2 counts).
45
45
  - Coordinator = this session. No `sp:super-reviewer` subagent is dispatched: act as the review coordinator defined in [agents/super-reviewer.md](../agents/super-reviewer.md) — merge the fragments per its Output Format (native `P1`–`P4` priority cells, section-relative headings) and, for every task target (standalone or pipeline), write that task's combined `## Review` via `spur task update <wbs> --section Review --from-file`. Path mode emits advisory output only.
46
+ - **Answer contract (pipeline dispatches).** The captured review answer (`.spur/run/<runId>-review-answer.txt`) must carry exactly one `Verdict: PASS|FAIL` line and exactly one `Confidence: HIGH|MEDIUM|LOW` line stating how strongly the review stands behind its verdict — HIGH = the reviewer re-executed the checks behind the verdict, MEDIUM = partial reliance on prior/external evidence, LOW = key evidence not re-executed. The pipeline's PASS edges admit HIGH/MEDIUM unadorned; LOW or an absent line crosses only with the operator's `ackLowConfidence` (same policy as the verify confidence gate, task 1068).
46
47
  - **Path mode (per path target):** `Skill(skill="sp:code-verification", args="review <path> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<path> $FLAGS")` (advisory SECUA quality + architectural depth — one normalized path forwarded once plus `$FLAGS`; performs no task mutation). Under `--scope <path>[,<path>]`: paths must exist (exit 2 otherwise), are normalized, duplicates dropped and nested paths collapse to the ancestor (`--scope apps,apps/cli` → `apps`); each surviving path gets a sub-review (Step 3p path scope), eligible for native-subagent dispatch per [dispatch-surface.md](../skills/parallel-execution/references/dispatch-surface.md); the coordinator merges the sub-reviews, runs **one** cross-path architecture pass (`sp:code-improvement` over the inter-path imports), and emits **one** advisory report. No task mutation.
47
48
  - **Positional alias (deprecated).** A positional `<wbs|path>` is accepted for one release: a `^\d{4}$` token with a resolvable task behaves as `--tasks <wbs>`; an existing path as `--scope <path>`; otherwise exit 2. Print a deprecation warning naming the replacement selector; removal is a follow-up.
48
49
  - `--triage`: after the review returns, run the triage protocol in [dev-operations.md § 2. review](../skills/spur-dev/references/dev-operations.md#2-review) **inline in this session** — the review skills and `sp:super-reviewer` stay report-only. With multiple targets, bucket the findings across all targets once (identical `file:line` findings deduped before bucketing). `Edit`/`Write` in `allowed-tools` exist only for these direct fixes.
@@ -669,23 +669,23 @@ function diffPorcelain(before, now, expects) {
669
669
  return [...porcelainPaths(now)].filter((p) => !beforePaths.has(p) && !expects.has(p)).sort();
670
670
  }
671
671
  export {
672
- validateSelector,
673
- stampReport,
674
- semanticArtifactDigest,
675
- resolvePaths,
676
- renderProvenanceFrontmatter,
677
- refreshReport,
678
- publishAtomically,
679
- probe,
680
- porcelainPaths,
681
- parseProvenance,
682
- logicDigest,
683
- importedSnapshotAsOf,
684
- diffPorcelain,
685
- decideCache,
686
- checkReportStructure,
687
- buildProvenance,
688
- bannerLine,
672
+ FINDING_FIELDS,
689
673
  REPORT_SECTIONS,
690
- FINDING_FIELDS
674
+ bannerLine,
675
+ buildProvenance,
676
+ checkReportStructure,
677
+ decideCache,
678
+ diffPorcelain,
679
+ importedSnapshotAsOf,
680
+ logicDigest,
681
+ parseProvenance,
682
+ porcelainPaths,
683
+ probe,
684
+ publishAtomically,
685
+ refreshReport,
686
+ renderProvenanceFrontmatter,
687
+ resolvePaths,
688
+ semanticArtifactDigest,
689
+ stampReport,
690
+ validateSelector
691
691
  };