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.
- package/README.md +82 -20
- package/config/policy.json +160 -2
- package/config/policy.schema.json +162 -1
- package/dashboard/public/index.html +1 -1
- package/dashboard/src/core/api.test.ts +362 -0
- package/dashboard/src/core/router.test.ts +266 -0
- package/dashboard/src/core/state.test.ts +235 -0
- package/dashboard/src/core/ws.test.ts +216 -0
- package/dashboard/src/design/icons.test.ts +105 -0
- package/dashboard/src/design/tokens.test.ts +204 -0
- package/dashboard/tsconfig.json +1 -1
- package/dashboard/vitest.config.ts +27 -0
- package/package.json +23 -4
- package/scripts/lib/pipeline-stages.sh +59 -0
- package/scripts/sw +1 -1
- package/scripts/sw-activity.sh +1 -1
- package/scripts/sw-adaptive.sh +1 -1
- package/scripts/sw-adversarial.sh +1 -1
- package/scripts/sw-architecture-enforcer.sh +1 -1
- package/scripts/sw-auth.sh +1 -1
- package/scripts/sw-autonomous.sh +230 -13
- package/scripts/sw-changelog.sh +1 -1
- package/scripts/sw-checkpoint.sh +1 -1
- package/scripts/sw-ci.sh +1 -1
- package/scripts/sw-cleanup.sh +1 -1
- package/scripts/sw-code-review.sh +1 -1
- package/scripts/sw-connect.sh +1 -1
- package/scripts/sw-context.sh +1 -1
- package/scripts/sw-cost.sh +1 -1
- package/scripts/sw-daemon.sh +1 -1
- package/scripts/sw-dashboard.sh +1 -1
- package/scripts/sw-db.sh +1 -1
- package/scripts/sw-decompose.sh +1 -1
- package/scripts/sw-deps.sh +1 -1
- package/scripts/sw-developer-simulation.sh +1 -1
- package/scripts/sw-discovery.sh +1 -1
- package/scripts/sw-doc-fleet.sh +1 -1
- package/scripts/sw-docs-agent.sh +1 -1
- package/scripts/sw-docs.sh +1 -1
- package/scripts/sw-doctor.sh +1 -1
- package/scripts/sw-dora.sh +1 -1
- package/scripts/sw-durable.sh +1 -1
- package/scripts/sw-e2e-orchestrator.sh +1 -1
- package/scripts/sw-eventbus.sh +1 -1
- package/scripts/sw-evidence.sh +664 -0
- package/scripts/sw-feedback.sh +1 -1
- package/scripts/sw-fix.sh +1 -1
- package/scripts/sw-fleet-discover.sh +1 -1
- package/scripts/sw-fleet-viz.sh +1 -1
- package/scripts/sw-fleet.sh +1 -1
- package/scripts/sw-github-app.sh +1 -1
- package/scripts/sw-github-checks.sh +1 -1
- package/scripts/sw-github-deploy.sh +1 -1
- package/scripts/sw-github-graphql.sh +1 -1
- package/scripts/sw-guild.sh +1 -1
- package/scripts/sw-heartbeat.sh +1 -1
- package/scripts/sw-hygiene.sh +1 -1
- package/scripts/sw-incident.sh +244 -1
- package/scripts/sw-init.sh +1 -1
- package/scripts/sw-instrument.sh +1 -1
- package/scripts/sw-intelligence.sh +1 -1
- package/scripts/sw-jira.sh +1 -1
- package/scripts/sw-launchd.sh +1 -1
- package/scripts/sw-linear.sh +1 -1
- package/scripts/sw-logs.sh +1 -1
- package/scripts/sw-loop.sh +1 -1
- package/scripts/sw-memory.sh +1 -1
- package/scripts/sw-mission-control.sh +1 -1
- package/scripts/sw-model-router.sh +1 -1
- package/scripts/sw-otel.sh +1 -1
- package/scripts/sw-oversight.sh +1 -1
- package/scripts/sw-pipeline-composer.sh +1 -1
- package/scripts/sw-pipeline-vitals.sh +1 -1
- package/scripts/sw-pipeline.sh +1 -1
- package/scripts/sw-pm.sh +1 -1
- package/scripts/sw-pr-lifecycle.sh +177 -5
- package/scripts/sw-predictive.sh +1 -1
- package/scripts/sw-prep.sh +1 -1
- package/scripts/sw-ps.sh +1 -1
- package/scripts/sw-public-dashboard.sh +1 -1
- package/scripts/sw-quality.sh +1 -1
- package/scripts/sw-reaper.sh +1 -1
- package/scripts/sw-regression.sh +1 -1
- package/scripts/sw-release-manager.sh +1 -1
- package/scripts/sw-release.sh +1 -1
- package/scripts/sw-remote.sh +1 -1
- package/scripts/sw-replay.sh +1 -1
- package/scripts/sw-retro.sh +4 -1
- package/scripts/sw-review-rerun.sh +220 -0
- package/scripts/sw-scale.sh +1 -1
- package/scripts/sw-security-audit.sh +1 -1
- package/scripts/sw-self-optimize.sh +99 -1
- package/scripts/sw-session.sh +1 -1
- package/scripts/sw-setup.sh +1 -1
- package/scripts/sw-standup.sh +1 -1
- package/scripts/sw-status.sh +1 -1
- package/scripts/sw-strategic.sh +1 -1
- package/scripts/sw-stream.sh +1 -1
- package/scripts/sw-swarm.sh +1 -1
- package/scripts/sw-team-stages.sh +1 -1
- package/scripts/sw-templates.sh +1 -1
- package/scripts/sw-testgen.sh +1 -1
- package/scripts/sw-tmux-pipeline.sh +1 -1
- package/scripts/sw-tmux.sh +1 -1
- package/scripts/sw-trace.sh +1 -1
- package/scripts/sw-tracker.sh +1 -1
- package/scripts/sw-triage.sh +198 -11
- package/scripts/sw-upgrade.sh +1 -1
- package/scripts/sw-ux.sh +1 -1
- package/scripts/sw-webhook.sh +1 -1
- package/scripts/sw-widgets.sh +1 -1
- 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.
|
|
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
|
-
- [
|
|
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
|
-
##
|
|
50
|
+
## Code Factory Pattern
|
|
50
51
|
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
118
|
+
**v2.3.1**: Autonomous feedback loops, testing foundation, chaos resilience
|
|
59
119
|
|
|
60
|
-
**v2.
|
|
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
|
-
|
|
|
414
|
-
|
|
|
415
|
-
|
|
|
416
|
-
|
|
|
417
|
-
|
|
|
418
|
-
|
|
|
419
|
-
| `~/.shipwright/
|
|
420
|
-
| `~/.shipwright/
|
|
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
|
|
package/config/policy.json
CHANGED
|
@@ -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.
|
|
4
|
-
"version": "
|
|
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.
|
|
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": {
|