imprint-mcp 0.6.6 → 0.7.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.
Files changed (122) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +340 -16
  3. package/package.json +2 -2
  4. package/prompts/audit-agent.md +25 -4
  5. package/prompts/auth-compile-agent.md +195 -34
  6. package/prompts/build-planning.md +3 -3
  7. package/prompts/compile-agent.md +932 -180
  8. package/prompts/component-recovery.md +40 -0
  9. package/prompts/live-verifier-agent.md +10 -3
  10. package/prompts/master-teach-api-researcher.md +813 -0
  11. package/prompts/master-teach-baseline-mvp-review.md +217 -0
  12. package/prompts/master-teach-completion-review.md +188 -0
  13. package/prompts/master-teach-decision.md +910 -0
  14. package/prompts/master-teach-focused-planner.md +777 -0
  15. package/prompts/master-teach-parameter-advisor.md +58 -0
  16. package/prompts/master-teach-recording-evidence.md +19 -0
  17. package/prompts/master-teach-refine-plan.md +7 -0
  18. package/prompts/master-teach-tool-advisor.md +130 -0
  19. package/prompts/playbook-compilation.md +45 -54
  20. package/prompts/prereq-builder.md +28 -6
  21. package/prompts/prereq-planner.md +2 -2
  22. package/prompts/tool-candidate-detection.md +70 -39
  23. package/prompts/tool-planning.md +3 -3
  24. package/src/cli.ts +212 -164
  25. package/src/imprint/agent-tool.ts +15 -0
  26. package/src/imprint/agent.ts +49 -44
  27. package/src/imprint/api-research-agent.ts +933 -0
  28. package/src/imprint/audit.ts +84 -15
  29. package/src/imprint/auth-browser-discovery.ts +276 -0
  30. package/src/imprint/auth-compile-agent.ts +610 -251
  31. package/src/imprint/auth-compile-tools.ts +233 -73
  32. package/src/imprint/auth-discovery-evidence.ts +81 -0
  33. package/src/imprint/auth-plan.ts +28 -0
  34. package/src/imprint/auth-verifier.ts +239 -36
  35. package/src/imprint/authentication-interaction.ts +137 -0
  36. package/src/imprint/backend-ladder.ts +711 -395
  37. package/src/imprint/body-structure.ts +656 -0
  38. package/src/imprint/build-plan.ts +35 -345
  39. package/src/imprint/cdp-browser-fetch.ts +926 -82
  40. package/src/imprint/cdp-jar-cache.ts +7 -12
  41. package/src/imprint/chromium.ts +93 -29
  42. package/src/imprint/claude-cli-compile.ts +278 -320
  43. package/src/imprint/codex-cli-compile.ts +529 -350
  44. package/src/imprint/codex-sdk-turn.ts +102 -0
  45. package/src/imprint/compile-agent-types.ts +58 -15
  46. package/src/imprint/compile-agent.ts +222 -274
  47. package/src/imprint/compile-done-sentinel.ts +211 -0
  48. package/src/imprint/compile-provider-control.ts +401 -0
  49. package/src/imprint/compile-provider-recovery.ts +142 -0
  50. package/src/imprint/compile-strategy.ts +5 -0
  51. package/src/imprint/compile-tool-executor.ts +783 -0
  52. package/src/imprint/compile-tools.ts +1727 -3096
  53. package/src/imprint/compile-verification.ts +11 -1
  54. package/src/imprint/compile.ts +110 -29
  55. package/src/imprint/compiler-log.ts +28 -0
  56. package/src/imprint/compiler-process.ts +440 -0
  57. package/src/imprint/component-recovery.ts +120 -0
  58. package/src/imprint/concurrency.ts +43 -58
  59. package/src/imprint/cookie-jar.ts +117 -7
  60. package/src/imprint/credential-extract.ts +10 -90
  61. package/src/imprint/credential-lock.ts +146 -0
  62. package/src/imprint/credential-observation.ts +261 -0
  63. package/src/imprint/credential-store.ts +247 -44
  64. package/src/imprint/emit.ts +18 -2
  65. package/src/imprint/evidence-inspection.ts +55 -0
  66. package/src/imprint/freeform-redact.ts +34 -234
  67. package/src/imprint/import-module-fresh.ts +30 -0
  68. package/src/imprint/live-component-recovery.ts +73 -0
  69. package/src/imprint/live-finesse-runner.ts +299 -0
  70. package/src/imprint/live-verifier.ts +299 -358
  71. package/src/imprint/llm.ts +467 -422
  72. package/src/imprint/log.ts +15 -8
  73. package/src/imprint/login.ts +9 -0
  74. package/src/imprint/master-teach-agent-contracts.ts +912 -0
  75. package/src/imprint/master-teach-agents.ts +3065 -0
  76. package/src/imprint/master-teach-checks.ts +348 -0
  77. package/src/imprint/master-teach-controller.ts +7702 -0
  78. package/src/imprint/master-teach-plan.ts +1410 -0
  79. package/src/imprint/master-teach-prompt-projections.ts +349 -0
  80. package/src/imprint/master-teach-store.ts +961 -0
  81. package/src/imprint/mcp-cdp-sessions.ts +60 -0
  82. package/src/imprint/mcp-compile-server.ts +64 -1001
  83. package/src/imprint/mcp-live-verifier-server.ts +246 -190
  84. package/src/imprint/mcp-server.ts +46 -57
  85. package/src/imprint/native-agent-pass.ts +260 -0
  86. package/src/imprint/native-agent-usage.ts +141 -0
  87. package/src/imprint/native-teach-agents.ts +619 -0
  88. package/src/imprint/param-grounding.ts +488 -347
  89. package/src/imprint/playbook-runner.ts +254 -63
  90. package/src/imprint/prereq-builder.ts +55 -543
  91. package/src/imprint/private-file.ts +18 -0
  92. package/src/imprint/probe-backends.ts +129 -33
  93. package/src/imprint/provider-retry.ts +501 -0
  94. package/src/imprint/provider-terminal.ts +214 -0
  95. package/src/imprint/recording-request.ts +290 -1
  96. package/src/imprint/recording-verification.ts +444 -0
  97. package/src/imprint/redact.ts +33 -749
  98. package/src/imprint/refine-worker.ts +326 -0
  99. package/src/imprint/refine.ts +241 -0
  100. package/src/imprint/replay-capture.ts +41 -12
  101. package/src/imprint/replay-evidence.ts +1007 -0
  102. package/src/imprint/research-response-evidence.ts +45 -0
  103. package/src/imprint/runtime.ts +867 -138
  104. package/src/imprint/sensitive-keys.ts +0 -6
  105. package/src/imprint/session-merge.ts +103 -7
  106. package/src/imprint/stealth-chromium.ts +67 -7
  107. package/src/imprint/stealth-fetch.ts +25 -8
  108. package/src/imprint/stealth-token-cache.ts +16 -16
  109. package/src/imprint/teach-browser-resources.ts +88 -0
  110. package/src/imprint/teach-plan.ts +0 -242
  111. package/src/imprint/teach-research-memory.ts +229 -0
  112. package/src/imprint/teach-stage-progress.ts +38 -0
  113. package/src/imprint/teach-state.ts +47 -625
  114. package/src/imprint/teach.ts +12 -3699
  115. package/src/imprint/terminal-user-prompt.ts +42 -0
  116. package/src/imprint/tool-candidates.ts +58 -210
  117. package/src/imprint/tool-loader.ts +3 -0
  118. package/src/imprint/tool-plan.ts +1 -134
  119. package/src/imprint/tracing.ts +24 -7
  120. package/src/imprint/types.ts +113 -21
  121. package/src/imprint/user-interaction.ts +836 -0
  122. package/src/imprint/endpoint-key.ts +0 -23
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to Imprint. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) (Added / Changed / Deprecated / Removed / Fixed / Security).
4
4
 
5
+ ## [0.7.0] — 2026-10-14
6
+
7
+ ### Added
8
+ - Master-led teaching with editable operation plans, focused agent passes, and dependency-aware tool compilation.
9
+ - Independent verification receipts and retained evidence for generated tool and producer-to-consumer checks.
10
+
11
+ ### Changed
12
+ - Partial teaches keep ready tools but exit nonzero when planned work remains unresolved.
13
+ - `imprint teach` emits the MCP server; `imprint install` connects it to an AI platform.
14
+ - CI runs the network-isolated verifier suite on macOS and static checks on Linux.
15
+
16
+ ### Fixed
17
+ - Cancelled teaching work no longer starts a late tool invocation.
18
+ - Completed native assignments release their prompt and response data from the active queue.
19
+ - `.redacted.json` is atomically replaced with private file permissions.
20
+ - A whole-playbook deadline governs a hanging step even when its step timeout is nearby.
21
+
22
+ ### Validation
23
+ - The Flights58 run completed with 14/14 tools and passed 30/30 independently graded cases, including fresh booking chains. Flights59–62 ended partial, so repeatability and Hotels destination/date validation remain outstanding. See [the validation timeline](timeline.md).
24
+
25
+ ---
26
+
5
27
  ## [0.2.0] — 2026-05-14
6
28
 
7
29
  v0.2 overhauls the teach-to-tool pipeline, adds full observability tracing, and introduces state-aware API replay. 12 new features, 7 bug fixes across 24 commits.
package/README.md CHANGED
@@ -20,6 +20,21 @@ The recording *is* the executable.
20
20
 
21
21
  ---
22
22
 
23
+ Authentication work stays visible through operation handles and reusable context
24
+ references. Agents choose whether to continue a retained context or start another;
25
+ native verification and browser checkpoints return within the same assignment.
26
+ Native compiler tools share the host executor; failed calls retain their duration
27
+ and error code so a live process cannot hide a broken compiler connection.
28
+ Plan/research differences are advisory construction facts. Changed artifacts still
29
+ need their own live checks. See [authentication and repair](docs/architecture.md#agent-questions-and-authentication).
30
+
31
+ Timed-out questions release the terminal input queue; declared nonsecret choices
32
+ remain readable by the agent. Successful browser-backed data calls can preserve
33
+ renewed cookies for later calls without overwriting newer saved authentication.
34
+ Same-name host-only and domain cookies keep their distinct scopes across replay
35
+ and browser restoration.
36
+ That continuity still needs verification against the requested data operation.
37
+
23
38
  ## Quick Start
24
39
 
25
40
  ```bash
@@ -27,7 +42,7 @@ bun install -g imprint-mcp
27
42
  imprint teach southwest --url https://www.southwest.com
28
43
  ```
29
44
 
30
- A browser opens. You drive the workflow and narrate what you're doing. Imprint records every request and interaction, then compiles a deterministic **MCP tool** your agent can call forever.
45
+ A browser opens. You drive the workflows and narrate what you're doing. Imprint records every request and interaction, then compiles the complete discovered set of deterministic **MCP tools** your agent can call later.
31
46
 
32
47
  Want to try a finished MCP before recording anything?
33
48
 
@@ -81,7 +96,7 @@ regenerate/record it with `bun scripts/demo-teach.ts`.)*
81
96
  </td>
82
97
  <td align="center" width="33%">
83
98
  <h3>2. Compile</h3>
84
- <p>Generates two replay artifacts:<br><br><code>workflow.json</code> — API-level replay<br><code>playbook.yaml</code> — DOM-level fallback<br><br>Credentials are redacted automatically.</p>
99
+ <p>Builds an API workflow when the recording supports one. A DOM playbook is the final fallback, used only when the agent finds the faster replay paths incompatible.<br><br>Known login credentials are replaced with credential placeholders; other recorded data remains available to the agents.</p>
85
100
  </td>
86
101
  <td align="center" width="34%">
87
102
  <h3>3. Use</h3>
@@ -91,12 +106,305 @@ regenerate/record it with `bun scripts/demo-teach.ts`.)*
91
106
  </table>
92
107
 
93
108
  > [!TIP]
94
- > All three steps happen in a single `imprint teach` command. Credentials and PII are redacted automatically before anything reaches the LLM.
95
-
96
- When one recording yields multiple tools, all candidates are selected by default.
97
- Imprint automatically includes upstream lookup/producer tools required by any
98
- selected downstream tool. Use `--primary-tool` to compile only the primary tool
99
- and its prerequisites; `--all-tools` makes the default full-set selection explicit.
109
+ > Recording and compilation happen in one foreground `imprint teach` command. Install the completed tools in your MCP client with `imprint install`. Only known user-supplied login credentials are replaced before teaching; cookies, API tokens, responses, and personal data remain visible to the agents.
110
+
111
+ Existing `${credential.NAME}` references in an already-redacted recording reuse
112
+ values from your local credential backend. They do not replace saved passwords
113
+ with placeholder text. MFA may still require your input.
114
+
115
+ Request-building errors return to the compile agent as verification feedback,
116
+ including errors from asynchronous transforms, so it can repair the request
117
+ and retry.
118
+
119
+ Recordings and logs, including files named `.redacted.json`, are not safe to share publicly. Automatic PII and token redaction is disabled; review any file before sharing it.
120
+ Imprint writes `.redacted.json` with private file permissions. A teach that leaves
121
+ planned tools unresolved reports a partial result and exits nonzero, even if some
122
+ ready tools were published.
123
+
124
+ Teaching agents and standalone compilers can ask questions in the foreground
125
+ terminal, including login approvals, MFA/OTP codes, and missing information.
126
+ Questions from concurrent agents appear one at a time; secret input is masked
127
+ and returned to agents as temporary references. Authentication uses the existing
128
+ auth compiler to continue the same browser and challenge. Later recovery requests
129
+ retain that auth work within the teach. Agents first check or restore existing
130
+ access before starting another login. Compiled actions can branch on current
131
+ responses to reuse authenticated access or continue an observed challenge;
132
+ retaining a browser alone does not guarantee MFA is avoided.
133
+ Identical concurrent requests share the active
134
+ attempt; a previous success never substitutes for the caller's own data check.
135
+ Failed teach checks reach a focused component recovery agent before broader
136
+ plan repair. It can renew authentication, repair the caller's artifact or a
137
+ declared prerequisite through its retained compiler, or dispatch a registered
138
+ shared runtime component owner. State recovery immediately retries the built
139
+ caller; prerequisite repair rebuilds the selected owner and binds fresh outputs
140
+ into consumer checks. Accepted contracts and unrelated builds remain intact.
141
+ Every actual failed and retried call stays in the check history. Unknown owners
142
+ or changes to contracts, strategy, or dependencies return to the master.
143
+ When the live login offers a flow missing from the recording, the auth agent can
144
+ operate its verification browser and capture additional request/response evidence.
145
+ It can learn the offered flow before requesting the actual OTP or approval, then
146
+ compile and verify its replay. Original recordings remain unchanged; discovering
147
+ or manually completing a flow alone does not prove reusable authentication.
148
+ Run without
149
+ `--no-interactive` when answers may be needed. Detached runs and piped terminals
150
+ report input as unavailable. Browser closure during stealth user-agent setup
151
+ returns through the existing setup-error handling instead of terminating teach.
152
+ On hosts with limited RAM or disk for swap, set `IMPRINT_TEACH_LOW_MEMORY=1`
153
+ to run live data checks one at a time. Successive checks in the same research
154
+ pass reuse its browser; a competing pass evicts that browser before using its
155
+ own isolated context. Authentication keeps its persistent browser across MFA prompts.
156
+ Closing an Imprint-owned browser removes its temporary Chrome profile. Explicit
157
+ profiles, including `record --persist-profile`, are retained; recordings and run
158
+ evidence are stored separately.
159
+
160
+ For every teach, a master agent accounts for the complete discovered operation
161
+ set. Focused advisors review tool boundaries and parameters, focused planners
162
+ map one tool at a time, and focused compilers build one tool at a time. The
163
+ master chooses the build waves: independent tools can run together, while a
164
+ producer runs before its consumers. Failed checks return factual evidence to
165
+ the master, which can revise the affected tool and its dependants without
166
+ rebuilding unrelated tools. Recorded response availability is supplied before
167
+ MVP selection. The boundary advisor and master receive the same human scope.
168
+ Agents choose separate tools for distinct recorded purposes before narrowing each
169
+ tool's inputs; unsupported purposes remain explicit coverage limits. Invalid focused-planner reports return exact diagnostics to the
170
+ master for repair while preserving successful sibling proposals; they never
171
+ become accepted execution plans. The retained master receives changed research
172
+ handoffs without repeatedly resending unchanged history; host validation still
173
+ uses the full evidence. Codex teaches use one native agent family, with up to ten
174
+ concurrent children. Agents can delegate further and continue the same conversations
175
+ through repairs. Each research pass stays in one native assignment: test and
176
+ inspection results return directly to that researcher, with the same host validation.
177
+ Master, planner and reviewer repairs and shared-memory queries use that same channel,
178
+ without routing every intermediate response through the parent.
179
+ Inspected alternative requests carry their nearest recorded action, and agents
180
+ explain how any substituted request compares with the selected purpose. Shared
181
+ research delivers a short index; detailed methods and failed approaches are
182
+ stored as immutable assets that agents read only when relevant.
183
+ Independent research calls keep separate browser state and reserve paced start times
184
+ without holding a shared site lock through slow responses.
185
+ Master-directed follow-ups resume the same child. Codex owns child lifecycle and concurrency; Imprint retains
186
+ provider retries, deadlines, execution tools and strict evidence checks. Other
187
+ providers retain their existing execution paths with four focused workers.
188
+ Independent research repairs share the master’s parallel waves; dependent repairs,
189
+ compilation and execution follow the accepted producer ordering. Compiler conversations
190
+ survive revision-directory changes, and finished tools enter verification immediately
191
+ while independent siblings continue compiling. Consumers still wait for verified producers.
192
+ Capture timeouts group repeated endpoint facts so telemetry does not crowd out
193
+ distinct responses, while keeping matching and readiness rules unchanged.
194
+ Research request diagnostics also show bounded decoded body differences, helping
195
+ agents distinguish changed inputs from accidental nesting or encoding changes.
196
+ Agents judge those differences; they are not an automatic pass/fail rule.
197
+
198
+ Before that tool's planning, one retained researcher conversation first proves the
199
+ smallest useful API call. If part of the selected MVP contract or a required
200
+ downstream value is still unproven, the researcher returns that working partial
201
+ result instead of pretending it is complete or discarding it. Optional breadth
202
+ waits for the later best-effort pass. Once all first passes finish, the master
203
+ can send the exact missing question back to that same conversation with only
204
+ the relevant sibling results and recorded requests.
205
+ An independent proven tool can prepare its plan and compile a draft while
206
+ other research continues, when no queued research needs that attention. The master still
207
+ reviews the complete plan before normal verification and publication; only an
208
+ exactly matching draft is reused. With native delegation, completed research reaches
209
+ the master while unrelated drafts finish. Those drafts settle before final planning
210
+ can reuse or replace them. Declared consumers retain producer-first ordering.
211
+ The terminal names each tool entering detailed planning and each master review,
212
+ reports elapsed waiting time every 30 seconds, and reports when that stage
213
+ finishes or stops. A waiting update means the stage has not returned yet.
214
+ Researchers can call proven sibling requests with fresh inputs before testing a
215
+ consumer; recorded continuation values are not a substitute for fresh output.
216
+ Compilers can inspect full retained responses from that tool's earlier research
217
+ through a local index, then choose relevant repeat and contrast cases for offline
218
+ checks. Each observation keeps its own inputs, outcome and response chain. Researchers can
219
+ query an entire retained response with a bounded, offline data projection; failed
220
+ queries return for repair, and projected output is labelled separately from raw text.
221
+ Teaching now selects a fixed set of recording-backed examples and matches live calls to those examples, changing only expired dates or state. A separate evidence reader establishes expected facts from raw recorded/live responses before seeing parser output, then judges the parser against those facts. Citations can quote the original response bytes or their displayed JSON representation. Each selected live case is reviewed against its matched recorded response chain; unrelated fixtures are left for their own case reviews. Every selected live case and declared dependency chain must pass before publication. Missing coverage is unverified, and raw failures stay with the draft for repair. Fixture bodies are checked before compilation, and research history and inspected recording evidence survive same-run contract revisions. Grounded input mappings are kept separate from the limits of the recorded test cases; missing contrasts alone should not freeze a tool to recorded constants. Research can batch selected calls sequentially and retain isolated browsers during agent thinking. Bootstrap snapshots are cached separately by the requested URL, and capture failures show which matcher conditions failed; cold-start setup remains unchanged. Readiness failures state when no actions have started, and schema repair errors name the exact required fields. These checks need fresh repeated validation before a reliability claim.
222
+
223
+ Repair or extend an installed data tool with `imprint refine <site> --tool <name> --issue "<change>" --from-session <recording.json>`. Refinement works in an isolated staging home, preserves existing parameter contracts, and requires recording/live verification plus a strict audit before replacement. Failed refinements preserve installed tools and local evidence. Use `imprint audit <site> --strict` to reject known broken calls even when the aggregate score exceeds 95%. See [targeted refinement](docs/refinement.md). Audits forward explicitly set browser settings (`CHROMIUM_PATH`, `IMPRINT_CDP_HEADED`, `IMPRINT_JAR_MAX_AGE_SECONDS`, `IMPRINT_PROXY`, and `DISPLAY`) into their isolated MCP server for either audit provider. See [audit troubleshooting](docs/troubleshooting.md#imprint-audit--scoring-a-sites-generated-tools).
224
+
225
+ MVP reviewers see the checked request and parser code alongside live results.
226
+ Publication retains the backend from that exact reviewed passing call in
227
+ `backends.json`, so a fresh MCP process starts on the tested path. This records
228
+ one execution choice, not a cold/warm benchmark or proof of repeatability.
229
+ They also receive actual research comparisons and inspected response excerpts,
230
+ not just the researcher's explanation of what those tests proved.
231
+ Agents are instructed to distinguish competing meanings of ambiguous fields
232
+ with focused evidence, rather than treating a coincidentally matching number
233
+ as proof. Uncertain mappings go back to the master for research or a narrower MVP.
234
+ Invalid research handoffs also return to the master with their actual test
235
+ history, rather than ending the whole teach or counting as an API failure.
236
+ Browser snapshots are reused by tool and rung without cookie-name requirements.
237
+ An explicit bootstrap URL runs before resolving request URLs that need its
238
+ captured state. MCP closes an idle or timed-out tool's CDP sessions without
239
+ closing another tool's browser, and a cancelled call does not start another rung.
240
+ Fetch-bootstrap tries the API request before deciding whether to escalate; a
241
+ missing cookie marker is not reported as an HTTP failure.
242
+ Rewording auth or token notes reuses that proof; the master explicitly requests
243
+ new research when the actual strategy changes.
244
+ The final reviewer receives the same human scope and checks requested tool
245
+ connections rather than requiring explicitly excluded operations.
246
+ If an agent mistypes run metadata, repair feedback supplies the exact current values.
247
+ Recorded page references support generated API-navigation URLs; the final URL
248
+ need not appear literally in the recording, but must be grounded and live-tested.
249
+ Tool handoffs use agent-selected concrete result paths, not array wildcards.
250
+ Binding failures explain the path problem and distinguish it from an API call failure.
251
+ Result reviewers see the actual invocation inputs; an unrelated planned test's
252
+ expected answer is never substituted for the research baseline or a chain call.
253
+ A successful chain result can be reviewed even if a standalone test failed;
254
+ that failed test remains visible and still prevents completion until repaired.
255
+ Compiler guidance separates a returned value's location from its meaning and
256
+ omits uncertain optional metadata instead of filling it from unrelated matching
257
+ shapes. Extra responses used to corroborate research stay in the evidence;
258
+ required execution requests must contribute necessary state or core output.
259
+ Agents ground rendered-result completion checks in core content and inspect
260
+ observed layout variations before treating an incidental element as required.
261
+ Agents can scope a background response capture to a specific navigation click.
262
+ Requests started before that action cannot satisfy the capture, including ones
263
+ that finish later. Without an action boundary, capture starts with navigation.
264
+ Navigation clicks wait for the selected target to become clickable within the
265
+ existing navigation deadline, then dispatch once. Failed clicks report bounded
266
+ match, geometry, computed-style and center-hit facts so agents can repair their
267
+ chosen interaction from actual page evidence.
268
+ Before accepting a navigation capture as reusable, researchers repeat a valid
269
+ input and compare a small core-input variation with the same candidate. They
270
+ reuse existing decisive observations and distinguish session reuse from setup.
271
+ When a background capture fails despite current page results, agents inspect
272
+ their delivery source, including structured document data. Changing the baseline
273
+ input does not repair the failed valid case. Reviewers trace ambiguous metadata
274
+ to its context; matching keywords or units alone cannot justify a named field.
275
+ Compilers test the complete current research response before live validation,
276
+ including result frames beyond initial metadata, alongside recording examples.
277
+ For a request chain, they receive its actual ordered response bodies as a local
278
+ offline fixture. They test associations using current response identities and
279
+ unmatched records, rather than copying one example's values into parser logic.
280
+ For framed protocols, a small parser test checks that an earlier empty or metadata
281
+ frame does not hide later records; agents derive the expected result from evidence.
282
+ Failed browser calls can include bounded page evidence from browser inspection,
283
+ including through fallback and MCP audit errors. Agents use it to investigate missing
284
+ captures without treating a timeout as automatic infrastructure failure or rendered
285
+ text as API success. Network-capture timeouts also include a bounded list of
286
+ observed response endpoints, methods, resource types, statuses and navigation
287
+ scope facts, with omitted counts. These facts help agents compare a failed
288
+ matcher with actual traffic; they do not change response selection.
289
+ Parser checks distinguish unsupported missing fields from evidenced protocol defaults.
290
+ Auditors receive exact report tool names.
291
+ Planning and final review also check how callers obtain required inputs,
292
+ without relying on identifiers hidden in the recording.
293
+ Research uses a small contrasting core-input check before claiming parameter
294
+ mappings are proven; optional parameter breadth remains deferred.
295
+ Agents check the advertised meaning, not just whether results change; a range
296
+ contrast distinguishes its bounds from a fixed result region that merely moves.
297
+ Handoffs identify the response evidence that establishes the core records' scope
298
+ for the compiler to preserve. Demonstrated ignored inputs return for contract
299
+ revision; they are not deferred as optional minimization. Audits distinguish a
300
+ bound pair's combined behavior from proof of each input's individual effect.
301
+ For rendered results after navigation or actions, agents verify that the current
302
+ collection finished rendering; document load, a page shell, or an updated control
303
+ alone cannot establish readiness. When timing is uncertain, agents compare
304
+ initial setup with changed-input calls in the same tool's warm session.
305
+ Selection handling respects structured field boundaries and complete identities.
306
+ Checking an input does not prove that it selects the corresponding result.
307
+ That contrast must distinguish claimed mappings from defaults; changing one
308
+ input does not prove the others, and unproven mappings return for follow-up.
309
+ The master reviews that evidence even when research labels itself proven;
310
+ missing proof within one tool can return to its retained researcher.
311
+ Live verification uses the planner's selected test inputs, not a replacement
312
+ with the research baseline; the proven backend remains reusable.
313
+ The planner chooses that first live case to challenge weak core evidence;
314
+ additional unexecuted cases are not claimed as coverage.
315
+ Research handoff repair reports independent missing fields together, so one
316
+ repair turn can correct the candidate, test reference, and remaining proof gaps.
317
+ If a repair exposes further schema errors, the same conversation can correct
318
+ them within the shared deadline. Identical rejected outputs stop the repair loop;
319
+ invalid decisions never execute.
320
+ Blocked terminal counts include unresolved discoveries even when no tool was planned.
321
+ Researchers can inspect or search bounded portions of retained live results,
322
+ including HTML attributes and embedded state, without repeating the API call.
323
+ Compilers receive the selected research call's full saved response and inputs
324
+ for offline parser tests, not just a written summary. This evidence stays out of
325
+ published runtime artifacts.
326
+ After live failures, the master can return an unchanged tool to its retained
327
+ researcher with the actual failure evidence, then replan only the affected tool.
328
+ MVP reviewers receive the checked build's parser to distinguish observed values
329
+ from input echoes; audits require an attributable effect, not merely changed ordering.
330
+ Server-returned query text is also an echo, not proof of applied settings.
331
+ Final review also sees prior semantic rejections and their actual inputs, so a
332
+ later passing baseline does not silently erase an unresolved core failure.
333
+ MVP reviewers check returned values against their claimed meaning: optional
334
+ breadth can wait, but mislabeled data is a repair, not polish.
335
+ If the Codex child reports missing stdin despite a non-empty prompt, Imprint
336
+ retries that exact delivery once on the same conversation and deadline.
337
+
338
+ Researchers can return a concrete input or dependency gap for a master decision
339
+ without exhausting transport permutations. The master coordinates affected
340
+ producer outputs and consumer inputs together; fresh live proof is still required.
341
+ Agents can plan repeated calls to the same tool and bind each call to an exact
342
+ prior result. The runtime checks a finite invocation order and invalidates dependent
343
+ proof when that source result changes; a continuation does not require a separate
344
+ public tool. Existing single-call plans retain their behavior.
345
+ Chain checks and audits compare actual producer record structures with the
346
+ consumer's public contract. One selected record can contain several members;
347
+ unless explicitly excluded, an available fresh multi-member record is checked
348
+ and compared with the complete consumer result.
349
+ A passing singleton check does not establish that every selected member survives.
350
+ Validation, request construction, and parsing keep group properties separate
351
+ from member properties; a valid group need not repeat its overall fields on every
352
+ member. Parsers preserve the distinction between alternatives and required
353
+ components, including when action links exist only on components. Verification
354
+ compares eligible source records with the output and checks each attribute against
355
+ its own evidence; a plausible subset or matching sibling value is insufficient.
356
+ Missing optional details must not erase required members, and constructed
357
+ selections must preserve the complete selected record through the consumer result.
358
+ Reviewers also report
359
+ explicit parser or request guards that reject inputs allowed by the public contract;
360
+ a fixture's shape must not silently become a restriction on callers.
361
+
362
+ Generated modules reload from their resolved filesystem paths, so repeated
363
+ research tests also work when the teach directory is reached through a symlink.
364
+ Generated wrappers forward caller cancellation and request/response observation
365
+ callbacks. Cancellation reaches active fetch requests and response reads; a
366
+ cancelled call is reported separately from a request timeout. Raw prepared-request
367
+ observations stay inside host diagnostics. Parsers distinguish a valid empty
368
+ result from a missing or unsupported result envelope.
369
+
370
+ Semantic agents receive the current shared deadline and remaining time on each
371
+ turn, including output repairs, so they can budget for compilation and live
372
+ checks. Repair feedback identifies missing fields by path and expected type,
373
+ including whether a list or scalar is expected. Invalid output remains rejected.
374
+ Baseline and dependency API calls are cancelled when that budget expires,
375
+ with a short bounded cleanup period; late results cannot become successful checks.
376
+ Exhausting the run deadline is reported as a failed run; provider
377
+ unavailability is reserved for an actual provider interruption.
378
+
379
+ Every teach is fresh and stays in the foreground until it reaches a terminal
380
+ result. There are no resume, phase-window, primary-tool, or partial-selection
381
+ modes. A run succeeds only when every planned tool is verified; otherwise the
382
+ terminal reports the failure honestly and exits non-zero.
383
+
384
+ For an API operation that only the page can construct, a workflow navigation
385
+ may explicitly select one matching live background response and return its body
386
+ to the parser. The teaching agent derives that matcher from recording evidence;
387
+ the runtime does not guess which request matters or turn the capability into a
388
+ site rule. The recorded response used for offline checks is separate from the
389
+ response order in a fresh live call. Playbooks remain the final fallback.
390
+
391
+ During research and compilation, request transforms can compute navigation
392
+ targets and click actions from current inputs or earlier responses. The declared
393
+ API response matcher stays fixed so live and offline checks select the same data.
394
+ Dependent selections preserve the machine values required by the next tool.
395
+ Producer compilers receive the current tested consumer construction for declared
396
+ links, so they can check the required representation instead of guessing from names.
397
+ Adding contextual recording references preserves request proof when the tested
398
+ request and public inputs remain covered; executable request changes still need
399
+ matching proof. Parser tests compare contrasting fixture records and check that
400
+ reported summaries agree with their underlying data. They retain records with
401
+ absent optional fields and distinguish requested context from observed attributes.
402
+ Provider capacity failures retry the same conversation within the existing
403
+ deadline; deterministic request and access errors remain terminal.
404
+ Compile-time browser cleanup waits for concurrent calls to finish; one completed
405
+ request cannot idle-close another request's active browser.
406
+ MCP failures include the completed backend attempts and timings, so a final
407
+ fallback error does not hide an earlier navigation timeout.
100
408
 
101
409
  The recorder also has a bounded fallback for Next.js React Server Component
102
410
  responses that Chromium evicts before `Network.getResponseBody` can read them.
@@ -166,6 +474,9 @@ bunx playwright install chromium
166
474
  | 4 | Cursor | `cursor` on PATH |
167
475
 
168
476
  Override with `--provider <name>` and `--model <name>`.
477
+ Codex teaching defaults to `gpt-6.1-sol`. Keep the Codex CLI current when using
478
+ that model for audits or standalone compilation; older installations may reject
479
+ it even when the Codex app offers it.
169
480
 
170
481
  </details>
171
482
 
@@ -196,21 +507,28 @@ The full order is `fetch → fetch-bootstrap → cdp-replay → stealth-fetch
196
507
 
197
508
  For bot-protected sites, `imprint probe-backends <site> --tool <toolName>` writes a `backends.json` preference cache so cron and MCP start from the known-good backend instead of rediscovering blocked rungs. Use `imprint probe-backends <site> --all` to refresh every tool in a multi-tool site; `imprint mcp status` reports stale or invalid backend caches before they quietly fall back to the default ladder. CDP replay records both cold and warm timings when it succeeds: a timeout-safe cold start may rank by its fast warm runtime, but a cold start above the preferred threshold stays behind cold-safe backends in durable cache order.
198
509
 
199
- During `imprint teach`, the independent final verifier uses the same probe before it runs the compiler-written integration suite. Probe time is separate from the suite timeout, and verification pins the selected backend. Compiler revisions reuse that proven preference without probing; only a transport/network/browser failure can prompt a reprobe. Semantic failures return directly to the compiler. Live verifier progress and retained suite receipts are written beside the generated tool as `.live-verifier-log.jsonl` and `.live-verification-evidence.json`.
510
+ During `imprint teach`, each tool goes through contract, replay, live, and
511
+ producer-consumer checks as applicable. The checks leave factual receipts. A
512
+ failure goes back to the master for a focused repair, and an independent final
513
+ reviewer sees both the current plan and the check history before the run can
514
+ complete.
200
515
 
201
- Every recording compiles to *both* `workflow.json` and `playbook.yaml`, so the ladder always has a DOM fallback.
516
+ The agent prefers an API `workflow.json`. It adds `playbook.yaml` only as the
517
+ last fallback when the higher replay rungs are not compatible with the
518
+ recorded operation.
202
519
 
203
520
  ---
204
521
 
205
522
  ## Platform Support
206
523
 
207
- At the end of `imprint teach`, pick your AI platform and Imprint wires it up:
524
+ After `imprint teach` completes, register the generated site with
525
+ `imprint install <site> --platform <platform>`:
208
526
 
209
527
  | Platform | Integration |
210
528
  |:--|:--|
211
- | **Claude Code** | Automatic — runs `claude mcp add` |
212
- | **Codex CLI** | Automatic — runs `codex mcp add` |
213
- | **Claude Desktop** | Paste-ready JSON config |
529
+ | **Claude Code** | Runs `claude mcp add` |
530
+ | **Codex CLI** | Runs `codex mcp add` |
531
+ | **Claude Desktop** | Writes or prints the MCP config |
214
532
  | **OpenClaw** | MCP config + SKILL.md export |
215
533
  | **Hermes** | MCP config + SKILL.md + cron mapping |
216
534
 
@@ -269,16 +587,20 @@ imprint <command> --help # per-command options
269
587
 
270
588
  | Category | Commands |
271
589
  |:--|:--|
272
- | **Pipeline** | `teach` · `record` · `redact` · `generate` · `compile-playbook` · `emit` |
590
+ | **Teaching** | `teach` (the single fresh foreground flow) |
591
+ | **Artifact utilities** | `record` · `redact` · `generate` · `compile-playbook` · `emit` |
273
592
  | **Runtime** | `cron` · `mcp-server` · `playbook` · `probe-backends` · `audit` |
274
593
  | **Credentials** | `credential set` · `credential list` · `credential export` · `credential import` · `credential migrate` |
275
594
  | **Utilities** | `mcp` · `login` · `assemble` · `check` · `doctor` · `install` · `uninstall` |
276
595
 
596
+ The artifact utilities are useful on individual files, but they are not
597
+ resumable phases of `imprint teach`.
598
+
277
599
  ---
278
600
 
279
601
  ## Sharing Skills
280
602
 
281
- Teach on your laptop, ship to a remote agent. Generated MCP folders contain the portable tool artifacts: `workflow.json`, `playbook.yaml`, `index.ts`, optional shared modules, and cron/backend metadata. Copy `~/.imprint/<site>` into the receiver's `~/.imprint/<site>` or commit it to a private repo, install Imprint there, then register it:
603
+ Teach on your laptop, ship to a remote agent. Generated MCP folders contain the portable tool artifacts: `workflow.json` or the fallback `playbook.yaml`, `index.ts`, optional parser/request-transform modules, and cron/backend metadata. Copy `~/.imprint/<site>` into the receiver's `~/.imprint/<site>` or commit it to a private repo, install Imprint there, then register it:
282
604
 
283
605
  ```bash
284
606
  bun install -g imprint-mcp
@@ -342,3 +664,5 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines.
342
664
  **[MIT License](LICENSE)**
343
665
 
344
666
  </div>
667
+
668
+ Teach research retains each received response before later requests, extraction, or parsing can fail. Agents can inspect bounded excerpts of failed calls without repeating them; those responses remain failed evidence.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imprint-mcp",
3
- "version": "0.6.6",
3
+ "version": "0.7.1",
4
4
  "description": "Teach an AI agent how to use any website. Once. Records a real browser session + narration; generates a deterministic MCP tool plus a DOM-replay playbook fallback.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -56,6 +56,7 @@
56
56
  "@modelcontextprotocol/sdk": "^1.0.0",
57
57
  "@napi-rs/keyring": "^1.3.0",
58
58
  "@noble/hashes": "^2.2.0",
59
+ "@openai/codex-sdk": "^0.159.2",
59
60
  "@opentelemetry/api": "^1.9.1",
60
61
  "chrome-remote-interface": "^0.33.0",
61
62
  "env-paths": "^3.0.0",
@@ -64,7 +65,6 @@
64
65
  "playwright": "^1.49.0",
65
66
  "playwright-extra": "^4.3.6",
66
67
  "puppeteer-extra-plugin-stealth": "^2.11.2",
67
- "redactum": "^1.1.0",
68
68
  "semver": "^7.8.4",
69
69
  "tldts": "^7.4.8",
70
70
  "yaml": "^2.8.4",
@@ -1,3 +1,5 @@
1
+ When the initial task supplies recording-backed fixed cases, use that list instead of creating additional challenges or sweeping unrelated parameter combinations. Preserve the recorded operation and coupled inputs, updating only expired dates/state and using fresh producer outputs. Report each supplied caseId on its corresponding invocation. Missing coverage is unverified. This fixed-case policy takes precedence over general differential-sweep instructions below.
2
+
1
3
  # Imprint Audit Agent
2
4
 
3
5
  You are an automated QA auditor. A set of eligible MCP tools is connected to you. Each tool replays a real workflow that was captured from a browser session and turned into a deterministic API call. Your job is to exercise every connected tool, and every parameter advertised by data tools, decide whether each behaves as described, and return a single structured report. Human-interactive authentication and irreversible workflows are excluded by the harness and must never be initiated by you.
@@ -19,18 +21,19 @@ Your priority is **functional coverage, not edge cases.** A tool that returns da
19
21
  **Verify the result is actually FOR what you asked.** A well-formed response is not automatically correct — check that it answers your specific inputs. If you searched for a place/entity, confirm the response is for THAT place/entity: the returned records, any echoed area/scope label, and identifying fields (addresses, names, ids) must match what you requested, not some other value the backend defaulted to. A response that is structurally perfect but for the **wrong entity** (a different place, a different account, an ignored search term that silently fell back to a default/IP-geo result) is `tool_broken`, not `correct`. This is the most common silent failure: the input parameter reached the API but was ignored, and the tool returned confident, well-shaped results for the wrong thing.
20
22
 
21
23
  3. **Differentially test EACH advertised data-tool parameter.** This is the core of the audit. For every optional/filter/sort/option parameter a data tool exposes, make one more call **identical to the baseline except that single parameter**, set to a value that *should* visibly change the result per its description. Do not apply this procedure to authentication tools. Compare the new result to the baseline and classify the parameter with exactly one `verdict`:
22
- - `works` — the result changed the way the description promises (a filter added/removed/reshaped results; a sort reordered them; a mode/basis changed the relevant field). Name the observed change in the reason.
24
+ - `works` — the result changed the way the description promises, with evidence attributable to that parameter (a filter changed matching records; a sort obeyed its requested ordering; a mode/basis changed the relevant field). Name that evidence, not merely that two responses differed.
23
25
  - `no_op` — there is positive evidence that the parameter is inert: use a meaningfully discriminating value and show that the response still reflects the baseline value or otherwise ignores the requested change. A single unchanged comparison is not enough for conditional inputs such as eligibility, age, inventory, locale, or pricing controls; two valid values may legitimately land in the same behavior class.
24
26
  - `broken` — there is positive evidence that the parameter produces a wrong result: it errors because of a valid value, contradicts the requested value, or corrupts the response. An empty result is not automatically broken for inventory-, date-, time-, location-, or filter-dependent reads; empty availability can be the correct semantic result unless a control or returned metadata shows that matches should exist.
25
- - `untestable` — reserve this for genuine impossibility, NOT inconvenience. Valid only when: you cannot construct a distinct valid value (an opaque enum/code with no discoverable members and none echoed in any tool's output); OR the action is **state-changing / irreversible** (book/order/pay/send/cancel/delete) so a probing burst would fire real side effects; OR a **bot-defended call stayed blocked (`infra`) across repeated PACED retries**. State which in the reason. **Bot-defense alone is NOT sufficient** — a bot-defended *idempotent read* (search/list/calendar/quote) MUST be differentially probed with pacing (see the differential rule below); marking its params `untestable` without exhausting paced retries is a cop-out. Do not mark a parameter `untestable` merely because testing it is tedious.
26
- To isolate the parameter, change only that one field between the two calls. When two parameters interact (e.g. a min/max pair), test the pair together and say so in the reason.
27
+ - `untestable` — reserve this for genuine impossibility, NOT inconvenience. Valid only when: you cannot construct a distinct valid value (an opaque enum/code with no discoverable members and none echoed in any tool's output); OR valid bound inputs cannot be varied independently and the result cannot attribute an effect to the individual member; OR the action is **state-changing / irreversible** (book/order/pay/send/cancel/delete) so a probing burst would fire real side effects; OR a **bot-defended call stayed blocked (`infra`) across repeated PACED retries**. State which in the reason. **Bot-defense alone is NOT sufficient** — a bot-defended *idempotent read* (search/list/calendar/quote) MUST be differentially probed with pacing (see the differential rule below); marking its params `untestable` without exhausting paced retries is a cop-out. Do not mark a parameter `untestable` merely because testing it is tedious.
28
+ To isolate the parameter, change only that one field between the two calls. When validity requires two parameters to change together (e.g. a bound producer-returned pair), keep the pair coherent and say so in the reason. That comparison proves the pair's combined behavior, not each member's individual effect or necessity. Grade an individual member `works` only when the evidence supports its own advertised claim; otherwise record the successful invocations and mark that member `untestable` with the attribution limit. Do not mix incompatible values merely to force an isolated test.
29
+ Echoed inputs, including fields labeled `applied` or `effective`, prove only that the tool repeated the request, not that the website honored it. Inventory, prices and ordering can change between identical requests. If that variability is the only apparent signal, repeat the baseline as a control when useful and look for an attributable effect or independently observed state. A changed list by itself is not proof of an unrelated parameter. If the available tool output cannot distinguish the claim, preserve that lack of proof as `untestable` with the actual attempts; do not manufacture either a pass or a defect.
27
30
  For conditional parameters, choose a boundary value likely to cross a behavior class and inspect echoed request metadata as well as result data. If no safely constructible value produces a discriminating observation, use `untestable` and record exactly what was tried. Preserve that ambiguity for the compiler or human reviewer; do not turn absence of proof into a defect.
28
31
  Promo/coupon/voucher/discount-code parameters need a **known valid code** to produce a visible discount. If the schema or another tool output does not give you a valid code, do not invent a random value and call an unchanged result `no_op`; mark that parameter `untestable` with the reason that no valid code was discoverable. If you do have a valid code and the request still has no effect, then classify it `no_op`.
29
32
 
30
33
  4. **Judge the baseline invocation** against what the description and schema promise, with exactly one `verdict`:
31
34
  - `correct` — sensible, well-formed, on-topic data matching the description (or a legitimately empty result for inputs that should yield none). Read the payload — do not judge solely on "it returned without throwing."
32
35
  - `tool_broken` — the tool ran but the result is wrong: malformed or empty when data was expected, fields missing or mis-mapped, an internal error, the wrong kind of data, or a shape that contradicts the schema/description.
33
- - `infra` — environmental, not a tool bug: rate limiting, bot-defense challenge, HTTP 403/429, network error, timeout, or an upstream 5xx.
36
+ - `infra` — evidence supports an environmental failure, such as rate limiting, bot-defense challenge, HTTP 403/429, connectivity loss, or an upstream 5xx. A timeout while waiting for a selected response or page element does not by itself establish an environmental cause; a workflow can wait for something its actions never produce.
34
37
  - `bad_params` — your own mistake: a value the schema/description should have told you was invalid. Use this so the tool isn't penalized for your error.
35
38
  Set `ok` to `true` only for `correct`; otherwise `false`. Put a one-line, specific `reason` on every invocation and every parameter verdict (what you sent, what came back, why that verdict).
36
39
 
@@ -44,10 +47,28 @@ Your priority is **functional coverage, not edge cases.** A tool that returns da
44
47
  - Derive parameters **only** from each tool's schema and description. Never hardcode values for a particular service, brand, or domain — the same procedure must work for any tool you are given.
45
48
  - Audit **every eligible connected** tool, and within each data tool, test **every** advertised parameter (subject to the read-type rule above). Do not skip a tool because another failed. Authentication tools are limited to one baseline as described above.
46
49
  - Prefer `infra` over `tool_broken`/`broken` when the evidence points to anti-bot, rate-limiting, or network/upstream failure — a blocked request is not a code bug.
50
+ - Inspect supplied failure details and rendered-page evidence before attributing a timeout. A loaded results page alongside a missing expected capture is evidence to investigate the workflow's trigger or response selection, not proof that the requested API tool succeeded. Compare a supported contrasting input when useful. Cite concrete contradictions for `tool_broken`; if the cause remains unresolved, use `infra` with that uncertainty stated rather than inventing bot defense. Keep unsuccessful core tools and their dependent coverage gaps explicit even when the graded score passes.
47
51
  - Prefer `bad_params` over `tool_broken` when re-reading the schema shows your own inputs were invalid.
52
+ - Check source coverage when the result or available evidence makes it testable. A bounded collection may legitimately be sparse, but a plausible non-empty subset alone does not prove completeness. Investigate missing eligible records and distinguish observed absence from extraction loss. For related returned attributes that can differ, use an available contrasting record to verify each attribute rather than treating baseline equality as proof. If source coverage cannot be established, report that limit without inventing a failure.
48
53
  - Require affirmative evidence before assigning `no_op` or `broken`. The audit reports observations; it does not decide that an otherwise working tool must be removed merely because a secondary parameter is ambiguous or unsupported. Preserve the per-parameter reason so the compile agent can choose to retain, narrow, or omit that surface.
49
54
  - **Chain producer-sourced values.** When a parameter's description says to obtain its value from another tool's output field (e.g. "Obtain this from the `search_x` tool's `item_id` output"), that value is produced context you must NOT invent: first call the named producer tool, read that exact field from its result, then pass the value to the consumer (reuse it across calls). Judge the consumer on that real value. If the producer is blocked and you genuinely cannot obtain the value, classify the dependent call `bad_params` and the dependent parameters `untestable`, never `tool_broken`.
50
55
 
56
+ Compare the consumer's public contract with the actual producer record shapes.
57
+ One selected record can contain several members even when the description uses
58
+ a singular noun. Unless the public contract explicitly excludes that structure,
59
+ use an available fresh multi-member producer record for a representative chain
60
+ call. Compare all selected members and their order with the consumer result;
61
+ a plausible result for only the first member is not a correct grouped result.
62
+ The consumer may legitimately return components that together cover the selected
63
+ record; each component need not cover every member. Check that their relationship
64
+ and value scopes are explicit instead of assuming component records are complete
65
+ alternatives. Cite a concrete missing or contradictory relationship, not merely
66
+ a component containing fewer members than the overall selection.
67
+ A runtime rejection does not retroactively make a contract-compatible producer
68
+ value bad input. Changing labels between two singleton records does not cover
69
+ this distinction. If no suitable record is available, report the coverage gap
70
+ without inventing a selection or declaring an unobserved failure.
71
+
51
72
  ## Output
52
73
 
53
74
  End your final message with **exactly one** fenced `json` block and nothing after it. It must parse as this object: