@weave-tools/weave-it 0.1.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 (34) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +868 -0
  3. package/dist/cli.d.ts +5 -0
  4. package/dist/cli.js +4538 -0
  5. package/dist/cli.js.map +1 -0
  6. package/package.json +65 -0
  7. package/templates/opencode/commands/weave-architect.md +7 -0
  8. package/templates/opencode/commands/weave-capture.md +7 -0
  9. package/templates/opencode/commands/weave-clarify.md +7 -0
  10. package/templates/opencode/commands/weave-execute.md +7 -0
  11. package/templates/opencode/commands/weave-explore.md +7 -0
  12. package/templates/opencode/commands/weave-issues.md +7 -0
  13. package/templates/opencode/commands/weave-knowledge.md +7 -0
  14. package/templates/opencode/commands/weave-new.md +7 -0
  15. package/templates/opencode/commands/weave-next.md +7 -0
  16. package/templates/opencode/commands/weave-prd.md +7 -0
  17. package/templates/opencode/commands/weave-prepare.md +7 -0
  18. package/templates/skills/weave-architect/SKILL.md +291 -0
  19. package/templates/skills/weave-architect/api-contract-template.md +21 -0
  20. package/templates/skills/weave-architect/frontend-backend-template.md +21 -0
  21. package/templates/skills/weave-architect/index-template.md +24 -0
  22. package/templates/skills/weave-architect/schema-template.md +21 -0
  23. package/templates/skills/weave-capture/SKILL.md +398 -0
  24. package/templates/skills/weave-clarify/SKILL.md +513 -0
  25. package/templates/skills/weave-execute/SKILL.md +215 -0
  26. package/templates/skills/weave-explore/SKILL.md +434 -0
  27. package/templates/skills/weave-issues/SKILL.md +441 -0
  28. package/templates/skills/weave-knowledge/SKILL.md +161 -0
  29. package/templates/skills/weave-knowledge/knowledge-templates.md +63 -0
  30. package/templates/skills/weave-new/SKILL.md +76 -0
  31. package/templates/skills/weave-next/SKILL.md +216 -0
  32. package/templates/skills/weave-prd/SKILL.md +419 -0
  33. package/templates/skills/weave-prd/prd-template.md +186 -0
  34. package/templates/skills/weave-prepare/SKILL.md +94 -0
@@ -0,0 +1,513 @@
1
+ ---
2
+ name: weave-clarify
3
+ description: Clarify and revise one existing Weave change artifact without advancing the workflow. Use when scope, requirements, assumptions, or decisions change midstream and an existing exploration.md, prd.md, or architecture.md needs amendment.
4
+ last_changed_in: 0.1.0
5
+ ---
6
+
7
+ # Weave Clarify
8
+
9
+ This skill refines one existing Weave change artifact without advancing the change workflow.
10
+
11
+ Use it when the user needs to amend `exploration.md`, `prd.md`, or `architecture.md` because scope changed, requirements changed, an assumption needs confirmation, or a previous requirement is no longer valid.
12
+
13
+ This is not a generation skill. Do not create a new change, create issues, generate a PRD from scratch, generate architecture from scratch, or cascade-update multiple artifacts.
14
+
15
+ ---
16
+
17
+ # Operating Principles
18
+
19
+ - Treat the selected target artifact as the only write target.
20
+ - Read supporting artifacts only for context.
21
+ - Ask focused clarification questions before writing when the change is ambiguous or materially affects scope, user behavior, technical direction, acceptance, or follow-up artifacts.
22
+ - Preserve still-valid content.
23
+ - Do not silently delete old requirements, decisions, constraints, or risks.
24
+ - Record superseded, removed, or narrowed scope explicitly.
25
+ - Report likely follow-up artifacts instead of editing them automatically.
26
+ - After writing the selected artifact, update lifecycle state with `weave change progress <target> --json`.
27
+ - Do not hand-edit `status.yml`; lifecycle state is owned by the CLI.
28
+ - Do not run autonomous or internal auto mode. V1 is user-invoked and interactive only.
29
+
30
+ ---
31
+
32
+ # Resolve Context
33
+
34
+ Start by discovering the current Weave session:
35
+
36
+ ```bash
37
+ weave workspace --json
38
+ ```
39
+
40
+ Use the cwd-dispatched workspace or repo context returned by `weave workspace --json` as the boundary for context loading. In workspace mode, the workspace root owns the change store and registered sub-repos in `repos[]` are implementation locations inside that single context. In repo mode, the active session's folders are the boundary.
41
+
42
+ Resolve the target change:
43
+
44
+ 1. If the user provided a change id, slug, title fragment, or other change hint, run:
45
+
46
+ ```bash
47
+ weave change status "<change-hint>" --json
48
+ ```
49
+
50
+ 2. Otherwise, run:
51
+
52
+ ```bash
53
+ weave change current --json
54
+ weave change status --json
55
+ ```
56
+
57
+ If no active or hinted change can be resolved, stop and say:
58
+
59
+ ```text
60
+ No active Weave change found. Run `weave change new` or `weave change switch`, then run `weave-clarify` again.
61
+ ```
62
+
63
+ Identify the change folder under the resolved workspace or repo context:
64
+
65
+ ```text
66
+ wiki/changes/<change-id>/
67
+ ```
68
+
69
+ In workspace mode there is one change context: the workspace root. In repo mode, do not assume every session folder is relevant; use the resolved change status and available artifacts to identify which contexts apply.
70
+
71
+ ---
72
+
73
+ # Workspace Repo Context For Clarification
74
+
75
+ In workspace mode, treat `workspace.path` as the single artifact root. Registered `repos[]` entries are available as implementation and documentation context, not separate artifact targets.
76
+
77
+ `weave-clarify` is not a broad discovery skill. Do not inventory or inspect every registered repo by default.
78
+
79
+ Inspect sub-repos only when the clarification depends on repo-local truth, such as:
80
+
81
+ - the selected artifact references a repo, module, API, schema, job, migration, test, doc, or ADR
82
+ - the user names a repo or implementation area
83
+ - the clarification changes technical direction, acceptance behavior, permissions, rollout, or integration boundaries
84
+ - architecture facet restructuring depends on where responsibilities actually live
85
+
86
+ When sub-repo context is needed, prefer repo-local docs, knowledge, specs, ADRs, and prior changes before implementation code. Use code and tests to verify important claims.
87
+
88
+ Keep inspection narrowly scoped to the selected artifact and the clarification requested. Do not use `weave-clarify` to perform broad product discovery or architecture exploration; recommend `weave-explore` or `weave-architect` when the required context is broad or uncertain.
89
+
90
+ Do not create, read, or update change artifacts under each sub-repo by default. Durable change artifacts remain under:
91
+
92
+ ```text
93
+ <workspace.path>/wiki/changes/<change-id>/
94
+ ```
95
+
96
+ If repo context influenced the clarification, mention it in the completion response:
97
+
98
+ ```text
99
+ Repo context used:
100
+ - Repos inspected:
101
+ - Docs/knowledge read:
102
+ - Code/test anchors read:
103
+ - Repos intentionally skipped:
104
+ ```
105
+
106
+ ---
107
+
108
+ # Target Artifact
109
+
110
+ Supported target artifacts:
111
+
112
+ ```text
113
+ exploration
114
+ prd
115
+ architecture
116
+ ```
117
+
118
+ Accept common filenames as aliases:
119
+
120
+ ```text
121
+ exploration.md -> exploration
122
+ prd.md -> prd
123
+ architecture.md -> architecture
124
+ architecture/index.md -> architecture
125
+ architecture/<facet>.md -> architecture
126
+ ```
127
+
128
+ If the user provides a target artifact, clarify only that artifact.
129
+
130
+ If the user does not provide a target artifact:
131
+
132
+ 1. Read the available active change artifacts.
133
+ 2. Identify which supported artifacts appear affected by the user's clarification.
134
+ 3. Ask the user which single artifact to clarify first.
135
+ 4. Do not write anything until the user selects one target.
136
+
137
+ If multiple artifacts are affected, still update only the selected artifact in this invocation. Report the others as follow-up targets in the completion response.
138
+
139
+ ---
140
+
141
+ # Required Read Order
142
+
143
+ For each relevant change folder, read files in this order.
144
+
145
+ ## 1. Target Artifact
146
+
147
+ Read the selected target first:
148
+
149
+ ```text
150
+ wiki/changes/<change-id>/exploration.md
151
+ wiki/changes/<change-id>/prd.md
152
+ wiki/changes/<change-id>/architecture.md
153
+ wiki/changes/<change-id>/architecture/index.md
154
+ wiki/changes/<change-id>/architecture/*.md
155
+ ```
156
+
157
+ For architecture, resolve artifact shape before reading:
158
+
159
+ - Legacy file mode: `architecture.md` exists and `architecture/` does not.
160
+ - Folder mode: `architecture/` exists and may contain `index.md` plus direct child facet files.
161
+ - Conflict mode: both `architecture.md` and `architecture/` exist. Stop before editing and ask whether to keep legacy file mode, migrate to folder mode, or reconcile by hand.
162
+ - Missing mode: neither exists. Stop with the architecture missing message.
163
+
164
+ If the selected target does not exist, stop with the relevant message:
165
+
166
+ ```text
167
+ No exploration.md found for <change-id>. Run `weave-explore` or `weave-capture` first, then run `weave-clarify exploration`.
168
+ ```
169
+
170
+ ```text
171
+ No prd.md found for <change-id>. Run `weave-prd` first, then run `weave-clarify prd`.
172
+ ```
173
+
174
+ ```text
175
+ No architecture artifact found for <change-id>. Run `weave-architect` and `weave-capture` first, then run `weave-clarify architecture`.
176
+ ```
177
+
178
+ ## 2. Supporting Artifacts
179
+
180
+ Read supporting artifacts when present:
181
+
182
+ ```text
183
+ wiki/changes/<change-id>/status.yml
184
+ wiki/changes/<change-id>/exploration.md
185
+ wiki/changes/<change-id>/prd.md
186
+ wiki/changes/<change-id>/architecture.md
187
+ wiki/changes/<change-id>/architecture/index.md
188
+ wiki/changes/<change-id>/architecture/*.md
189
+ wiki/changes/<change-id>/decisions.md
190
+ wiki/changes/<change-id>/contracts.md
191
+ wiki/changes/<change-id>/handoff.md
192
+ wiki/changes/<change-id>/implementation.md
193
+ wiki/changes/<change-id>/tasks.md
194
+ ```
195
+
196
+ Do not reread the target artifact twice unless needed. Use supporting artifacts to understand context, conflicts, and follow-up impact.
197
+
198
+ ## 3. Target Resume Context
199
+
200
+ Read relevant session files for the selected target when present:
201
+
202
+ ```text
203
+ wiki/changes/<change-id>/sessions/*-exploration.md
204
+ wiki/changes/<change-id>/sessions/*-prd.md
205
+ wiki/changes/<change-id>/sessions/*-architecture.md
206
+ ```
207
+
208
+ Only load session files that match the selected target artifact, newest-first.
209
+
210
+ Rules:
211
+
212
+ - Read the selected live artifact before session notes. The live artifact is canonical current truth.
213
+ - Use the latest `## Next Resume Point`, unresolved points, user preferences, and agent recommendations as clarification context.
214
+ - Use older matching session files only when needed to understand rationale or unresolved decisions.
215
+ - If session notes conflict with the selected live artifact, prefer the live artifact unless the latest session records an explicit newer user decision.
216
+ - If the user gives an explicit clarification instruction, follow it over the stored resume point.
217
+
218
+ ## 4. Knowledge Context
219
+
220
+ Read Weave knowledge files when present:
221
+
222
+ ```text
223
+ wiki/knowledge/index.md
224
+ wiki/knowledge/README.md
225
+ wiki/knowledge/domains/**/index.md
226
+ wiki/knowledge/domains/**/features/**/behavior.md
227
+ wiki/knowledge/domains/**/domain-wide/**
228
+ wiki/knowledge/shared/**/behavior.md
229
+ wiki/knowledge/**/source-map.md
230
+ ```
231
+
232
+ Load only knowledge domains that appear relevant to the clarification.
233
+
234
+ ## 5. Repo Documentation
235
+
236
+ If Weave knowledge is thin or missing, inspect existing repo documentation for product or technical context:
237
+
238
+ ```text
239
+ CONTEXT.md
240
+ CONTEXT-MAP.md
241
+ README.md
242
+ docs/
243
+ docs/adr/
244
+ adr/
245
+ ```
246
+
247
+ Use repo documentation only to clarify current behavior, terminology, constraints, or architecture context.
248
+
249
+ ---
250
+
251
+ # Clarification Flow
252
+
253
+ ## 1. Classify The Change
254
+
255
+ Classify the user's clarification as one or more of:
256
+
257
+ - scope expansion
258
+ - scope reduction
259
+ - superseded requirement or decision
260
+ - assumption confirmation
261
+ - ambiguity resolution
262
+ - technical direction change
263
+ - architecture facet restructuring
264
+ - follow-up artifact staleness
265
+
266
+ If the clarification appears to describe a substantially different change, stop and ask for explicit confirmation before repurposing the active change artifact.
267
+
268
+ ## 2. Ask Blocking Questions
269
+
270
+ Ask questions only when the answer affects:
271
+
272
+ - product scope
273
+ - user behavior
274
+ - permissions or access
275
+ - acceptance criteria
276
+ - technical direction
277
+ - implementation risk
278
+ - artifact consistency
279
+ - whether the active change should be repurposed
280
+
281
+ For each question:
282
+
283
+ - explain why it matters
284
+ - provide a recommended answer when there is a clear default
285
+ - describe the tradeoff briefly
286
+ - wait for the user's answer before writing
287
+
288
+ If no blocking questions remain, proceed with the clarification using the available context.
289
+
290
+ ## 3. Update Only The Selected Artifact
291
+
292
+ Write only the selected target artifact.
293
+
294
+ Do not edit follow-up artifacts in the same invocation, even when they are stale.
295
+
296
+ For architecture folder mode, "selected artifact" means the architecture lane. You may edit `architecture/index.md` and direct child facet files in one invocation only when the user's clarification is explicitly structural within the architecture lane.
297
+
298
+ Supported architecture structural operations:
299
+
300
+ - create facet: add `architecture/<facet>.md` when the user explicitly asks for a separate facet or a template-backed facet is clearly requested
301
+ - split facet: move a coherent concern from `index.md`, `architecture.md`, or another facet into a new facet file
302
+ - merge facets: combine two or more facet files and remove the superseded facet only after preserving still-valid content
303
+ - rename facet: move `architecture/<old>.md` to `architecture/<new>.md` and update references in `index.md`
304
+ - delete facet: remove a facet only when the user explicitly confirms the content is obsolete or preserved elsewhere
305
+ - move content: relocate content between `index.md` and facets without changing its meaning
306
+ - update index: keep `architecture/index.md` as the canonical overview and facet map
307
+
308
+ Legacy migration:
309
+
310
+ - If the user asks to split or introduce facets while only `architecture.md` exists, migrate to folder mode by creating `architecture/index.md` from the legacy file and then creating/updating facets.
311
+ - Preserve legacy lifecycle frontmatter in `architecture/index.md`.
312
+ - Remove `architecture.md` only after `architecture/index.md` and any facets contain the preserved content and the user intent clearly implies migration.
313
+ - If migration intent is unclear, ask before moving or deleting the legacy file.
314
+
315
+ When updating:
316
+
317
+ - preserve still-valid content
318
+ - Preserve existing artifact lifecycle frontmatter; if the selected artifact has no frontmatter, add compatible lifecycle frontmatter using UTC ISO timestamps for `created_at` and `updated_at`.
319
+ - update current behavior or proposed behavior to reflect the latest decision
320
+ - move removed scope to `Non-Goals` or `Out of Scope` where appropriate
321
+ - record superseded requirements or decisions in `Revision History`, `Assumptions`, `Open Questions`, or an artifact-specific notes section
322
+ - add unresolved decisions to the artifact's open-question section
323
+ - keep the artifact understandable without the conversation history
324
+
325
+ ## 4. Report Follow-Up Artifacts
326
+
327
+ After writing the selected artifact, identify other supported artifacts that may need clarification:
328
+
329
+ - If `exploration.md` changed and `prd.md` exists, report `prd.md` as a likely follow-up when product behavior, scope, requirements, or acceptance changed.
330
+ - If `prd.md` changed and `status.yml.artifacts.architecture.sources` includes `prd`, report the architecture artifact as a likely follow-up when technical design, rollout, risks, or tests may be stale.
331
+ - If the architecture artifact changed and issue/task evidence depends on `architecture`, report issues or `tasks.md` as a likely follow-up when implementation slices may be stale.
332
+
333
+ Do not edit those artifacts. Ask the user to run `weave-clarify <target>` separately for each follow-up artifact.
334
+
335
+ ---
336
+
337
+ # Target-Specific Rules
338
+
339
+ ## exploration
340
+
341
+ Use `exploration.md` as the target when discovery, scope, scenarios, decisions, or PRD readiness changed.
342
+
343
+ Keep these sections current when present:
344
+
345
+ ```text
346
+ Current Understanding
347
+ Open Questions
348
+ Decisions
349
+ Scenarios
350
+ Existing Behavior
351
+ PRD Readiness
352
+ ```
353
+
354
+ If the clarification makes the exploration ready or not ready for PRD generation, update `PRD Readiness`.
355
+
356
+ ## prd
357
+
358
+ Use `prd.md` as the target when product behavior, user workflows, user stories, requirements, edge cases, acceptance criteria, rollout, assumptions, or open questions changed.
359
+
360
+ Preserve still-valid PRD content. If scope narrowed, move removed behavior to `Non-Goals` or `Out of Scope` instead of silently deleting it.
361
+
362
+ Add a concise dated `Revision History` entry for meaningful changes.
363
+
364
+ ## architecture
365
+
366
+ Use the architecture artifact as the target when technical approach, affected systems, data flow, architecture decisions, rejected alternatives, rollout, operations, testing, security, risks, assumptions, open technical questions, or architecture facet structure changed.
367
+
368
+ Prefer `prd.md` as the product contract. If the technical clarification exposes a product ambiguity not settled by the PRD, record it under `Product Questions Raised by Technical Design` and report `prd.md` as a follow-up artifact.
369
+
370
+ Add a concise dated `Revision History` entry for meaningful changes.
371
+
372
+ ---
373
+
374
+ # Output Path
375
+
376
+ Write the clarified artifact to exactly one of:
377
+
378
+ ```text
379
+ wiki/changes/<change-id>/exploration.md
380
+ wiki/changes/<change-id>/prd.md
381
+ wiki/changes/<change-id>/architecture.md
382
+ wiki/changes/<change-id>/architecture/index.md
383
+ wiki/changes/<change-id>/architecture/*.md
384
+ ```
385
+
386
+ Do not write any other files.
387
+
388
+ ---
389
+
390
+ # Lifecycle Progress
391
+
392
+ After successfully writing the selected artifact, run the matching lifecycle command:
393
+
394
+ ```bash
395
+ weave change progress exploration --source discussion --json
396
+ weave change progress prd --source exploration --source sessions --json
397
+ weave change progress architecture --source prd --source codebase --json
398
+ ```
399
+
400
+ Run only the command matching the selected target artifact and pass only sources that actually informed the clarified artifact. If lifecycle progress fails, do not rewrite the clarified artifact just to recover. Report the progress failure in the completion response.
401
+
402
+ ---
403
+
404
+ # Completion Response
405
+
406
+ After writing, respond with:
407
+
408
+ ```text
409
+ Clarified <target>: wiki/changes/<change-id>/<artifact-path>
410
+ ```
411
+
412
+ Then include:
413
+
414
+ ```text
415
+ Clarifications applied: <count or concise summary>
416
+ Open questions: <count>
417
+ Follow-up artifacts:
418
+ - <artifact or None>
419
+ ```
420
+
421
+ If repo context influenced the clarification, also include:
422
+
423
+ ```text
424
+ Repo context used:
425
+ - Repos inspected:
426
+ - Docs/knowledge read:
427
+ - Code/test anchors read:
428
+ - Repos intentionally skipped:
429
+ ```
430
+
431
+ If no write was made because the skill needed target selection, confirmation, or answers to blocking questions, say that directly and list what is needed next.
432
+
433
+ ---
434
+
435
+ # Silent Weave Command Output
436
+
437
+ Weave skills run Weave CLI commands silently by default. Use command results
438
+ as internal context, not response content.
439
+
440
+ Do not show raw stdout, JSON payloads, command echoes, lifecycle payloads,
441
+ internal state-write confirmations, or verbatim notice text unless the user
442
+ explicitly asks for diagnostic output.
443
+
444
+ Surface only information that changes what the user or agent should do next:
445
+ blockers, failures, missing relevant repos, branch or task outcomes,
446
+ lifecycle failures, package-outdated notices, relevant outdated or modified
447
+ skills, and user-required actions.
448
+
449
+ Notice handling:
450
+
451
+ - `package_outdated`: show only when present. Say exactly:
452
+ `A newer Weave version is available. Run \`weave status\` for details, then upgrade Weave when convenient.`
453
+ - `skills_outdated`: suppress unrelated skills. If the invoked skill is outdated, say:
454
+ `The installed \`<skill-name>\` skill appears older than the bundled template. Run \`weave status\` for details, then \`weave agent update --all\` when you want to refresh installed skills.`
455
+ - `skills_outdated`: if multiple skills used in this workflow are outdated, say:
456
+ `Some installed skills used in this workflow appear older than the bundled templates: \`<skill-a>\`, \`<skill-b>\`. Run \`weave status\` for details, then \`weave agent update --all\` when you want to refresh them.`
457
+ - `skills_modified`: suppress unless the invoked skill is modified locally or the user is asking about skill updates. If the invoked skill is modified, say:
458
+ `The installed \`<skill-name>\` skill has local edits, so its behavior may differ from the bundled template. Run \`weave status\` or \`weave agent diff\` if you want to inspect the difference.`
459
+ - `skills_modified`: if the user asks to update skills and installed skills have local edits, say:
460
+ `Some installed skills have local edits. \`weave agent update\` may skip or protect them; run \`weave status\` or \`weave agent diff\` before updating.`
461
+
462
+ Do not say `Notices: ...`, `The command returned notices`, raw
463
+ `notices[].message`, full notice JSON, or full skill lists unless the user
464
+ asks for diagnostics.
465
+
466
+ ---
467
+
468
+ # Lifecycle Staleness Verification
469
+
470
+ Before calling `weave change progress`, verify content-sync of every artifact
471
+ that would otherwise be marked stale by the default pessimistic propagation.
472
+
473
+ The `--source` arguments of `weave change progress` declare causal influence,
474
+ not strict-DAG dependency. Pessimistic staleness propagation is the safe default,
475
+ not the only correct answer. When the clarification this skill just performed is
476
+ narrowly contained (a typo fix, a sentence rewording, an open-question
477
+ resolution), dependents may already be in content sync; flagging them stale
478
+ creates churn the user did not ask for.
479
+
480
+ Procedure:
481
+
482
+ 1. Identify the set of structural dependents of the lane being progressed. Read
483
+ `wiki/changes/<change-id>/status.yml` and compute which lanes list this
484
+ lane in their `artifacts.<lane>.sources`.
485
+ 2. For each dependent lane, read both the dependent artifact and the artifact
486
+ just being progressed. Decide whether the change you just made invalidates
487
+ the dependent's content. The judgement is binary per lane: invalidates, or
488
+ does not invalidate.
489
+ 3. Select the appropriate progress invocation:
490
+
491
+ - Every dependent is invalidated (or there are no dependents):
492
+ `weave change progress <lane> --source <list> --json` (default, no new flags)
493
+ - No dependent is invalidated:
494
+ `weave change progress <lane> --source <list> --no-invalidate --json`
495
+ - Some dependents are invalidated, some are not:
496
+ `weave change progress <lane> --source <list> --invalidate=<comma-list> --json`
497
+
498
+ 4. If a previously-stale dependent is now in content sync (because the upstream
499
+ change has been absorbed but the stale flag still lingers from an earlier
500
+ pessimistic propagation), clear it explicitly:
501
+
502
+ `weave change clear-stale <lane> --reason "<one-sentence verification>" --json`
503
+
504
+ Always pass `--reason` so the audit entry in `stale_history` carries the
505
+ verification rationale. Do not clear flags without reading both artifacts.
506
+
507
+ 5. Never edit `status.yml` by hand to manipulate stale state. Use the CLI.
508
+
509
+ Failure mode: if you are uncertain whether a dependent is in content sync,
510
+ prefer the pessimistic default (omit `--no-invalidate` and `--invalidate`).
511
+ The user can always run `weave-clarify <lane>` later. A false-positive stale
512
+ flag is recoverable; silently leaving a real downstream artifact mismatched is
513
+ not.