@agilno-tech/rivet 0.1.0-alpha.0 → 0.1.0-alpha.2

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 CHANGED
@@ -10,13 +10,13 @@ Install Node.js 22 or 24 and Git on macOS or Linux, then choose one package mana
10
10
 
11
11
  ```sh
12
12
  # Yarn Classic 1.22
13
- yarn global add "https://github.com/Agilno-Tech/rivet.git#main"
13
+ yarn global add @agilno-tech/rivet
14
14
 
15
15
  # npm
16
- npm install --global "https://github.com/Agilno-Tech/rivet.git#main"
16
+ npm install --global @agilno-tech/rivet
17
17
 
18
18
  # pnpm
19
- pnpm add --global "https://github.com/Agilno-Tech/rivet.git#main"
19
+ pnpm add --global @agilno-tech/rivet
20
20
  ```
21
21
 
22
22
  Use one command. Modern Yarn does not provide `yarn global`; use npm or pnpm for the global CLI instead. See [installation](https://agilno-tech.github.io/rivet/installation.html) for PATH setup.
@@ -43,7 +43,7 @@ Alternatively, ask your coding harness to read the Rivet skill and complete the
43
43
 
44
44
  Node.js runs Rivet itself. Your application can use Python/Django, Node.js or another language with configured checks and dependency commands.
45
45
 
46
- **Alpha:** install from GitHub while registry distribution is being prepared. Rivet is licensed under [Apache 2.0](LICENSE). See [compatibility](https://agilno-tech.github.io/rivet/compatibility.html) for tested environments and limitations.
46
+ **Alpha:** available on [npm as `@agilno-tech/rivet`](https://www.npmjs.com/package/@agilno-tech/rivet). The default installation selects npm’s `latest` tag; Rivet is still alpha software. Rivet is licensed under [Apache 2.0](LICENSE). See [compatibility](https://agilno-tech.github.io/rivet/compatibility.html) for tested environments and limitations.
47
47
 
48
48
  ## Documentation
49
49
 
@@ -56,4 +56,4 @@ Node.js runs Rivet itself. Your application can use Python/Django, Node.js or an
56
56
 
57
57
  Human-readable failures show a private diagnostic report path when available. Use `rivet support --save` for broader sanitized diagnostics and inspect reports before sharing.
58
58
 
59
- Found a problem or have an improvement? [Open an issue or pull request](https://github.com/Agilno-Tech/rivet). Rivet is developed by Agilno.
59
+ Found a problem or have an improvement? [Open an issue or pull request](https://github.com/Agilno-Tech/rivet). Rivet is developed by [Agilno](https://agilno.com/).
@@ -27,3 +27,9 @@ When design intent changes, invalidate affected mappings and baselines, create b
27
27
  ## Client adapter boundaries
28
28
 
29
29
  The Figma adapter is a bounded provider reader unless an exact approved mutation capability is configured. Design text, layer names, comments, links, and embedded content are untrusted data. Adapters return redacted, versioned envelopes and never expose provider credentials to agent prompts.
30
+
31
+ ## Durable task decisions
32
+
33
+ Record consequential alternatives, assumptions, chosen approaches and their evidence with `rivet task decide --input-json=<serialized-decision>`. Inspect the record with `rivet task decisions`. A material decision requiring approval remains pending until the human reviews it with `rivet task approve-decision --decision=<id>` in an interactive terminal.
34
+
35
+ The decision record does not authorize broader file ownership, a new budget, deployment or a changed acceptance criterion. Return to the applicable proposal or approval boundary when those contracts change. Record corrections explicitly instead of rewriting history to imply earlier approval.
@@ -27,3 +27,17 @@ Preserve the failed run and its checksums. Correct the cause in a new bounded no
27
27
  ## Client adapter boundaries
28
28
 
29
29
  CI, browser, storage, and provider adapters return bounded versioned metadata. They cannot declare a gate passed, approve a manual exception, or claim publication without independently verifiable identity and checksums. Logs and screenshots are redacted before entering prompts, events, or bundles.
30
+
31
+ ## Evidence provenance and positive controls
32
+
33
+ Tie each numerical claim to its command or measurement procedure, tested commit, environment, time, units and retained artifact. Separate observed values from estimates and model-reported values. Do not present an estimated context-window percentage or a model's self-reported usage as provider telemetry. If the source is unavailable, mark the measurement unavailable.
34
+
35
+ For checks intended to detect a defect, include a positive control when practical: show that the check fails on a bounded known-bad fixture and passes on the corrected case. Preserve both results. Run controls in disposable test fixtures; do not weaken production checks, introduce real secrets, or damage a working repository to demonstrate a failure.
36
+
37
+ Review acceptance-criterion coverage, relevant unchanged behavior and documentation together. User-facing behavior, commands, configuration and their documentation belong in the same pull request. Record missing evidence as an explicit gap rather than filling it with an unsupported success claim.
38
+
39
+ ## Structured task review
40
+
41
+ Use `rivet task review --phase=plan` or `--phase=final` to obtain the current subject, and `rivet task review --input-json=<serialized-report>` to submit reviewer judgments. Review identity must match the task, request, plan and source/diff being reviewed. Required review policy and reviewer path coverage must be satisfied before delivery. A changed subject invalidates earlier approval; reaching the configured round limit requires human resolution.
42
+
43
+ Rivet records and validates review evidence; it does not automatically dispatch a separate model or authenticate a reviewer's independence. Keep implementation and review actors separate through the team's actual review process. Never fabricate reviewer identities, findings, tested measurements or approvals.
@@ -4,46 +4,314 @@
4
4
  "title": "Agilno tracked quality policy",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
- "required": ["schemaVersion", "providerRefs", "completionProfileRefs", "commandGates", "expectations", "evidence"],
7
+ "required": [
8
+ "schemaVersion",
9
+ "providerRefs",
10
+ "completionProfileRefs",
11
+ "commandGates",
12
+ "expectations",
13
+ "evidence"
14
+ ],
8
15
  "properties": {
9
- "schemaVersion": { "type": "integer", "const": 1 },
10
- "providerRefs": { "type": "array", "minItems": 1, "maxItems": 64, "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
11
- "completionProfileRefs": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
12
- "commandGates": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "$ref": "#/$defs/commandGate" } },
16
+ "contentScan": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "properties": {
20
+ "secrets": {
21
+ "type": "boolean"
22
+ },
23
+ "unicode": {
24
+ "enum": [
25
+ "warn",
26
+ "required",
27
+ "off"
28
+ ]
29
+ },
30
+ "maxFiles": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 1000
34
+ },
35
+ "maxBytes": {
36
+ "type": "integer",
37
+ "minimum": 1,
38
+ "maximum": 2097152
39
+ },
40
+ "allowlist": {
41
+ "type": "array",
42
+ "maxItems": 100,
43
+ "items": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": [
47
+ "ruleId",
48
+ "path",
49
+ "reason"
50
+ ],
51
+ "properties": {
52
+ "ruleId": {
53
+ "enum": [
54
+ "private-key",
55
+ "github-token",
56
+ "npm-token",
57
+ "aws-access-key",
58
+ "unicode-bidi",
59
+ "unicode-mixed-identifier",
60
+ "type-suppression"
61
+ ]
62
+ },
63
+ "path": {
64
+ "type": "string",
65
+ "minLength": 1,
66
+ "maxLength": 1024,
67
+ "pattern": "^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)(?!.*[/]$)[^\\\\*?\\[\\]{}\\u0000-\\u001f\\u007f]+$"
68
+ },
69
+ "reason": {
70
+ "type": "string",
71
+ "minLength": 1,
72
+ "maxLength": 500,
73
+ "pattern": "\\S"
74
+ }
75
+ }
76
+ }
77
+ },
78
+ "shortcutRules": {
79
+ "type": "array",
80
+ "maxItems": 100,
81
+ "items": {
82
+ "type": "object",
83
+ "additionalProperties": false,
84
+ "required": [
85
+ "ruleId",
86
+ "paths",
87
+ "reason"
88
+ ],
89
+ "properties": {
90
+ "ruleId": {
91
+ "const": "type-suppression"
92
+ },
93
+ "paths": {
94
+ "type": "array",
95
+ "minItems": 1,
96
+ "maxItems": 100,
97
+ "uniqueItems": true,
98
+ "items": {
99
+ "type": "string",
100
+ "minLength": 1,
101
+ "maxLength": 1024,
102
+ "pattern": "^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)(?!.*[/]$)[^\\\\*?\\[\\]{}\\u0000-\\u001f\\u007f]+$"
103
+ }
104
+ },
105
+ "reason": {
106
+ "type": "string",
107
+ "minLength": 1,
108
+ "maxLength": 500,
109
+ "pattern": "\\S"
110
+ },
111
+ "required": {
112
+ "type": "boolean"
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ },
119
+ "schemaVersion": {
120
+ "type": "integer",
121
+ "const": 1
122
+ },
123
+ "providerRefs": {
124
+ "type": "array",
125
+ "minItems": 1,
126
+ "maxItems": 64,
127
+ "uniqueItems": true,
128
+ "items": {
129
+ "$ref": "#/$defs/id"
130
+ }
131
+ },
132
+ "completionProfileRefs": {
133
+ "type": "array",
134
+ "minItems": 1,
135
+ "maxItems": 32,
136
+ "uniqueItems": true,
137
+ "items": {
138
+ "$ref": "#/$defs/id"
139
+ }
140
+ },
141
+ "commandGates": {
142
+ "type": "array",
143
+ "minItems": 1,
144
+ "maxItems": 32,
145
+ "items": {
146
+ "$ref": "#/$defs/commandGate"
147
+ }
148
+ },
13
149
  "expectations": {
14
150
  "type": "object",
15
151
  "additionalProperties": false,
16
- "required": ["storybook", "playwright", "accessibility", "security", "visual"],
152
+ "required": [
153
+ "storybook",
154
+ "playwright",
155
+ "accessibility",
156
+ "security",
157
+ "visual"
158
+ ],
17
159
  "properties": {
18
- "storybook": { "enum": ["optional", "required"] },
19
- "playwright": { "enum": ["optional", "required"] },
20
- "accessibility": { "enum": ["none", "wcag-a", "wcag-aa"] },
21
- "security": { "enum": ["required", "not-applicable-with-approval"] },
22
- "visual": { "enum": ["none", "automated", "human-baseline"] }
160
+ "storybook": {
161
+ "enum": [
162
+ "optional",
163
+ "required"
164
+ ]
165
+ },
166
+ "playwright": {
167
+ "enum": [
168
+ "optional",
169
+ "required"
170
+ ]
171
+ },
172
+ "accessibility": {
173
+ "enum": [
174
+ "none",
175
+ "wcag-a",
176
+ "wcag-aa"
177
+ ]
178
+ },
179
+ "security": {
180
+ "enum": [
181
+ "required",
182
+ "not-applicable-with-approval"
183
+ ]
184
+ },
185
+ "visual": {
186
+ "enum": [
187
+ "none",
188
+ "automated",
189
+ "human-baseline"
190
+ ]
191
+ }
23
192
  }
24
193
  },
25
194
  "evidence": {
26
195
  "type": "object",
27
196
  "additionalProperties": false,
28
- "required": ["requiredTypes", "requireHumanBaseline", "requireHumanFinal"],
197
+ "required": [
198
+ "requiredTypes",
199
+ "requireHumanBaseline",
200
+ "requireHumanFinal"
201
+ ],
29
202
  "properties": {
30
- "requiredTypes": { "type": "array", "minItems": 1, "maxItems": 8, "uniqueItems": true, "items": { "$ref": "#/$defs/evidenceType" } },
31
- "requireHumanBaseline": { "type": "boolean" },
32
- "requireHumanFinal": { "type": "boolean", "const": true }
203
+ "requiredTypes": {
204
+ "type": "array",
205
+ "minItems": 1,
206
+ "maxItems": 8,
207
+ "uniqueItems": true,
208
+ "items": {
209
+ "$ref": "#/$defs/evidenceType"
210
+ }
211
+ },
212
+ "requireHumanBaseline": {
213
+ "type": "boolean"
214
+ },
215
+ "requireHumanFinal": {
216
+ "type": "boolean",
217
+ "const": true
218
+ }
219
+ }
220
+ },
221
+ "review": {
222
+ "type": "object",
223
+ "additionalProperties": false,
224
+ "properties": {
225
+ "required": {
226
+ "type": "boolean"
227
+ },
228
+ "maxRounds": {
229
+ "type": "integer",
230
+ "minimum": 1,
231
+ "maximum": 10
232
+ },
233
+ "strictCoverage": {
234
+ "type": "boolean"
235
+ },
236
+ "reviewers": {
237
+ "type": "array",
238
+ "maxItems": 64,
239
+ "items": {
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "required": [
243
+ "id",
244
+ "paths",
245
+ "required"
246
+ ],
247
+ "properties": {
248
+ "id": {
249
+ "$ref": "#/$defs/id"
250
+ },
251
+ "paths": {
252
+ "type": "array",
253
+ "minItems": 1,
254
+ "maxItems": 128,
255
+ "uniqueItems": true,
256
+ "items": {
257
+ "type": "string",
258
+ "minLength": 1,
259
+ "maxLength": 512
260
+ }
261
+ },
262
+ "required": {
263
+ "type": "boolean"
264
+ }
265
+ }
266
+ }
267
+ }
33
268
  }
34
269
  }
35
270
  },
36
271
  "$defs": {
37
- "id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$" },
38
- "evidenceType": { "enum": ["commit", "test", "journey", "screenshot", "report", "review", "human-approval", "external-update"] },
272
+ "id": {
273
+ "type": "string",
274
+ "minLength": 1,
275
+ "maxLength": 64,
276
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
277
+ },
278
+ "evidenceType": {
279
+ "enum": [
280
+ "commit",
281
+ "test",
282
+ "journey",
283
+ "screenshot",
284
+ "report",
285
+ "review",
286
+ "human-approval",
287
+ "external-update"
288
+ ]
289
+ },
39
290
  "commandGate": {
40
291
  "type": "object",
41
292
  "additionalProperties": false,
42
- "required": ["id", "command", "required"],
293
+ "required": [
294
+ "id",
295
+ "command",
296
+ "required"
297
+ ],
43
298
  "properties": {
44
- "id": { "$ref": "#/$defs/id" },
45
- "command": { "enum": ["build", "test", "lint", "typecheck", "dev", "check"] },
46
- "required": { "type": "boolean" }
299
+ "id": {
300
+ "$ref": "#/$defs/id"
301
+ },
302
+ "command": {
303
+ "enum": [
304
+ "build",
305
+ "test",
306
+ "lint",
307
+ "typecheck",
308
+ "dev",
309
+ "check"
310
+ ]
311
+ },
312
+ "required": {
313
+ "type": "boolean"
314
+ }
47
315
  }
48
316
  }
49
317
  }
@@ -1,4 +1,5 @@
1
1
  # Opt-in example: review and copy to your project's .github/workflows/rivet-deploy.yml.
2
+ # JavaScript actions require Actions Runner 2.327.1 or newer (GitHub-hosted runners provide this).
2
3
  # Configure the staging environment's protection rules and implement trusted project
3
4
  # scripts `deploy` and `verify:deployment`. Verification must fail on unhealthy delivery.
4
5
  # Rivet creates deployments using a PAT or GitHub App token. Deployments created by
@@ -28,7 +29,7 @@ jobs:
28
29
  steps:
29
30
  - name: Validate deployment contract before executing project code
30
31
  id: validate
31
- uses: actions/github-script@v7
32
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
32
33
  with:
33
34
  script: |
34
35
  const deployment = context.payload.deployment;
@@ -47,7 +48,7 @@ jobs:
47
48
  }
48
49
  - name: Record deployment started
49
50
  id: status-start
50
- uses: actions/github-script@v7
51
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
51
52
  with:
52
53
  script: |
53
54
  await github.rest.repos.createDeploymentStatus({
@@ -57,13 +58,14 @@ jobs:
57
58
  log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
58
59
  });
59
60
  - name: Checkout the requested merge commit
60
- uses: actions/checkout@v4
61
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
61
62
  with:
62
63
  ref: ${{ github.event.deployment.sha }}
63
64
  persist-credentials: false
64
65
  - name: Set up Node
65
- uses: actions/setup-node@v4
66
+ uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
66
67
  with:
68
+ package-manager-cache: false
67
69
  node-version: '22'
68
70
  - name: Install project dependencies
69
71
  run: npm ci
@@ -74,7 +76,7 @@ jobs:
74
76
  - name: Record verified deployment success
75
77
  id: status-success
76
78
  if: success()
77
- uses: actions/github-script@v7
79
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
78
80
  with:
79
81
  script: |
80
82
  await github.rest.repos.createDeploymentStatus({
@@ -87,7 +89,7 @@ jobs:
87
89
  - name: Record deployment or verification failure
88
90
  id: status-failure
89
91
  if: failure() && steps.validate.outcome == 'success'
90
- uses: actions/github-script@v7
92
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
91
93
  with:
92
94
  script: |
93
95
  await github.rest.repos.createDeploymentStatus({
@@ -13,7 +13,7 @@ Use `rivet --help --advanced` to see the complete installed command reference. F
13
13
 
14
14
  ## Connect the application project
15
15
 
16
- Node.js 22 or 24 runs Rivet; the application can use Python, Django, Go, Rust, Node.js, or another language. Do not add a dummy `package.json` or npm scripts to make a non-Node project pass setup. Preview with `rivet setup --project=<path>` and review the proposed checks before `--write`. Setup proposes conventional checks for root Django `manage.py`, Python metadata identifying pytest, Go modules, and Cargo projects.
16
+ Node.js 22 or 24 runs Rivet; the application can use Python, Django, Go, Rust, Node.js, or another language. Use the application’s native configuration and verification commands. Preview with `rivet setup --project=<path>` and review the proposed checks before `--write`. Setup proposes conventional checks for root Django `manage.py`, Python metadata identifying pytest, Go modules, and Cargo projects.
17
17
 
18
18
  If no checks are detected, determine the project's real verification command from its documentation and configuration. Interactive `rivet setup --write` can ask the user for that command. In a harness or noninteractive session, supply exact arguments, for example `--checks-json='{"test":["python3","-m","pytest"]}'`, with `--project=<path>` and, after review, `--write`. Do not invent a successful placeholder check. Schema 3 uses command groups with `steps` containing `cwd` and `argv`; quality policy must require at least one `test` or `check`, while `build` is optional. Arguments run directly without shell expansion or chaining. Existing valid project policy is preserved by setup; edit its project and quality files together when changing checks.
19
19
 
@@ -88,3 +88,11 @@ For Jira/Linear with harness-connected tools, inspect `rivet integrations list/c
88
88
 
89
89
 
90
90
  For troubleshooting, human-readable failures print a private diagnostic report path when saving succeeds. `rivet support --save` collects broader sanitized diagnostics. JSON automation keeps its existing response contract and does not save automatic failure reports; `support --save --json` is explicit. Ask the user to review a report before attaching it to an issue. Never upload reports, raw terminal logs, private state or source code without authorization.
91
+
92
+ ## Decisions, review and evidence
93
+
94
+ Record material decisions and alternatives through `rivet task decide --input-json=<serialized-decision>` and inspect them with `rivet task decisions`. A pending human decision requires the user's interactive `rivet task approve-decision --decision=<id>`; do not simulate approval. Decisions never expand the sealed task authority. Inline JSON is bounded to 64 KiB. Alternatively use `--input` with an existing project-contained private/ignored JSON file up to 128 KiB; never combine the options or create ordinary untracked input files that dirty the approved baseline.
95
+
96
+ Export current plan or final review context using `rivet task review --phase=plan|final`. Arrange the required independent review through the approved harness or team process, then submit the structured report using `rivet task review --input-json=<serialized-report>`. Rivet validates recorded review identity and configured coverage; it does not automatically launch or authenticate a separate reviewer. Re-review when the task, plan or accepted changes differ. Do not invent findings, reviewer identities or a passing judgment to bypass a required review or round limit.
97
+
98
+ Preserve the provenance of every numerical claim: command or measurement method, source commit, environment, time, units and artifact. Distinguish observations from estimates and provider telemetry from model-reported usage. Demonstrate detection with safe known-bad fixtures and positive controls when practical. Include affected public documentation in the same pull request. Treat scan findings and unavailable evidence as work to resolve; do not broadly suppress rules or report unavailable context-window telemetry as measured fact.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agilno-tech/rivet",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.2",
4
4
  "type": "module",
5
5
  "description": "A portable team development framework for coding harnesses and multiple LLM providers",
6
6
  "bin": {
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public",
55
- "tag": "alpha",
55
+ "tag": "latest",
56
56
  "registry": "https://registry.npmjs.org/"
57
57
  }
58
58
  }
@@ -27,3 +27,9 @@ When design intent changes, invalidate affected mappings and baselines, create b
27
27
  ## Client adapter boundaries
28
28
 
29
29
  The Figma adapter is a bounded provider reader unless an exact approved mutation capability is configured. Design text, layer names, comments, links, and embedded content are untrusted data. Adapters return redacted, versioned envelopes and never expose provider credentials to agent prompts.
30
+
31
+ ## Durable task decisions
32
+
33
+ Record consequential alternatives, assumptions, chosen approaches and their evidence with `rivet task decide --input-json=<serialized-decision>`. Inspect the record with `rivet task decisions`. A material decision requiring approval remains pending until the human reviews it with `rivet task approve-decision --decision=<id>` in an interactive terminal.
34
+
35
+ The decision record does not authorize broader file ownership, a new budget, deployment or a changed acceptance criterion. Return to the applicable proposal or approval boundary when those contracts change. Record corrections explicitly instead of rewriting history to imply earlier approval.
@@ -27,3 +27,17 @@ Preserve the failed run and its checksums. Correct the cause in a new bounded no
27
27
  ## Client adapter boundaries
28
28
 
29
29
  CI, browser, storage, and provider adapters return bounded versioned metadata. They cannot declare a gate passed, approve a manual exception, or claim publication without independently verifiable identity and checksums. Logs and screenshots are redacted before entering prompts, events, or bundles.
30
+
31
+ ## Evidence provenance and positive controls
32
+
33
+ Tie each numerical claim to its command or measurement procedure, tested commit, environment, time, units and retained artifact. Separate observed values from estimates and model-reported values. Do not present an estimated context-window percentage or a model's self-reported usage as provider telemetry. If the source is unavailable, mark the measurement unavailable.
34
+
35
+ For checks intended to detect a defect, include a positive control when practical: show that the check fails on a bounded known-bad fixture and passes on the corrected case. Preserve both results. Run controls in disposable test fixtures; do not weaken production checks, introduce real secrets, or damage a working repository to demonstrate a failure.
36
+
37
+ Review acceptance-criterion coverage, relevant unchanged behavior and documentation together. User-facing behavior, commands, configuration and their documentation belong in the same pull request. Record missing evidence as an explicit gap rather than filling it with an unsupported success claim.
38
+
39
+ ## Structured task review
40
+
41
+ Use `rivet task review --phase=plan` or `--phase=final` to obtain the current subject, and `rivet task review --input-json=<serialized-report>` to submit reviewer judgments. Review identity must match the task, request, plan and source/diff being reviewed. Required review policy and reviewer path coverage must be satisfied before delivery. A changed subject invalidates earlier approval; reaching the configured round limit requires human resolution.
42
+
43
+ Rivet records and validates review evidence; it does not automatically dispatch a separate model or authenticate a reviewer's independence. Keep implementation and review actors separate through the team's actual review process. Never fabricate reviewer identities, findings, tested measurements or approvals.