@chllming/wave-orchestration 0.5.4 → 0.6.1
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/CHANGELOG.md +52 -3
- package/README.md +33 -5
- package/docs/README.md +18 -4
- package/docs/agents/wave-cont-eval-role.md +36 -0
- package/docs/agents/{wave-evaluator-role.md → wave-cont-qa-role.md} +14 -11
- package/docs/agents/wave-documentation-role.md +1 -1
- package/docs/agents/wave-infra-role.md +1 -1
- package/docs/agents/wave-integration-role.md +3 -3
- package/docs/agents/wave-launcher-role.md +4 -3
- package/docs/agents/wave-security-role.md +40 -0
- package/docs/concepts/context7-vs-skills.md +1 -1
- package/docs/concepts/what-is-a-wave.md +56 -6
- package/docs/evals/README.md +166 -0
- package/docs/evals/benchmark-catalog.json +663 -0
- package/docs/guides/author-and-run-waves.md +135 -0
- package/docs/guides/planner.md +5 -0
- package/docs/guides/terminal-surfaces.md +2 -0
- package/docs/plans/component-cutover-matrix.json +1 -1
- package/docs/plans/component-cutover-matrix.md +1 -1
- package/docs/plans/current-state.md +19 -1
- package/docs/plans/examples/wave-example-live-proof.md +435 -0
- package/docs/plans/migration.md +42 -0
- package/docs/plans/wave-orchestrator.md +46 -7
- package/docs/plans/waves/wave-0.md +4 -4
- package/docs/reference/live-proof-waves.md +177 -0
- package/docs/reference/migration-0.2-to-0.5.md +26 -19
- package/docs/reference/npmjs-trusted-publishing.md +6 -5
- package/docs/reference/runtime-config/README.md +14 -4
- package/docs/reference/sample-waves.md +87 -0
- package/docs/reference/skills.md +110 -42
- package/docs/research/agent-context-sources.md +130 -11
- package/docs/research/coordination-failure-review.md +266 -0
- package/docs/roadmap.md +6 -2
- package/package.json +2 -2
- package/releases/manifest.json +35 -2
- package/scripts/research/agent-context-archive.mjs +83 -1
- package/scripts/research/manifests/agent-context-expanded-2026-03-22.mjs +811 -0
- package/scripts/wave-orchestrator/adhoc.mjs +1331 -0
- package/scripts/wave-orchestrator/agent-state.mjs +358 -6
- package/scripts/wave-orchestrator/artifact-schemas.mjs +173 -0
- package/scripts/wave-orchestrator/clarification-triage.mjs +10 -3
- package/scripts/wave-orchestrator/config.mjs +48 -12
- package/scripts/wave-orchestrator/context7.mjs +2 -0
- package/scripts/wave-orchestrator/coord-cli.mjs +51 -19
- package/scripts/wave-orchestrator/coordination-store.mjs +26 -4
- package/scripts/wave-orchestrator/coordination.mjs +83 -9
- package/scripts/wave-orchestrator/dashboard-state.mjs +20 -8
- package/scripts/wave-orchestrator/dep-cli.mjs +5 -2
- package/scripts/wave-orchestrator/docs-queue.mjs +8 -2
- package/scripts/wave-orchestrator/evals.mjs +451 -0
- package/scripts/wave-orchestrator/feedback.mjs +15 -1
- package/scripts/wave-orchestrator/install.mjs +32 -9
- package/scripts/wave-orchestrator/launcher-closure.mjs +281 -0
- package/scripts/wave-orchestrator/launcher-runtime.mjs +334 -0
- package/scripts/wave-orchestrator/launcher.mjs +709 -601
- package/scripts/wave-orchestrator/ledger.mjs +123 -20
- package/scripts/wave-orchestrator/local-executor.mjs +99 -12
- package/scripts/wave-orchestrator/planner.mjs +177 -42
- package/scripts/wave-orchestrator/replay.mjs +6 -3
- package/scripts/wave-orchestrator/role-helpers.mjs +84 -0
- package/scripts/wave-orchestrator/shared.mjs +75 -11
- package/scripts/wave-orchestrator/skills.mjs +637 -106
- package/scripts/wave-orchestrator/traces.mjs +71 -48
- package/scripts/wave-orchestrator/wave-files.mjs +947 -101
- package/scripts/wave.mjs +9 -0
- package/skills/README.md +202 -0
- package/skills/provider-aws/SKILL.md +111 -0
- package/skills/provider-aws/adapters/claude.md +1 -0
- package/skills/provider-aws/adapters/codex.md +1 -0
- package/skills/provider-aws/references/service-verification.md +39 -0
- package/skills/provider-aws/skill.json +50 -1
- package/skills/provider-custom-deploy/SKILL.md +59 -0
- package/skills/provider-custom-deploy/skill.json +46 -1
- package/skills/provider-docker-compose/SKILL.md +90 -0
- package/skills/provider-docker-compose/adapters/local.md +1 -0
- package/skills/provider-docker-compose/skill.json +49 -1
- package/skills/provider-github-release/SKILL.md +116 -1
- package/skills/provider-github-release/adapters/claude.md +1 -0
- package/skills/provider-github-release/adapters/codex.md +1 -0
- package/skills/provider-github-release/skill.json +51 -1
- package/skills/provider-kubernetes/SKILL.md +137 -0
- package/skills/provider-kubernetes/adapters/claude.md +1 -0
- package/skills/provider-kubernetes/adapters/codex.md +1 -0
- package/skills/provider-kubernetes/references/kubectl-patterns.md +58 -0
- package/skills/provider-kubernetes/skill.json +48 -1
- package/skills/provider-railway/SKILL.md +118 -1
- package/skills/provider-railway/references/verification-commands.md +39 -0
- package/skills/provider-railway/skill.json +67 -1
- package/skills/provider-ssh-manual/SKILL.md +91 -0
- package/skills/provider-ssh-manual/skill.json +50 -1
- package/skills/repo-coding-rules/SKILL.md +84 -0
- package/skills/repo-coding-rules/skill.json +30 -1
- package/skills/role-cont-eval/SKILL.md +90 -0
- package/skills/role-cont-eval/adapters/codex.md +1 -0
- package/skills/role-cont-eval/skill.json +36 -0
- package/skills/role-cont-qa/SKILL.md +93 -0
- package/skills/role-cont-qa/adapters/claude.md +1 -0
- package/skills/role-cont-qa/skill.json +36 -0
- package/skills/role-deploy/SKILL.md +90 -0
- package/skills/role-deploy/skill.json +32 -1
- package/skills/role-documentation/SKILL.md +66 -0
- package/skills/role-documentation/skill.json +32 -1
- package/skills/role-implementation/SKILL.md +62 -0
- package/skills/role-implementation/skill.json +32 -1
- package/skills/role-infra/SKILL.md +74 -0
- package/skills/role-infra/skill.json +32 -1
- package/skills/role-integration/SKILL.md +79 -1
- package/skills/role-integration/skill.json +32 -1
- package/skills/role-research/SKILL.md +58 -0
- package/skills/role-research/skill.json +32 -1
- package/skills/role-security/SKILL.md +60 -0
- package/skills/role-security/skill.json +36 -0
- package/skills/runtime-claude/SKILL.md +60 -1
- package/skills/runtime-claude/skill.json +32 -1
- package/skills/runtime-codex/SKILL.md +52 -1
- package/skills/runtime-codex/skill.json +32 -1
- package/skills/runtime-local/SKILL.md +39 -0
- package/skills/runtime-local/skill.json +32 -1
- package/skills/runtime-opencode/SKILL.md +51 -0
- package/skills/runtime-opencode/skill.json +32 -1
- package/skills/wave-core/SKILL.md +107 -0
- package/skills/wave-core/references/marker-syntax.md +62 -0
- package/skills/wave-core/skill.json +31 -1
- package/wave.config.json +35 -6
- package/skills/role-evaluator/SKILL.md +0 -6
- package/skills/role-evaluator/skill.json +0 -5
package/scripts/wave.mjs
CHANGED
|
@@ -17,6 +17,7 @@ function printHelp() {
|
|
|
17
17
|
wave project setup [options]
|
|
18
18
|
wave project show [options]
|
|
19
19
|
wave draft [draft options]
|
|
20
|
+
wave adhoc [adhoc options]
|
|
20
21
|
wave launch [launcher options]
|
|
21
22
|
wave autonomous [autonomous options]
|
|
22
23
|
wave feedback [feedback options]
|
|
@@ -51,6 +52,14 @@ if (["init", "upgrade", "changelog", "doctor"].includes(subcommand)) {
|
|
|
51
52
|
console.error(`[wave] ${error instanceof Error ? error.message : String(error)}`);
|
|
52
53
|
process.exit(Number.isInteger(error?.exitCode) ? error.exitCode : 1);
|
|
53
54
|
}
|
|
55
|
+
} else if (subcommand === "adhoc") {
|
|
56
|
+
try {
|
|
57
|
+
const { runAdhocCli } = await import("./wave-orchestrator/adhoc.mjs");
|
|
58
|
+
await runAdhocCli(rest);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error(`[wave] ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
process.exit(Number.isInteger(error?.exitCode) ? error.exitCode : 1);
|
|
62
|
+
}
|
|
54
63
|
} else if (subcommand === "launch") {
|
|
55
64
|
try {
|
|
56
65
|
const { runLauncherCli } = await import("./wave-orchestrator/launcher.mjs");
|
package/skills/README.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Skills
|
|
2
|
+
|
|
3
|
+
Skills are repo-owned procedural bundles that Wave attaches to agents at runtime. They capture durable operating knowledge such as coding norms, role checklists, runtime behavior, provider verification, and closure rules.
|
|
4
|
+
|
|
5
|
+
Skills are not one-off prompts. They are reusable procedures with explicit routing metadata.
|
|
6
|
+
|
|
7
|
+
## Bundle Layout
|
|
8
|
+
|
|
9
|
+
Each skill lives under `skills/<skill-id>/`:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
skills/<skill-id>/
|
|
13
|
+
skill.json
|
|
14
|
+
SKILL.md
|
|
15
|
+
adapters/
|
|
16
|
+
claude.md
|
|
17
|
+
codex.md
|
|
18
|
+
opencode.md
|
|
19
|
+
local.md
|
|
20
|
+
references/
|
|
21
|
+
...
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `skill.json` is required.
|
|
25
|
+
- `SKILL.md` is required.
|
|
26
|
+
- `adapters/` is optional and runtime-specific.
|
|
27
|
+
- `references/` is optional and can be nested recursively.
|
|
28
|
+
|
|
29
|
+
## `skill.json`
|
|
30
|
+
|
|
31
|
+
Required fields:
|
|
32
|
+
|
|
33
|
+
| Field | Purpose |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `id` | Must match the directory name. |
|
|
36
|
+
| `title` | Human-readable name. |
|
|
37
|
+
| `description` | Short routing summary. |
|
|
38
|
+
| `activation.when` | Human-readable statement of when the skill should apply. |
|
|
39
|
+
|
|
40
|
+
Optional fields:
|
|
41
|
+
|
|
42
|
+
| Field | Purpose |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| `version` | Bundle version for traceability. |
|
|
45
|
+
| `tags` | Lightweight grouping tags. |
|
|
46
|
+
| `activation.roles` | Restrict auto-attachment to specific roles. |
|
|
47
|
+
| `activation.runtimes` | Restrict auto-attachment to specific runtimes. |
|
|
48
|
+
| `activation.deployKinds` | Restrict auto-attachment to specific deploy kinds. |
|
|
49
|
+
| `termination.when` | Explicit stop condition for the procedure. |
|
|
50
|
+
| `permissions.network` | Declared network expectations. |
|
|
51
|
+
| `permissions.shell` | Declared shell/tool expectations. |
|
|
52
|
+
| `permissions.mcpServers` | Declared MCP expectations. |
|
|
53
|
+
| `trust.tier` | Provenance marker such as `repo-owned`. |
|
|
54
|
+
| `evalCases[]` | Deterministic routing checks exercised by `wave doctor`. |
|
|
55
|
+
|
|
56
|
+
## `SKILL.md`
|
|
57
|
+
|
|
58
|
+
`SKILL.md` is the canonical instruction body. Keep it:
|
|
59
|
+
|
|
60
|
+
- procedural
|
|
61
|
+
- reusable across many waves
|
|
62
|
+
- smaller than a full reference manual
|
|
63
|
+
- free of assignment-specific details
|
|
64
|
+
|
|
65
|
+
Use `references/` for detailed catalogs, command inventories, and longer examples that would otherwise bloat the canonical skill.
|
|
66
|
+
|
|
67
|
+
## `adapters/`
|
|
68
|
+
|
|
69
|
+
Adapters are small runtime-specific overlays. Use them only when the runtime interaction materially differs.
|
|
70
|
+
|
|
71
|
+
Common reasons:
|
|
72
|
+
|
|
73
|
+
- Claude should prefer MCP or system-prompt-aware behavior.
|
|
74
|
+
- Codex should stay terminal-first and deterministic.
|
|
75
|
+
- OpenCode should lean on file attachments and direct edits.
|
|
76
|
+
- Local should stay within smoke-validation limits.
|
|
77
|
+
|
|
78
|
+
## `references/`
|
|
79
|
+
|
|
80
|
+
Reference files are progressive-disclosure material. Wave lists them in the compact catalog and, for OpenCode, attaches them as files. The agent reads them on demand rather than paying the token cost up front.
|
|
81
|
+
|
|
82
|
+
Use references for:
|
|
83
|
+
|
|
84
|
+
- command catalogs
|
|
85
|
+
- provider failure-mode inventories
|
|
86
|
+
- longer examples
|
|
87
|
+
- repo-specific extensions that do not belong in the core procedure
|
|
88
|
+
|
|
89
|
+
## Resolution Model
|
|
90
|
+
|
|
91
|
+
Wave stacks skills in this order:
|
|
92
|
+
|
|
93
|
+
1. global `skills.base`
|
|
94
|
+
2. lane `skills.base`
|
|
95
|
+
3. global `skills.byRole[role]`
|
|
96
|
+
4. lane `skills.byRole[role]`
|
|
97
|
+
5. global `skills.byRuntime[runtime]`
|
|
98
|
+
6. lane `skills.byRuntime[runtime]`
|
|
99
|
+
7. global `skills.byDeployKind[kind]`
|
|
100
|
+
8. lane `skills.byDeployKind[kind]`
|
|
101
|
+
9. agent `### Skills`
|
|
102
|
+
|
|
103
|
+
Then it filters configured skills through manifest activation:
|
|
104
|
+
|
|
105
|
+
- role skills should declare their role
|
|
106
|
+
- runtime skills should declare their runtime
|
|
107
|
+
- provider skills should usually declare both deploy kinds and the roles that genuinely need provider context
|
|
108
|
+
|
|
109
|
+
Explicit per-agent `### Skills` still force attachment. Use that only for real exceptions.
|
|
110
|
+
|
|
111
|
+
## Metadata-First Delivery
|
|
112
|
+
|
|
113
|
+
Wave no longer inlines every skill body into every runtime prompt by default.
|
|
114
|
+
|
|
115
|
+
Generated artifacts:
|
|
116
|
+
|
|
117
|
+
| File | Purpose |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| `skills.resolved.md` | Compact skill catalog for the active run. |
|
|
120
|
+
| `skills.expanded.md` | Full canonical/debug view with `SKILL.md` bodies and adapters. |
|
|
121
|
+
| `skills.metadata.json` | Structured ids, activation, permissions, hashes, paths, and artifacts. |
|
|
122
|
+
| `<runtime>-skills.txt` | Runtime-specific compact projection. |
|
|
123
|
+
|
|
124
|
+
Runtime behavior:
|
|
125
|
+
|
|
126
|
+
| Runtime | Delivery model |
|
|
127
|
+
| --- | --- |
|
|
128
|
+
| Codex | Compact catalog in prompt plus bundle directories through `--add-dir`. |
|
|
129
|
+
| Claude | Compact catalog appended to the generated system prompt. |
|
|
130
|
+
| OpenCode | Compact catalog injected into `opencode.json`; `skill.json`, `SKILL.md`, the selected adapter, and recursive references attached via `--file`. |
|
|
131
|
+
| Local | Compact catalog only. |
|
|
132
|
+
|
|
133
|
+
## Validation
|
|
134
|
+
|
|
135
|
+
Run:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
node scripts/wave.mjs doctor --json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Doctor validates:
|
|
142
|
+
|
|
143
|
+
- bundle existence
|
|
144
|
+
- manifest schema
|
|
145
|
+
- selector-key correctness
|
|
146
|
+
- config-to-manifest activation consistency
|
|
147
|
+
- every declared `evalCases[]`
|
|
148
|
+
|
|
149
|
+
This is fail-closed. Selector typos and malformed bundles are errors, not silent no-ops.
|
|
150
|
+
|
|
151
|
+
## Skill Categories
|
|
152
|
+
|
|
153
|
+
Base:
|
|
154
|
+
|
|
155
|
+
- `wave-core`
|
|
156
|
+
- `repo-coding-rules`
|
|
157
|
+
|
|
158
|
+
Role:
|
|
159
|
+
|
|
160
|
+
- `role-implementation`
|
|
161
|
+
- `role-integration`
|
|
162
|
+
- `role-documentation`
|
|
163
|
+
- `role-infra`
|
|
164
|
+
- `role-deploy`
|
|
165
|
+
- `role-research`
|
|
166
|
+
- `role-cont-qa`
|
|
167
|
+
- `role-cont-eval`
|
|
168
|
+
|
|
169
|
+
Runtime:
|
|
170
|
+
|
|
171
|
+
- `runtime-codex`
|
|
172
|
+
- `runtime-claude`
|
|
173
|
+
- `runtime-opencode`
|
|
174
|
+
- `runtime-local`
|
|
175
|
+
|
|
176
|
+
Provider:
|
|
177
|
+
|
|
178
|
+
- `provider-railway`
|
|
179
|
+
- `provider-aws`
|
|
180
|
+
- `provider-kubernetes`
|
|
181
|
+
- `provider-docker-compose`
|
|
182
|
+
- `provider-ssh-manual`
|
|
183
|
+
- `provider-custom-deploy`
|
|
184
|
+
- `provider-github-release`
|
|
185
|
+
|
|
186
|
+
Provider skills are configured by deploy kind, but the shipped manifests further restrict them to `deploy`, `infra`, `integration`, and `cont-qa` auto-attachment.
|
|
187
|
+
|
|
188
|
+
## Creating or Updating a Skill
|
|
189
|
+
|
|
190
|
+
1. Create `skills/<skill-id>/`.
|
|
191
|
+
2. Add `skill.json` with at least `id`, `title`, `description`, and `activation.when`.
|
|
192
|
+
3. Add `SKILL.md`.
|
|
193
|
+
4. Add adapters or references only where they materially help.
|
|
194
|
+
5. Register the bundle in `wave.config.json` if it should auto-attach.
|
|
195
|
+
6. Add meaningful `evalCases[]`.
|
|
196
|
+
7. Run `node scripts/wave.mjs doctor --json`.
|
|
197
|
+
|
|
198
|
+
## Further Reading
|
|
199
|
+
|
|
200
|
+
- [Skills Reference](../docs/reference/skills.md)
|
|
201
|
+
- [Context7 vs Skills](../docs/concepts/context7-vs-skills.md)
|
|
202
|
+
- [What Is A Wave](../docs/concepts/what-is-a-wave.md)
|
|
@@ -1,6 +1,117 @@
|
|
|
1
1
|
# AWS
|
|
2
2
|
|
|
3
|
+
<!-- CUSTOMIZE: Add your AWS account IDs, regions, service names, and IAM role ARNs below. -->
|
|
4
|
+
|
|
5
|
+
## Core Rules
|
|
6
|
+
|
|
3
7
|
- Name the exact AWS service, account, region, and resource involved.
|
|
4
8
|
- Prefer explicit CLI or console-equivalent evidence for deployment and environment state.
|
|
5
9
|
- Separate IAM or identity issues from workload health or rollout issues.
|
|
6
10
|
- If AWS state is inferred indirectly, mark the proof gap instead of implying live verification.
|
|
11
|
+
- Always include the region in verification commands. Do not rely on default region configuration.
|
|
12
|
+
|
|
13
|
+
## Resource Identification
|
|
14
|
+
|
|
15
|
+
Every AWS verification must specify:
|
|
16
|
+
|
|
17
|
+
- **Service type** -- ECS, Lambda, EC2, S3, CloudFront, RDS, DynamoDB, SQS, SNS, etc.
|
|
18
|
+
- **Account ID** -- the 12-digit AWS account number.
|
|
19
|
+
- **Region** -- the AWS region (e.g., `us-east-1`, `eu-west-1`).
|
|
20
|
+
- **Resource identifier** -- ARN, resource name, or resource ID depending on the service.
|
|
21
|
+
|
|
22
|
+
Do not use shorthand. `the ECS service` is insufficient. `ecs service my-api in cluster prod-cluster, account 123456789012, us-east-1` is correct.
|
|
23
|
+
|
|
24
|
+
## Verification Procedures
|
|
25
|
+
|
|
26
|
+
### ECS (Task and Service Status)
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
aws ecs describe-services --cluster <cluster> --services <service> --region <region>
|
|
30
|
+
aws ecs list-tasks --cluster <cluster> --service-name <service> --region <region>
|
|
31
|
+
aws ecs describe-tasks --cluster <cluster> --tasks <task-arn> --region <region>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Confirm: desired count matches running count, last deployment status is PRIMARY and COMPLETED, no tasks in STOPPED state with error exit codes.
|
|
35
|
+
|
|
36
|
+
### Lambda
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
aws lambda get-function --function-name <name> --region <region>
|
|
40
|
+
aws lambda invoke --function-name <name> --payload '{}' /dev/stdout --region <region>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Confirm: function exists, runtime is expected version, last modified timestamp is recent if just deployed, invoke returns expected status code.
|
|
44
|
+
|
|
45
|
+
### EC2
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
aws ec2 describe-instances --instance-ids <id> --region <region>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Confirm: instance state is `running`, status checks pass (system and instance), security groups and network configuration match expectations.
|
|
52
|
+
|
|
53
|
+
### S3
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
aws s3 ls s3://<bucket>/ --region <region>
|
|
57
|
+
aws s3api head-bucket --bucket <bucket> --region <region>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Confirm: bucket exists, expected objects are present, access permissions are correct.
|
|
61
|
+
|
|
62
|
+
### CloudWatch Metrics
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
aws cloudwatch get-metric-statistics --namespace <ns> --metric-name <metric> --dimensions <dims> --start-time <start> --end-time <end> --period 300 --statistics Average --region <region>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Use for: error rate trends, latency baselines, invocation counts, and health signal confirmation.
|
|
69
|
+
|
|
70
|
+
<!-- CUSTOMIZE: Add verification procedures for additional AWS services used in your project here. -->
|
|
71
|
+
|
|
72
|
+
## Evidence Format
|
|
73
|
+
|
|
74
|
+
When recording AWS verification, use this structure:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
Service: <aws-service-type>
|
|
78
|
+
Resource: <ARN-or-name>
|
|
79
|
+
Account: <account-id>
|
|
80
|
+
Region: <region>
|
|
81
|
+
Verification Command: <exact-command-run>
|
|
82
|
+
Result: <summary-of-output>
|
|
83
|
+
Status: <healthy|degraded|failed|unknown>
|
|
84
|
+
Timestamp Context: <when-verified>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Omit fields that were not checked. Do not fill in fields with assumed values.
|
|
88
|
+
|
|
89
|
+
## IAM vs Workload Issues
|
|
90
|
+
|
|
91
|
+
These are different failure domains with different owners and different fixes:
|
|
92
|
+
|
|
93
|
+
### IAM / Identity Failures
|
|
94
|
+
|
|
95
|
+
- Symptom: `AccessDenied`, `UnauthorizedAccess`, `AssumeRolePolicy` errors.
|
|
96
|
+
- Owner: infrastructure role (the agent or team managing IAM policies and roles).
|
|
97
|
+
- Fix: policy update, trust relationship change, or role assumption path correction.
|
|
98
|
+
- Do not conflate with app health. A Lambda may be healthy but unable to reach S3 due to a missing IAM policy.
|
|
99
|
+
|
|
100
|
+
### Workload / Application Failures
|
|
101
|
+
|
|
102
|
+
- Symptom: crash loops, OOM kills, health check failures, timeout errors, application-level error responses.
|
|
103
|
+
- Owner: deploy role (the agent or team managing the application code and configuration).
|
|
104
|
+
- Fix: code fix, configuration change, resource scaling, or dependency resolution.
|
|
105
|
+
|
|
106
|
+
When reporting failures, classify which domain the failure belongs to. If both are present, report them as separate issues with separate owners.
|
|
107
|
+
|
|
108
|
+
## Customization
|
|
109
|
+
|
|
110
|
+
<!-- CUSTOMIZE: Override or extend any section above. Common additions:
|
|
111
|
+
- AWS account IDs: production=<id>, staging=<id>
|
|
112
|
+
- Primary regions: <comma-separated-list>
|
|
113
|
+
- Service inventory: <service-type> -> <resource-name> -> <region>
|
|
114
|
+
- IAM role ARNs: deploy-role=<arn>, infra-role=<arn>
|
|
115
|
+
- CloudWatch alarm names and thresholds
|
|
116
|
+
- Custom health check endpoints per service
|
|
117
|
+
-->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Prefer AWS CLI commands with `--output json` for machine-readable evidence. Use MCP tools for AWS operations when available. Record exact CLI commands and JSON output excerpts as deployment proof. Separate IAM verification from workload health checks — run both but report independently.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Use AWS CLI commands with `--output json` for all verification. Network access may be restricted in sandbox — if AWS APIs are unreachable, record the access gap as deploy risk rather than inferring state. Keep CLI invocations deterministic and capture stdout for evidence.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# AWS Service Verification Patterns
|
|
2
|
+
|
|
3
|
+
Reference for verifying AWS deployment state per service type.
|
|
4
|
+
|
|
5
|
+
## ECS (Elastic Container Service)
|
|
6
|
+
- Task status: `aws ecs describe-tasks --cluster <cluster> --tasks <task-arn>`
|
|
7
|
+
- Service status: `aws ecs describe-services --cluster <cluster> --services <service-name>`
|
|
8
|
+
- Key checks: desiredCount == runningCount, no STOPPED tasks with non-zero exit code, deployment in COMPLETED state.
|
|
9
|
+
- Logs: `aws logs get-log-events --log-group-name <group> --log-stream-name <stream>`
|
|
10
|
+
|
|
11
|
+
## Lambda
|
|
12
|
+
- Function status: `aws lambda get-function --function-name <name>`
|
|
13
|
+
- Invoke test: `aws lambda invoke --function-name <name> --payload '{}' /dev/stdout`
|
|
14
|
+
- Key checks: State is Active, LastUpdateStatus is Successful, invoke returns expected status code.
|
|
15
|
+
|
|
16
|
+
## EC2
|
|
17
|
+
- Instance status: `aws ec2 describe-instance-status --instance-ids <id>`
|
|
18
|
+
- Key checks: InstanceState is running, SystemStatus and InstanceStatus are ok.
|
|
19
|
+
- Connect test: Verify security groups allow expected ports.
|
|
20
|
+
|
|
21
|
+
## S3
|
|
22
|
+
- Bucket verification: `aws s3 ls s3://<bucket>/`
|
|
23
|
+
- Key checks: Bucket exists, expected objects are present, ACLs/policies are correct.
|
|
24
|
+
|
|
25
|
+
## CloudWatch
|
|
26
|
+
- Metrics: `aws cloudwatch get-metric-statistics --namespace <ns> --metric-name <metric> --period 300 --statistics Average`
|
|
27
|
+
- Alarms: `aws cloudwatch describe-alarms --alarm-names <name>`
|
|
28
|
+
- Key checks: No ALARM state, error rate metrics within threshold.
|
|
29
|
+
|
|
30
|
+
## RDS
|
|
31
|
+
- Instance status: `aws rds describe-db-instances --db-instance-identifier <id>`
|
|
32
|
+
- Key checks: DBInstanceStatus is available, no pending modifications.
|
|
33
|
+
|
|
34
|
+
## General Pattern
|
|
35
|
+
For any AWS service:
|
|
36
|
+
1. Identify the resource ARN or name.
|
|
37
|
+
2. Use the describe/get API to verify state.
|
|
38
|
+
3. Check for pending operations or degraded status.
|
|
39
|
+
4. Record the region, account, and exact command used as evidence.
|
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "provider-aws",
|
|
3
3
|
"title": "AWS",
|
|
4
|
-
"description": "AWS
|
|
4
|
+
"description": "Guides deploy verification against AWS services: resource identification, per-service health checks, IAM vs workload issue separation, and evidence recording.",
|
|
5
|
+
"activation": {
|
|
6
|
+
"when": "Attach when the wave deploy surface is AWS and the agent must reason about AWS-specific rollout or closure state.",
|
|
7
|
+
"roles": [
|
|
8
|
+
"deploy",
|
|
9
|
+
"infra",
|
|
10
|
+
"integration",
|
|
11
|
+
"cont-qa"
|
|
12
|
+
],
|
|
13
|
+
"runtimes": [],
|
|
14
|
+
"deployKinds": [
|
|
15
|
+
"aws"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"termination": "Stop when AWS service evidence is captured or the blocking surface is isolated.",
|
|
19
|
+
"permissions": {
|
|
20
|
+
"network": [
|
|
21
|
+
"amazonaws.com"
|
|
22
|
+
],
|
|
23
|
+
"shell": [
|
|
24
|
+
"aws"
|
|
25
|
+
],
|
|
26
|
+
"mcpServers": []
|
|
27
|
+
},
|
|
28
|
+
"trust": {
|
|
29
|
+
"tier": "repo-owned"
|
|
30
|
+
},
|
|
31
|
+
"evalCases": [
|
|
32
|
+
{
|
|
33
|
+
"id": "deploy-aws",
|
|
34
|
+
"role": "deploy",
|
|
35
|
+
"runtime": "opencode",
|
|
36
|
+
"deployKind": "aws",
|
|
37
|
+
"expectActive": true
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "infra-aws",
|
|
41
|
+
"role": "infra",
|
|
42
|
+
"runtime": "claude",
|
|
43
|
+
"deployKind": "aws",
|
|
44
|
+
"expectActive": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "documentation-aws",
|
|
48
|
+
"role": "documentation",
|
|
49
|
+
"runtime": "claude",
|
|
50
|
+
"deployKind": "aws",
|
|
51
|
+
"expectActive": false
|
|
52
|
+
}
|
|
53
|
+
]
|
|
5
54
|
}
|
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# Custom Deploy
|
|
2
2
|
|
|
3
|
+
<!-- CUSTOMIZE: Add your custom verification commands, health endpoints, deployment scripts, and environment-specific conventions below. -->
|
|
4
|
+
|
|
5
|
+
## Core Rules
|
|
6
|
+
|
|
3
7
|
- Make the custom environment contract explicit before treating it as proved.
|
|
4
8
|
- Name the exact verification surface, command, or operator artifact used as evidence.
|
|
5
9
|
- If the environment lacks a stable verification path, record the resulting deploy risk.
|
|
10
|
+
- Do not borrow verification assumptions from standard providers. Custom environments have custom proof requirements.
|
|
11
|
+
- Every claim of "verified" must reference a concrete command, output, or artifact.
|
|
12
|
+
|
|
13
|
+
## Contract Definition
|
|
14
|
+
|
|
15
|
+
Before claiming any deploy target is verified in a custom environment, define the contract:
|
|
16
|
+
|
|
17
|
+
1. **Verification surface** -- what tool, command, API, or artifact serves as the source of truth for this environment's state? Name it exactly.
|
|
18
|
+
2. **Healthy signal** -- what specific output, status code, or artifact state means the deploy is healthy? Define the exact match criteria.
|
|
19
|
+
3. **Degraded signal** -- what output means the deploy is running but not fully healthy? Define the boundary between degraded and healthy.
|
|
20
|
+
4. **Failed signal** -- what output means the deploy has failed? Define the criteria that distinguish failure from degraded.
|
|
21
|
+
5. **Unknown signal** -- if the verification surface is unreachable or returns unexpected output, the state is unknown. Do not default to healthy or failed.
|
|
22
|
+
|
|
23
|
+
If any of these cannot be defined, record the gap as deploy risk before proceeding.
|
|
24
|
+
|
|
25
|
+
## Verification Surface
|
|
26
|
+
|
|
27
|
+
Name the exact verification mechanism:
|
|
28
|
+
|
|
29
|
+
- **Command-based** -- a CLI command that returns structured output. Preferred. Record the exact command, expected output format, and how to parse healthy/degraded/failed from it.
|
|
30
|
+
- **API-based** -- an HTTP endpoint that returns status. Record the URL, expected status code, expected response body or fields, and authentication method.
|
|
31
|
+
- **Artifact-based** -- a file, database record, or log entry that serves as proof. Record the exact path or query, expected content, and how freshness is determined.
|
|
32
|
+
- **Process-based** -- a running process or service that can be checked. Record the process name, how to check it, and what constitutes healthy state.
|
|
33
|
+
|
|
34
|
+
Prefer verification surfaces with machine-readable output. If the only evidence is human-readable prose (e.g., a dashboard screenshot), record that as a proof quality limitation.
|
|
35
|
+
|
|
36
|
+
If no stable verification surface exists for the custom environment, this is itself a deploy risk. Record:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Deploy Risk: No stable verification surface for <environment-name>.
|
|
40
|
+
Attempted: <what-was-tried>
|
|
41
|
+
Observed: <what-was-seen>
|
|
42
|
+
Gap: <what-remains-unknown>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Risk Recording
|
|
46
|
+
|
|
47
|
+
When the custom environment lacks standard verification capabilities, record the full state:
|
|
48
|
+
|
|
49
|
+
1. **What was attempted** -- the exact commands, API calls, or checks that were run.
|
|
50
|
+
2. **What was observed** -- the exact output, including partial or ambiguous results.
|
|
51
|
+
3. **What remains unknown** -- the specific questions that could not be answered.
|
|
52
|
+
4. **Risk assessment** -- how the unknowns affect confidence in the deploy state. Be specific: "cannot confirm database migration ran" is useful; "some things are unclear" is not.
|
|
53
|
+
|
|
54
|
+
Include this risk record in the `[deploy-status]` marker detail field or as a separate coordination record.
|
|
55
|
+
|
|
56
|
+
## Customization
|
|
57
|
+
|
|
58
|
+
<!-- CUSTOMIZE: Override or extend any section above. Common additions:
|
|
59
|
+
- Custom verification commands: <command> -> <expected-output>
|
|
60
|
+
- Health endpoints: <url> -> <expected-status> -> <expected-body>
|
|
61
|
+
- Deployment scripts: <script-path> -> <usage>
|
|
62
|
+
- Environment-specific conventions: <env-name> -> <verification-approach>
|
|
63
|
+
- Known proof gaps and accepted risk levels
|
|
64
|
+
-->
|
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "provider-custom-deploy",
|
|
3
3
|
"title": "Custom Deploy",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Guides custom environment verification: contract definition, verification surface identification, and deploy risk recording when standard paths are unavailable.",
|
|
5
|
+
"activation": {
|
|
6
|
+
"when": "Attach when the wave uses a custom deploy contract and the agent must make the verification surface explicit.",
|
|
7
|
+
"roles": [
|
|
8
|
+
"deploy",
|
|
9
|
+
"infra",
|
|
10
|
+
"integration",
|
|
11
|
+
"cont-qa"
|
|
12
|
+
],
|
|
13
|
+
"runtimes": [],
|
|
14
|
+
"deployKinds": [
|
|
15
|
+
"custom"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"termination": "Stop when the custom deploy contract, evidence, and residual risk are explicitly recorded.",
|
|
19
|
+
"permissions": {
|
|
20
|
+
"network": [],
|
|
21
|
+
"shell": [],
|
|
22
|
+
"mcpServers": []
|
|
23
|
+
},
|
|
24
|
+
"trust": {
|
|
25
|
+
"tier": "repo-owned"
|
|
26
|
+
},
|
|
27
|
+
"evalCases": [
|
|
28
|
+
{
|
|
29
|
+
"id": "deploy-custom",
|
|
30
|
+
"role": "deploy",
|
|
31
|
+
"runtime": "opencode",
|
|
32
|
+
"deployKind": "custom",
|
|
33
|
+
"expectActive": true
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "integration-custom",
|
|
37
|
+
"role": "integration",
|
|
38
|
+
"runtime": "claude",
|
|
39
|
+
"deployKind": "custom",
|
|
40
|
+
"expectActive": true
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "documentation-custom",
|
|
44
|
+
"role": "documentation",
|
|
45
|
+
"runtime": "claude",
|
|
46
|
+
"deployKind": "custom",
|
|
47
|
+
"expectActive": false
|
|
48
|
+
}
|
|
49
|
+
]
|
|
5
50
|
}
|
|
@@ -1,6 +1,96 @@
|
|
|
1
1
|
# Docker Compose
|
|
2
2
|
|
|
3
|
+
<!-- CUSTOMIZE: Add your compose file paths, service names, and health check endpoints below. -->
|
|
4
|
+
|
|
5
|
+
## Core Rules
|
|
6
|
+
|
|
3
7
|
- Use compose file names, service names, ports, and health checks exactly.
|
|
4
8
|
- Distinguish local container health from production readiness.
|
|
5
9
|
- Record the exact compose commands or logs used as proof.
|
|
6
10
|
- Make service dependency and readiness ordering explicit when rollout depends on it.
|
|
11
|
+
- Container running is not the same as application healthy. Always verify beyond container state.
|
|
12
|
+
|
|
13
|
+
## Service Identification
|
|
14
|
+
|
|
15
|
+
Every Docker Compose verification must specify:
|
|
16
|
+
|
|
17
|
+
- **Compose file path** -- the exact path to the compose file (e.g., `docker-compose.yml`, `docker-compose.prod.yml`, `compose.yaml`).
|
|
18
|
+
- **Service names** -- exact names as defined in the compose file.
|
|
19
|
+
- **Exposed ports** -- host:container port mappings for each service.
|
|
20
|
+
- **Volume mounts** -- named volumes or bind mounts that carry persistent state.
|
|
21
|
+
- **Network names** -- custom networks defined in the compose file, if any.
|
|
22
|
+
|
|
23
|
+
Do not use shorthand. `the database service` is insufficient. `service postgres in docker-compose.yml, port 5432:5432, volume pgdata:/var/lib/postgresql/data` is correct.
|
|
24
|
+
|
|
25
|
+
## Verification Procedures
|
|
26
|
+
|
|
27
|
+
### Container State
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
docker compose -f <file> ps
|
|
31
|
+
docker compose -f <file> ps --format json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Confirm: all expected services are listed, state is `running` (not `exited`, `restarting`, or `created`), health status is `healthy` if healthcheck is defined.
|
|
35
|
+
|
|
36
|
+
### Service Logs
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
docker compose -f <file> logs <service> --tail=50
|
|
40
|
+
docker compose -f <file> logs <service> --since 5m
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Confirm: no fatal errors, startup completed successfully, application-level health indicators are positive.
|
|
44
|
+
|
|
45
|
+
### Health Checks
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
docker compose -f <file> exec <service> <health-command>
|
|
49
|
+
curl -s http://localhost:<port>/health
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Confirm: health endpoint returns expected status code and body. If the service defines a Docker healthcheck, verify it shows `healthy` in `docker compose ps`.
|
|
53
|
+
|
|
54
|
+
### Detailed Container State
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
docker inspect <container-name-or-id>
|
|
58
|
+
docker inspect --format='{{.State.Health.Status}}' <container-name-or-id>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Use for: investigating restart reasons, checking exact health check output, verifying environment variables and mount points inside the container.
|
|
62
|
+
|
|
63
|
+
<!-- CUSTOMIZE: Add project-specific verification commands or health endpoints here. -->
|
|
64
|
+
|
|
65
|
+
## Local vs Production
|
|
66
|
+
|
|
67
|
+
Do not conflate container state with application readiness:
|
|
68
|
+
|
|
69
|
+
- **Container running** -- the process started. This does not mean it is accepting requests or connected to its dependencies.
|
|
70
|
+
- **Container healthy** -- the Docker healthcheck passed. This confirms a basic liveness check but may not cover all application functionality.
|
|
71
|
+
- **Application healthy** -- the application responds correctly to real requests, is connected to all dependencies, and is processing work as expected.
|
|
72
|
+
- **Production ready** -- the full stack is up, all integration points are verified, and the environment matches production configuration.
|
|
73
|
+
|
|
74
|
+
When reporting status, be precise about which level of health you verified. If you only confirmed container state, say so.
|
|
75
|
+
|
|
76
|
+
## Dependency Ordering
|
|
77
|
+
|
|
78
|
+
Compose services often depend on each other. Verify startup order:
|
|
79
|
+
|
|
80
|
+
1. **`depends_on` declarations** -- confirm they are present in the compose file for services that need them.
|
|
81
|
+
2. **Healthcheck-based readiness** -- `depends_on` with `condition: service_healthy` ensures the dependency is ready, not just started. Prefer this over bare `depends_on`.
|
|
82
|
+
3. **Startup order verification** -- after `docker compose up`, check logs to confirm services started in the correct order and downstream services did not fail due to missing upstream dependencies.
|
|
83
|
+
4. **Retry behavior** -- if a service connects to a dependency on startup, verify it has retry logic or that the dependency was healthy before the service started.
|
|
84
|
+
|
|
85
|
+
When dependency ordering issues cause failures, record the exact failure chain: which service failed, which dependency was not ready, and what error appeared.
|
|
86
|
+
|
|
87
|
+
## Customization
|
|
88
|
+
|
|
89
|
+
<!-- CUSTOMIZE: Override or extend any section above. Common additions:
|
|
90
|
+
- Compose file paths: <comma-separated-list>
|
|
91
|
+
- Service names: <comma-separated-list>
|
|
92
|
+
- Health check endpoints: <service> -> <url>
|
|
93
|
+
- Required environment variables per service
|
|
94
|
+
- Volume backup and restore procedures
|
|
95
|
+
- Network topology notes
|
|
96
|
+
-->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
The local runtime may have Docker access for compose verification. Use `docker compose ps` and `docker compose logs` when available. If Docker is not running, limit output to compose file validation and service definition review. Do not claim container health from file inspection alone.
|