shipwright-cli 2.3.0 → 2.4.0

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 (112) hide show
  1. package/README.md +82 -20
  2. package/config/policy.json +160 -2
  3. package/config/policy.schema.json +162 -1
  4. package/dashboard/public/index.html +1 -1
  5. package/dashboard/src/core/api.test.ts +362 -0
  6. package/dashboard/src/core/router.test.ts +266 -0
  7. package/dashboard/src/core/state.test.ts +235 -0
  8. package/dashboard/src/core/ws.test.ts +216 -0
  9. package/dashboard/src/design/icons.test.ts +105 -0
  10. package/dashboard/src/design/tokens.test.ts +204 -0
  11. package/dashboard/tsconfig.json +1 -1
  12. package/dashboard/vitest.config.ts +27 -0
  13. package/package.json +23 -4
  14. package/scripts/lib/pipeline-stages.sh +59 -0
  15. package/scripts/sw +1 -1
  16. package/scripts/sw-activity.sh +1 -1
  17. package/scripts/sw-adaptive.sh +1 -1
  18. package/scripts/sw-adversarial.sh +1 -1
  19. package/scripts/sw-architecture-enforcer.sh +1 -1
  20. package/scripts/sw-auth.sh +1 -1
  21. package/scripts/sw-autonomous.sh +230 -13
  22. package/scripts/sw-changelog.sh +1 -1
  23. package/scripts/sw-checkpoint.sh +1 -1
  24. package/scripts/sw-ci.sh +1 -1
  25. package/scripts/sw-cleanup.sh +1 -1
  26. package/scripts/sw-code-review.sh +1 -1
  27. package/scripts/sw-connect.sh +1 -1
  28. package/scripts/sw-context.sh +1 -1
  29. package/scripts/sw-cost.sh +1 -1
  30. package/scripts/sw-daemon.sh +1 -1
  31. package/scripts/sw-dashboard.sh +1 -1
  32. package/scripts/sw-db.sh +1 -1
  33. package/scripts/sw-decompose.sh +1 -1
  34. package/scripts/sw-deps.sh +1 -1
  35. package/scripts/sw-developer-simulation.sh +1 -1
  36. package/scripts/sw-discovery.sh +1 -1
  37. package/scripts/sw-doc-fleet.sh +1 -1
  38. package/scripts/sw-docs-agent.sh +1 -1
  39. package/scripts/sw-docs.sh +1 -1
  40. package/scripts/sw-doctor.sh +1 -1
  41. package/scripts/sw-dora.sh +1 -1
  42. package/scripts/sw-durable.sh +1 -1
  43. package/scripts/sw-e2e-orchestrator.sh +1 -1
  44. package/scripts/sw-eventbus.sh +1 -1
  45. package/scripts/sw-evidence.sh +664 -0
  46. package/scripts/sw-feedback.sh +1 -1
  47. package/scripts/sw-fix.sh +1 -1
  48. package/scripts/sw-fleet-discover.sh +1 -1
  49. package/scripts/sw-fleet-viz.sh +1 -1
  50. package/scripts/sw-fleet.sh +1 -1
  51. package/scripts/sw-github-app.sh +1 -1
  52. package/scripts/sw-github-checks.sh +1 -1
  53. package/scripts/sw-github-deploy.sh +1 -1
  54. package/scripts/sw-github-graphql.sh +1 -1
  55. package/scripts/sw-guild.sh +1 -1
  56. package/scripts/sw-heartbeat.sh +1 -1
  57. package/scripts/sw-hygiene.sh +1 -1
  58. package/scripts/sw-incident.sh +244 -1
  59. package/scripts/sw-init.sh +1 -1
  60. package/scripts/sw-instrument.sh +1 -1
  61. package/scripts/sw-intelligence.sh +1 -1
  62. package/scripts/sw-jira.sh +1 -1
  63. package/scripts/sw-launchd.sh +1 -1
  64. package/scripts/sw-linear.sh +1 -1
  65. package/scripts/sw-logs.sh +1 -1
  66. package/scripts/sw-loop.sh +1 -1
  67. package/scripts/sw-memory.sh +1 -1
  68. package/scripts/sw-mission-control.sh +1 -1
  69. package/scripts/sw-model-router.sh +1 -1
  70. package/scripts/sw-otel.sh +1 -1
  71. package/scripts/sw-oversight.sh +1 -1
  72. package/scripts/sw-pipeline-composer.sh +1 -1
  73. package/scripts/sw-pipeline-vitals.sh +1 -1
  74. package/scripts/sw-pipeline.sh +1 -1
  75. package/scripts/sw-pm.sh +1 -1
  76. package/scripts/sw-pr-lifecycle.sh +177 -5
  77. package/scripts/sw-predictive.sh +1 -1
  78. package/scripts/sw-prep.sh +1 -1
  79. package/scripts/sw-ps.sh +1 -1
  80. package/scripts/sw-public-dashboard.sh +1 -1
  81. package/scripts/sw-quality.sh +1 -1
  82. package/scripts/sw-reaper.sh +1 -1
  83. package/scripts/sw-regression.sh +1 -1
  84. package/scripts/sw-release-manager.sh +1 -1
  85. package/scripts/sw-release.sh +1 -1
  86. package/scripts/sw-remote.sh +1 -1
  87. package/scripts/sw-replay.sh +1 -1
  88. package/scripts/sw-retro.sh +4 -1
  89. package/scripts/sw-review-rerun.sh +220 -0
  90. package/scripts/sw-scale.sh +1 -1
  91. package/scripts/sw-security-audit.sh +1 -1
  92. package/scripts/sw-self-optimize.sh +99 -1
  93. package/scripts/sw-session.sh +1 -1
  94. package/scripts/sw-setup.sh +1 -1
  95. package/scripts/sw-standup.sh +1 -1
  96. package/scripts/sw-status.sh +1 -1
  97. package/scripts/sw-strategic.sh +1 -1
  98. package/scripts/sw-stream.sh +1 -1
  99. package/scripts/sw-swarm.sh +1 -1
  100. package/scripts/sw-team-stages.sh +1 -1
  101. package/scripts/sw-templates.sh +1 -1
  102. package/scripts/sw-testgen.sh +1 -1
  103. package/scripts/sw-tmux-pipeline.sh +1 -1
  104. package/scripts/sw-tmux.sh +1 -1
  105. package/scripts/sw-trace.sh +1 -1
  106. package/scripts/sw-tracker.sh +1 -1
  107. package/scripts/sw-triage.sh +198 -11
  108. package/scripts/sw-upgrade.sh +1 -1
  109. package/scripts/sw-ux.sh +1 -1
  110. package/scripts/sw-webhook.sh +1 -1
  111. package/scripts/sw-widgets.sh +1 -1
  112. package/scripts/sw-worktree.sh +1 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  <a href="https://github.com/sethdford/shipwright/actions/workflows/test.yml"><img src="https://github.com/sethdford/shipwright/actions/workflows/test.yml/badge.svg" alt="Tests"></a>
14
14
  <a href="https://github.com/sethdford/shipwright/actions/workflows/shipwright-pipeline.yml"><img src="https://github.com/sethdford/shipwright/actions/workflows/shipwright-pipeline.yml/badge.svg" alt="Pipeline"></a>
15
15
  <img src="https://img.shields.io/badge/tests-103_suites_passing-4ade80?style=flat-square" alt="103 suites">
16
- <img src="https://img.shields.io/badge/version-2.3.0-00d4ff?style=flat-square" alt="v2.3.0">
16
+ <img src="https://img.shields.io/badge/version-2.4.0-00d4ff?style=flat-square" alt="v2.4.0">
17
17
  <img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="MIT License">
18
18
  <img src="https://img.shields.io/badge/bash-3.2%2B-7c3aed?style=flat-square" alt="Bash 3.2+">
19
19
  </p>
@@ -23,7 +23,8 @@
23
23
  ## Table of Contents
24
24
 
25
25
  - [Shipwright Builds Itself](#shipwright-builds-itself)
26
- - [What's New in v2.3.0](#whats-new-in-v230)
26
+ - [Code Factory Pattern](#code-factory-pattern)
27
+ - [What's New in v2.4.0](#whats-new-in-v240)
27
28
  - [How It Works](#how-it-works)
28
29
  - [Install](#install)
29
30
  - [Quick Start](#quick-start)
@@ -46,18 +47,77 @@ This repo uses Shipwright to process its own issues. Label a GitHub issue with `
46
47
 
47
48
  ---
48
49
 
49
- ## What's New in v2.3.0
50
+ ## Code Factory Pattern
50
51
 
51
- **Docs & platform polish** doc-fleet, shared libs, policy schema, release infra:
52
+ Shipwright implements the complete **Code Factory** control-plane pattern — where agents write 100% of the code and the repo enforces deterministic, risk-aware checks before every merge. Every decision is traceable to policy. Every merge is backed by machine-verifiable evidence.
52
53
 
53
- - **Doc-fleet** — Five Cursor agents (doc-architect, claude-md, strategy-curator, pattern-writer, readme-optimizer) keep docs, strategy, and README in sync
54
- - **Pipeline lib split** `scripts/lib/pipeline-quality.sh`, `daemon-health.sh`, `policy.sh` for reuse and tests
55
- - **Policy schema** `config/policy.json` and `docs/config-policy.md` for hygiene, quality, and platform rules
56
- - **Release infra** npm, GitHub Releases (darwin/linux/windows), Homebrew tap; `scripts/build-release.sh` and `.github/workflows/release.yml` ship all platforms
54
+ ```
55
+ Agent writes code Risk policy gate → Tier-appropriate CI Code review agent
56
+ Findings auto-remediated SHA-validated evidence Bot threads cleaned Merge
57
+ Incidents feed back into harness coverage
58
+ ```
59
+
60
+ ### What makes Shipwright best-in-class
61
+
62
+ | Code Factory Layer | Shipwright Implementation |
63
+ | ---------------------- | ------------------------------------------------------------------------------------------------------- |
64
+ | **Single contract** | `config/policy.json` — risk tiers, merge policy, docs drift, evidence specs, harness SLAs in one file |
65
+ | **Preflight gate** | `risk-policy-gate.yml` classifies risk from changed files before expensive CI runs |
66
+ | **SHA discipline** | All checks, reviews, and approvals validated against current PR head — stale evidence is never trusted |
67
+ | **Rerun writer** | `sw-review-rerun.sh` — SHA-deduped, single canonical writer, no duplicate bot comments |
68
+ | **Remediation loop** | `review-remediation.yml` — agent reads findings, patches code, validates, pushes fix to same branch |
69
+ | **Bot thread cleanup** | `auto-resolve-threads.yml` — resolves bot-only threads after clean rerun, never touches human threads |
70
+ | **Evidence framework** | `sw-evidence.sh` — browser, API, database, CLI, webhook, and custom evidence with freshness enforcement |
71
+ | **Harness-gap loop** | `shipwright incident gap` — every regression creates a test case with SLA tracking |
72
+
73
+ ### Beyond the baseline
74
+
75
+ Shipwright extends the Code Factory pattern with capabilities most implementations don't have:
76
+
77
+ - **12-stage pipeline** with self-healing builds, adversarial review, and compound quality gates
78
+ - **Predictive risk scoring** using GitHub signals (security alerts, contributor expertise, file churn)
79
+ - **Persistent memory** — failure patterns, fix effectiveness, and prediction accuracy compound over time
80
+ - **18 autonomous agents** with specialized roles (PM, reviewer, security auditor, test generator, etc.)
81
+ - **Fleet operations** — the Code Factory pattern applied across every repo in your org
82
+ - **Cost intelligence** — per-pipeline cost tracking, budget enforcement, adaptive model routing
83
+ - **Self-optimization** — DORA metrics analysis auto-tunes daemon config and template weights
84
+
85
+ ```bash
86
+ # Evidence framework — capture and verify all types
87
+ npm run harness:evidence:capture # All collectors (browser, API, DB, CLI)
88
+ npm run harness:evidence:capture:api # API endpoints only
89
+ npm run harness:evidence:capture:cli # CLI commands only
90
+ npm run harness:evidence:capture:database # Database checks only
91
+ npm run harness:evidence:verify # Verify manifest + freshness
92
+ npm run harness:evidence:pre-pr # Capture + verify in one step
93
+
94
+ # Risk and policy
95
+ npm run harness:risk-tier
96
+
97
+ # Incident-to-harness loop
98
+ shipwright incident gap list
99
+ shipwright incident gap sla
100
+ ```
101
+
102
+ **[Full Code Factory documentation](https://sethdford.github.io/shipwright/guides/code-factory/)**
103
+
104
+ ---
105
+
106
+ ## What's New in v2.4.0
107
+
108
+ **Code Factory pattern** — deterministic, risk-aware agent delivery with machine-verifiable evidence:
109
+
110
+ - **Risk policy gate** — PR-level preflight classifies risk tier from changed files; blocks before expensive CI
111
+ - **SHA discipline** — All evidence validated against current PR head SHA; stale evidence never trusted
112
+ - **Evidence framework** — 6 collector types (browser, API, database, CLI, webhook, custom) with freshness enforcement
113
+ - **Review remediation** — Agent reads review findings, patches code, validates, pushes fix commit in-branch
114
+ - **Auto-resolve bot threads** — Bot-only PR threads cleaned up after clean rerun; human threads untouched
115
+ - **Harness-gap loop** — Every incident creates a test case requirement with SLA tracking (P0: 24h, P1: 72h)
116
+ - **Policy contract v2** — Risk tiers, merge policy, docs drift rules, evidence specs, harness SLAs in one file
57
117
 
58
- **v2.1.2**: AGI-level recruit `recruit match` / `team` / `route`, cross-system integration, 103 test suites in CI
118
+ **v2.3.1**: Autonomous feedback loops, testing foundation, chaos resilience
59
119
 
60
- **v2.1.0**: tmux visual overhaul role-colored borders, pipeline status widgets, active pane depth
120
+ **v2.3.0**: Fleet Command completeness overhaul + autonomous team oversight
61
121
 
62
122
  **v2.0.0**: 18 autonomous agents, 100+ CLI commands, intelligence layer, multi-repo fleet, local mode
63
123
 
@@ -408,16 +468,18 @@ shipwright templates list
408
468
 
409
469
  ## Configuration
410
470
 
411
- | File | Purpose |
412
- | ----------------------------- | -------------------------------------------------- |
413
- | `.claude/daemon-config.json` | Daemon settings, intelligence flags, patrol config |
414
- | `.claude/pipeline-state.md` | Current pipeline state |
415
- | `templates/pipelines/*.json` | 8 pipeline template definitions |
416
- | `tmux/templates/*.json` | 24 team composition templates |
417
- | `~/.shipwright/events.jsonl` | Event log for metrics |
418
- | `~/.shipwright/costs.json` | Cost tracking data |
419
- | `~/.shipwright/budget.json` | Budget limits |
420
- | `~/.shipwright/github-cache/` | Cached GitHub API responses |
471
+ | File | Purpose |
472
+ | ----------------------------- | ------------------------------------------------------------------------------------------- |
473
+ | `config/policy.json` | **Central contract** — risk tiers, merge policy, docs drift, browser evidence, harness SLAs |
474
+ | `config/policy.schema.json` | JSON Schema validation for the policy contract |
475
+ | `.claude/daemon-config.json` | Daemon settings, intelligence flags, patrol config |
476
+ | `.claude/pipeline-state.md` | Current pipeline state |
477
+ | `templates/pipelines/*.json` | 8 pipeline template definitions |
478
+ | `tmux/templates/*.json` | 24 team composition templates |
479
+ | `~/.shipwright/events.jsonl` | Event log for metrics |
480
+ | `~/.shipwright/costs.json` | Cost tracking data |
481
+ | `~/.shipwright/budget.json` | Budget limits |
482
+ | `~/.shipwright/github-cache/` | Cached GitHub API responses |
421
483
 
422
484
  ## Prerequisites
423
485
 
@@ -1,7 +1,165 @@
1
1
  {
2
2
  "$schema": "https://shipwright.dev/schemas/policy-v1.json",
3
- "description": "Central policy for Shipwright — timeouts, limits, thresholds. Prefer adaptive/learned overrides when available.",
4
- "version": "1",
3
+ "description": "Central policy for Shipwright — timeouts, limits, thresholds, risk tiers, merge gates. Single source of truth for the Code Factory pattern.",
4
+ "version": "2",
5
+ "riskTierRules": {
6
+ "critical": [
7
+ "config/policy.json",
8
+ "config/policy.schema.json",
9
+ ".github/workflows/**",
10
+ ".claude/hooks/**",
11
+ "scripts/lib/policy.sh"
12
+ ],
13
+ "high": [
14
+ "scripts/sw-pipeline.sh",
15
+ "scripts/sw-daemon.sh",
16
+ "scripts/sw-pr-lifecycle.sh",
17
+ "scripts/sw-incident.sh",
18
+ "scripts/sw-security-audit.sh",
19
+ "scripts/sw-github-checks.sh",
20
+ "scripts/sw-github-graphql.sh",
21
+ "scripts/sw-github-deploy.sh",
22
+ "scripts/lib/pipeline-stages.sh",
23
+ "scripts/lib/pipeline-quality.sh",
24
+ "dashboard/server.ts"
25
+ ],
26
+ "medium": [
27
+ "scripts/sw-*.sh",
28
+ "scripts/lib/*.sh",
29
+ "dashboard/**",
30
+ "templates/pipelines/**"
31
+ ],
32
+ "low": ["docs/**", "website/**", "**/*.md", "**"]
33
+ },
34
+ "mergePolicy": {
35
+ "critical": {
36
+ "requiredChecks": [
37
+ "risk-policy-gate",
38
+ "tests",
39
+ "e2e-smoke",
40
+ "platform-health",
41
+ "code-review-agent"
42
+ ],
43
+ "requiredReviewers": 1,
44
+ "requiredEvidence": ["cli", "api"],
45
+ "requireDocsDriftCheck": true
46
+ },
47
+ "high": {
48
+ "requiredChecks": [
49
+ "risk-policy-gate",
50
+ "tests",
51
+ "e2e-smoke",
52
+ "code-review-agent"
53
+ ],
54
+ "requiredReviewers": 0,
55
+ "requiredEvidence": ["cli"],
56
+ "requireDocsDriftCheck": false
57
+ },
58
+ "medium": {
59
+ "requiredChecks": ["risk-policy-gate", "tests"],
60
+ "requiredReviewers": 0,
61
+ "requiredEvidence": [],
62
+ "requireDocsDriftCheck": false
63
+ },
64
+ "low": {
65
+ "requiredChecks": ["risk-policy-gate"],
66
+ "requiredReviewers": 0,
67
+ "requiredEvidence": [],
68
+ "requireDocsDriftCheck": false
69
+ }
70
+ },
71
+ "docsDriftRules": {
72
+ "trackedPairs": [
73
+ {
74
+ "source": "config/policy.json",
75
+ "docs": ["docs/config-policy.md", "README.md"]
76
+ },
77
+ {
78
+ "source": ".github/workflows/**",
79
+ "docs": ["docs/config-policy.md"]
80
+ },
81
+ {
82
+ "source": "scripts/sw-pipeline.sh",
83
+ "docs": ["website/src/content/docs/guides/pipeline.mdx"]
84
+ }
85
+ ],
86
+ "failOnDrift": false,
87
+ "warnOnDrift": true
88
+ },
89
+ "evidence": {
90
+ "artifactMaxAgeMinutes": 30,
91
+ "requireFreshArtifacts": true,
92
+ "collectors": [
93
+ {
94
+ "name": "dashboard-loads",
95
+ "type": "browser",
96
+ "entrypoint": "/",
97
+ "baseUrl": "http://localhost:3000",
98
+ "assertions": ["page-title-visible", "websocket-connected"]
99
+ },
100
+ {
101
+ "name": "pipeline-status",
102
+ "type": "browser",
103
+ "entrypoint": "/pipeline",
104
+ "baseUrl": "http://localhost:3000",
105
+ "assertions": ["stage-list-rendered", "progress-indicator-visible"]
106
+ },
107
+ {
108
+ "name": "dashboard-api-health",
109
+ "type": "api",
110
+ "method": "GET",
111
+ "url": "http://localhost:3000/api/health",
112
+ "expectedStatus": 200,
113
+ "assertions": ["status-ok", "response-has-version"]
114
+ },
115
+ {
116
+ "name": "dashboard-ws-connect",
117
+ "type": "api",
118
+ "method": "GET",
119
+ "url": "http://localhost:3000/api/ws-status",
120
+ "expectedStatus": 200,
121
+ "assertions": ["websocket-active"]
122
+ },
123
+ {
124
+ "name": "pipeline-cli-smoke",
125
+ "type": "cli",
126
+ "command": "bash scripts/sw-pipeline.sh status --json",
127
+ "expectedExitCode": 0,
128
+ "assertions": ["valid-json-output", "has-pipeline-state"]
129
+ },
130
+ {
131
+ "name": "policy-validation",
132
+ "type": "cli",
133
+ "command": "jq empty config/policy.json",
134
+ "expectedExitCode": 0,
135
+ "assertions": ["valid-json"]
136
+ },
137
+ {
138
+ "name": "db-schema-integrity",
139
+ "type": "database",
140
+ "command": "bash scripts/sw-db.sh check",
141
+ "expectedExitCode": 0,
142
+ "assertions": ["schema-valid", "migrations-current"]
143
+ }
144
+ ]
145
+ },
146
+ "harnessGapPolicy": {
147
+ "enabled": true,
148
+ "p0SlaHours": 24,
149
+ "p1SlaHours": 72,
150
+ "p2SlaHours": 168,
151
+ "autoCreateGapIssue": true,
152
+ "requireTestCaseBeforeClose": true
153
+ },
154
+ "codeReviewAgent": {
155
+ "provider": "internal",
156
+ "rerunMarker": "<!-- shipwright-review-rerun -->",
157
+ "timeoutMinutes": 20,
158
+ "treatVulnerabilityLanguageAsActionable": true,
159
+ "treatWeakConfidenceAsActionable": true,
160
+ "autoResolveBotsOnlyThreads": true,
161
+ "neverAutoResolveHumanThreads": true
162
+ },
5
163
  "daemon": {
6
164
  "poll_interval_seconds": 60,
7
165
  "health_heartbeat_timeout": 120,
@@ -1,13 +1,174 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "Shipwright Policy",
4
- "description": "Central policy for Shipwright — timeouts, limits, thresholds. Validated by CI platform-health workflow.",
4
+ "description": "Central policy for Shipwright — timeouts, limits, thresholds, risk tiers, merge gates. Single source of truth for the Code Factory pattern.",
5
5
  "type": "object",
6
6
  "required": ["version"],
7
7
  "properties": {
8
8
  "$schema": { "type": "string" },
9
9
  "description": { "type": "string" },
10
10
  "version": { "type": "string" },
11
+ "riskTierRules": {
12
+ "type": "object",
13
+ "description": "Path-based risk classification. Tiers: critical, high, medium, low. Glob patterns matched against changed files.",
14
+ "properties": {
15
+ "critical": { "type": "array", "items": { "type": "string" } },
16
+ "high": { "type": "array", "items": { "type": "string" } },
17
+ "medium": { "type": "array", "items": { "type": "string" } },
18
+ "low": { "type": "array", "items": { "type": "string" } }
19
+ },
20
+ "additionalProperties": false
21
+ },
22
+ "mergePolicy": {
23
+ "type": "object",
24
+ "description": "Required checks and evidence by risk tier before merge is allowed.",
25
+ "additionalProperties": {
26
+ "type": "object",
27
+ "properties": {
28
+ "requiredChecks": { "type": "array", "items": { "type": "string" } },
29
+ "requiredReviewers": { "type": "integer", "minimum": 0 },
30
+ "requiredEvidence": {
31
+ "type": "array",
32
+ "items": {
33
+ "type": "string",
34
+ "enum": ["browser", "api", "database", "cli", "webhook", "custom"]
35
+ },
36
+ "description": "Evidence types required before merge for this tier"
37
+ },
38
+ "requireDocsDriftCheck": { "type": "boolean" }
39
+ },
40
+ "additionalProperties": false
41
+ }
42
+ },
43
+ "docsDriftRules": {
44
+ "type": "object",
45
+ "description": "Detect when control-plane files change without corresponding doc updates.",
46
+ "properties": {
47
+ "trackedPairs": {
48
+ "type": "array",
49
+ "items": {
50
+ "type": "object",
51
+ "properties": {
52
+ "source": { "type": "string" },
53
+ "docs": { "type": "array", "items": { "type": "string" } }
54
+ },
55
+ "required": ["source", "docs"]
56
+ }
57
+ },
58
+ "failOnDrift": { "type": "boolean" },
59
+ "warnOnDrift": { "type": "boolean" }
60
+ },
61
+ "additionalProperties": false
62
+ },
63
+ "evidence": {
64
+ "type": "object",
65
+ "description": "Evidence framework — machine-verifiable proof for browser, API, database, CLI, and webhook changes. Each collector defines a type-specific verification strategy.",
66
+ "properties": {
67
+ "artifactMaxAgeMinutes": { "type": "integer", "minimum": 1 },
68
+ "requireFreshArtifacts": { "type": "boolean" },
69
+ "collectors": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "object",
73
+ "properties": {
74
+ "name": {
75
+ "type": "string",
76
+ "description": "Unique name for this evidence collector"
77
+ },
78
+ "type": {
79
+ "type": "string",
80
+ "enum": [
81
+ "browser",
82
+ "api",
83
+ "database",
84
+ "cli",
85
+ "webhook",
86
+ "custom"
87
+ ],
88
+ "description": "Evidence type: browser (HTTP page load), api (REST/GraphQL endpoint), database (schema/migration check), cli (command execution), webhook (callback verification), custom (user-defined script)"
89
+ },
90
+ "entrypoint": {
91
+ "type": "string",
92
+ "description": "URL path for browser evidence"
93
+ },
94
+ "baseUrl": {
95
+ "type": "string",
96
+ "description": "Base URL for browser/api evidence"
97
+ },
98
+ "url": {
99
+ "type": "string",
100
+ "description": "Full URL for api evidence"
101
+ },
102
+ "method": {
103
+ "type": "string",
104
+ "enum": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"],
105
+ "description": "HTTP method for api evidence"
106
+ },
107
+ "command": {
108
+ "type": "string",
109
+ "description": "Shell command for cli/database evidence"
110
+ },
111
+ "expectedStatus": {
112
+ "type": "integer",
113
+ "description": "Expected HTTP status code for api evidence"
114
+ },
115
+ "expectedExitCode": {
116
+ "type": "integer",
117
+ "description": "Expected exit code for cli/database evidence"
118
+ },
119
+ "headers": {
120
+ "type": "object",
121
+ "additionalProperties": { "type": "string" },
122
+ "description": "HTTP headers for api evidence"
123
+ },
124
+ "body": {
125
+ "type": "string",
126
+ "description": "Request body for api evidence"
127
+ },
128
+ "assertions": {
129
+ "type": "array",
130
+ "items": { "type": "string" },
131
+ "description": "Named assertions to validate"
132
+ },
133
+ "timeout": {
134
+ "type": "integer",
135
+ "minimum": 1,
136
+ "description": "Timeout in seconds for this collector"
137
+ }
138
+ },
139
+ "required": ["name", "type", "assertions"]
140
+ }
141
+ }
142
+ },
143
+ "additionalProperties": false
144
+ },
145
+ "harnessGapPolicy": {
146
+ "type": "object",
147
+ "description": "Incident-to-harness loop: every regression must produce a test case within SLA.",
148
+ "properties": {
149
+ "enabled": { "type": "boolean" },
150
+ "p0SlaHours": { "type": "integer", "minimum": 1 },
151
+ "p1SlaHours": { "type": "integer", "minimum": 1 },
152
+ "p2SlaHours": { "type": "integer", "minimum": 1 },
153
+ "autoCreateGapIssue": { "type": "boolean" },
154
+ "requireTestCaseBeforeClose": { "type": "boolean" }
155
+ },
156
+ "additionalProperties": false
157
+ },
158
+ "codeReviewAgent": {
159
+ "type": "object",
160
+ "description": "Code review agent configuration — provider-agnostic settings for rerun, resolve, and remediation.",
161
+ "properties": {
162
+ "provider": { "type": "string" },
163
+ "rerunMarker": { "type": "string" },
164
+ "timeoutMinutes": { "type": "integer", "minimum": 1 },
165
+ "treatVulnerabilityLanguageAsActionable": { "type": "boolean" },
166
+ "treatWeakConfidenceAsActionable": { "type": "boolean" },
167
+ "autoResolveBotsOnlyThreads": { "type": "boolean" },
168
+ "neverAutoResolveHumanThreads": { "type": "boolean" }
169
+ },
170
+ "additionalProperties": false
171
+ },
11
172
  "daemon": {
12
173
  "type": "object",
13
174
  "properties": {
@@ -733,7 +733,7 @@
733
733
 
734
734
  <!-- Footer -->
735
735
  <footer class="footer">
736
- <span>Shipwright Fleet Command v2.3.0</span>
736
+ <span>Shipwright Fleet Command v2.3.1</span>
737
737
  <span>Dashboard refreshes via WebSocket</span>
738
738
  </footer>
739
739