humanish 0.113.0 → 0.115.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/CONTEXT.md +1 -0
- package/README.md +1 -1
- package/dist/actors/closing-report-limits.d.ts +11 -0
- package/dist/actors/closing-report-limits.js +13 -0
- package/dist/actors/closing-report.d.ts +68 -0
- package/dist/actors/closing-report.js +55 -0
- package/dist/actors/codex/restricted-participant-policy.d.ts +4 -47
- package/dist/actors/codex/restricted-participant-policy.js +12 -40
- package/dist/actors/computer-use/loop/debrief.d.ts +1 -10
- package/dist/actors/computer-use/loop/debrief.js +10 -46
- package/dist/actors/computer-use/loop/impressions.d.ts +2 -2
- package/dist/actors/computer-use/loop/impressions.js +6 -1
- package/dist/actors/computer-use/loop.d.ts +0 -1
- package/dist/actors/computer-use/loop.js +3 -3
- package/dist/actors/computer-use/openai-conversation.d.ts +1 -1
- package/dist/actors/computer-use/openai-conversation.js +12 -36
- package/dist/actors/computer-use/openai-provider.js +11 -5
- package/dist/actors/contract.d.ts +6 -22
- package/dist/actors/contract.js +0 -13
- package/dist/analysis/admission.d.ts +47 -0
- package/dist/analysis/admission.js +65 -0
- package/dist/analysis/automatic-completion.d.ts +0 -6
- package/dist/analysis/automatic-completion.js +3 -3
- package/dist/analysis/automatic-config.d.ts +10 -2
- package/dist/analysis/automatic-config.js +29 -14
- package/dist/analysis/automatic.js +7 -0
- package/dist/analysis/execute.d.ts +24 -5
- package/dist/analysis/execute.js +61 -27
- package/dist/analysis/finding-lead.d.ts +27 -0
- package/dist/analysis/finding-lead.js +23 -0
- package/dist/analysis/image-tokens.d.ts +2 -0
- package/dist/analysis/image-tokens.js +1 -1
- package/dist/analysis/job.d.ts +9 -1
- package/dist/analysis/job.js +11 -2
- package/dist/analysis/service.js +8 -3
- package/dist/cli/commands/analyze.js +7 -2
- package/dist/cli/commands/notes.d.ts +3 -0
- package/dist/cli/commands/notes.js +145 -0
- package/dist/cli/commands/observe.js +1 -1
- package/dist/cli/commands/study-run.js +2 -1
- package/dist/cli/findings.js +11 -30
- package/dist/cli/io.d.ts +1 -0
- package/dist/cli/io.js +8 -12
- package/dist/cli/program.js +2 -0
- package/dist/cli/telemetry.js +10 -22
- package/dist/cli/update-check.js +6 -18
- package/dist/cli/user-config.d.ts +11 -0
- package/dist/cli/user-config.js +25 -0
- package/dist/comms/email-catch.js +7 -31
- package/dist/evidence/encoded-text.d.ts +17 -3
- package/dist/evidence/encoded-text.js +121 -46
- package/dist/evidence/redaction.d.ts +11 -0
- package/dist/evidence/redaction.js +21 -10
- package/dist/evidence/secret-scrub.d.ts +14 -1
- package/dist/evidence/secret-scrub.js +125 -28
- package/dist/feedback/draft.d.ts +19 -0
- package/dist/feedback/draft.js +62 -15
- package/dist/feedback/export-bundle.js +3 -3
- package/dist/feedback/export.js +50 -20
- package/dist/feedback/feedback.js +29 -2
- package/dist/keys/key-resolution.js +12 -17
- package/dist/observer/artifact.d.ts +5 -0
- package/dist/observer/artifact.js +18 -2
- package/dist/observer/http.d.ts +7 -0
- package/dist/observer/http.js +19 -1
- package/dist/observer/notes-route.d.ts +20 -0
- package/dist/observer/notes-route.js +120 -0
- package/dist/observer/pinned-files.d.ts +8 -1
- package/dist/observer/pinned-files.js +17 -3
- package/dist/observer/render.js +39 -14
- package/dist/observer/run-routes.d.ts +8 -2
- package/dist/observer/run-routes.js +32 -6
- package/dist/observer/serve.d.ts +3 -0
- package/dist/observer/serve.js +29 -3
- package/dist/observer-app.html +7 -6
- package/dist/run/contained-output.d.ts +8 -0
- package/dist/run/contained-output.js +27 -0
- package/dist/run/evidence-files.d.ts +7 -0
- package/dist/run/evidence-files.js +24 -14
- package/dist/run/note-files.d.ts +54 -0
- package/dist/run/note-files.js +212 -0
- package/dist/run/note-shape.d.ts +35 -0
- package/dist/run/note-shape.js +20 -0
- package/dist/run/notes.d.ts +34 -0
- package/dist/run/notes.js +192 -0
- package/dist/run/participant-caption.d.ts +9 -0
- package/dist/run/participant-caption.js +19 -0
- package/dist/run/participant-records.d.ts +2 -0
- package/dist/run/participant-records.js +17 -2
- package/dist/run/transient-comms-secrets.d.ts +6 -5
- package/dist/run/transient-comms-secrets.js +19 -24
- package/dist/study/doctor.js +1 -1
- package/dist/study/preflight-result.js +2 -1
- package/dist/study/summary.d.ts +4 -5
- package/dist/study/summary.js +6 -4
- package/dist/study/warnings.js +2 -1
- package/dist/tui-app.js +1 -1
- package/docs/architecture/actor-contract.md +3 -3
- package/docs/architecture/restricted-codex-analysis.md +1 -1
- package/docs/architecture/state-driven-executor.md +1 -1
- package/docs/contracts/errors.md +2 -2
- package/docs/contracts/run-bundle.md +61 -0
- package/docs/contracts/schemas.md +17 -14
- package/docs/contracts/study-analysis.md +35 -9
- package/docs/principles/invariants-and-defaults.md +2 -2
- package/docs/product/automatic-analysis.md +22 -16
- package/package.json +8 -7
- package/skills/humanish/SKILL.md +6 -2
|
@@ -4,7 +4,7 @@ Study analysis is an independent interpretation of retained participant evidence
|
|
|
4
4
|
It is separate from the participant's account, recorded outcome, and the run's
|
|
5
5
|
deterministic review verdict. Opening an Observer never starts a provider request.
|
|
6
6
|
Supported live runs request analysis on completion by default, with a separate
|
|
7
|
-
$3
|
|
7
|
+
$3 cap on its expected cost. Set `review.analysis: false` to disable that request;
|
|
8
8
|
see [automatic analysis](../product/automatic-analysis.md).
|
|
9
9
|
|
|
10
10
|
## Invocation
|
|
@@ -20,16 +20,32 @@ humanish analyze show --run latest --json
|
|
|
20
20
|
The source must be a verified, completed live run. A dry-run contract bundle is
|
|
21
21
|
not a participant study. Here, `analyze --dry-run` means checking an existing
|
|
22
22
|
study's input and admission estimate without credentials, a provider request,
|
|
23
|
-
or a new analysis artifact.
|
|
23
|
+
or a new analysis artifact. It prints the expected cost, the worst case and the
|
|
24
|
+
cap; a refused dry run says why, and names the `--max-cost` that admits it.
|
|
24
25
|
|
|
25
26
|
The default provider is `openai`; its default model is `gpt-6-astra`, with high reasoning effort. A request sends selected retained text and
|
|
26
27
|
captures to OpenAI, without tools, redirects, provider-side response storage, or
|
|
27
28
|
automatic retries. `--question` adds a reviewer question; it never changes the
|
|
28
29
|
participant assignment. For OpenAI API analysis, `--max-cost` is required, including for dry-run
|
|
29
|
-
admission.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
admission. Admission compares the expected cost plus a 10% margin with it; the
|
|
31
|
+
provider bill is not limited by it.
|
|
32
|
+
`--timeout-ms` and `--max-output-tokens` bound the request. A bill above the
|
|
33
|
+
worst case or the cap retains valid findings and usage but returns a partial
|
|
34
|
+
result and a nonzero command exit, including when that version is reused.
|
|
35
|
+
|
|
36
|
+
The estimate counts the instructions, evidence packet and result schema at 3
|
|
37
|
+
UTF-8 bytes per input token, adds 2,048 framing tokens and each capture's
|
|
38
|
+
high-detail image tokens, and prices input at the model's highest input rate.
|
|
39
|
+
The expected output is 12,000 tokens plus 1,000 per participant, at most the
|
|
40
|
+
output allowance; the worst case spends the whole allowance. `admission` in
|
|
41
|
+
`--json` output has `estimatedCostUsd` (the expected cost), `worstCaseCostUsd`,
|
|
42
|
+
`admittedCostUsd` (the figure compared with the cap: the expected cost plus 10%,
|
|
43
|
+
or the worst case when that is lower), `maxCostUsd`, `inputTokenAllowance` (the
|
|
44
|
+
input tokens priced) and `outputTokenAllowance`. On 148 billed gpt-6-astra
|
|
45
|
+
analyses the expected cost was 1.08 to 7.3 times the bill, and 1.08 to 1.32
|
|
46
|
+
times for those billed $1 or more.
|
|
47
|
+
A refusal's message gives the expected cost, the worst case, the cap, and
|
|
48
|
+
`humanish analyze --run <id> --max-cost <n>` with `n` the worst case rounded up.
|
|
33
49
|
|
|
34
50
|
The default deadline is ten minutes. With no explicit output-token limit, analysis
|
|
35
51
|
uses 32,768 tokens if admission fits the declared budget, or retains the prior
|
|
@@ -191,7 +207,13 @@ The narrative scrub removes a run's known transient values, such as a received o
|
|
|
191
207
|
link, from every generated text field. It finds each value as written and in its encoded forms:
|
|
192
208
|
percent-encoded, JSON-escaped, base64, base64url and hex, and where escapes split it. A field
|
|
193
209
|
with a value is stored decoded with the value replaced; a field without one keeps its spelling. A
|
|
194
|
-
|
|
210
|
+
value inside a bracketed span, such as `[REDACTED_373433393231]`, is found too: only the markers
|
|
211
|
+
humanish writes (`[REDACTED_SECRET]`, `[REDACTED_LOCAL_PATH]`, `[REDACTED_RUNTIME_PATH]`,
|
|
212
|
+
`[REDACTED_PROMPT_TEXT]`, `[REDACTED_LOBBY_CODE]`) are left as they are. If another reading of
|
|
213
|
+
the stored field still holds a value (decoded once more, with percent escapes as UTF-8, with
|
|
214
|
+
transfer escapes expanded, or with Latin-1 characters read as UTF-8 bytes), as for a value encoded
|
|
215
|
+
twice, the whole field becomes `[REDACTED_SECRET]`. A known value in any of
|
|
216
|
+
these forms in an ID, enum or reference refuses the response.
|
|
195
217
|
|
|
196
218
|
When a reviewer amends a finding, its headline and experience describe the replaced claim.
|
|
197
219
|
Text output, the Observer and feedback drafts show the reviewer's claim in their place and say the
|
|
@@ -304,7 +326,9 @@ describes:
|
|
|
304
326
|
The optional automatic job is separate from the immutable analysis. Its view
|
|
305
327
|
binds terminal state to the exact execution receipt and report. A stale or
|
|
306
328
|
unverifiable job remains unknown; reading or exporting it never dispatches.
|
|
307
|
-
Automatic job metadata is omitted from shared derivatives.
|
|
329
|
+
Automatic job metadata is omitted from shared derivatives. A job refused for its
|
|
330
|
+
cost also records `admission` (`expectedCostUsd`, `worstCaseCostUsd`,
|
|
331
|
+
`maxCostUsd`), which `review` and the Observer read; other jobs omit it. See
|
|
308
332
|
[automatic analysis](../product/automatic-analysis.md).
|
|
309
333
|
|
|
310
334
|
Version and correction directories are claimed exclusively; publication is
|
|
@@ -384,7 +408,9 @@ The states without findings:
|
|
|
384
408
|
- `skipped`: the automatic analysis was skipped or refused, for example without
|
|
385
409
|
`OPENAI_API_KEY`, or the run's study file sets `review.analysis: false`
|
|
386
410
|
(`AUTOMATIC_ANALYSIS_DISABLED`, read from the file when the view is built). `next` is
|
|
387
|
-
`analyze --max-cost 3`, which runs an analysis anyway.
|
|
411
|
+
`analyze --max-cost 3`, which runs an analysis anyway. For an analysis refused for its
|
|
412
|
+
cost, the message gives the expected cost, the worst case and the cap, and `next` sets
|
|
413
|
+
`--max-cost` to the worst case rounded up.
|
|
388
414
|
- `failed`: the latest attempt failed or was cancelled and no usable version exists. `next`
|
|
389
415
|
reruns it with the same analyst, `--provider codex` for the Codex account analyst.
|
|
390
416
|
- `none`: no analysis ran for this live run and nothing records why, for example a run that
|
|
@@ -39,7 +39,7 @@ certify (see the conformance suite).
|
|
|
39
39
|
turn a dry run, preview, reader or unsupported route into provider or sandbox
|
|
40
40
|
spend. An explicitly live supported study includes the disclosed default
|
|
41
41
|
post-run analysis budget unless `review.analysis: false` disables it. Analysis
|
|
42
|
-
has a separate
|
|
42
|
+
has a separate cap on its expected cost, not a provider billing cap or part of
|
|
43
43
|
the actor budget. Spend-bearing tests retain their explicit env gates.
|
|
44
44
|
4. **Evidence verifies fail-closed.** A run bundle that cannot pass verification (schema,
|
|
45
45
|
redaction status, artifact presence, public-safety scan) is a failed run, even when the
|
|
@@ -90,7 +90,7 @@ silently drifting from one is not.
|
|
|
90
90
|
| Default | Why it is the default | Legitimate override |
|
|
91
91
|
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
92
92
|
| Dry-run | Spend safety (the live-spend rule sets the floor; dry-run keeps it far away) | `mode: live` |
|
|
93
|
-
| Post-run analysis on supported live studies | Findings accompany the recording; a separate $3
|
|
93
|
+
| Post-run analysis on supported live studies | Findings accompany the recording; a separate $3 cap on its expected cost is visible before execution | `review.analysis: false` disables it; an explicit mapping sets another analysis budget. Dry-run and unsupported routes never dispatch; missing default credentials produce a recorded skip |
|
|
94
94
|
| Separate worlds (`per-lane-worlds`) | Isolation, attribution, reproducibility | `route: shared-world`: N participants against one mutable plane for scenarios that are about interaction between participants. Every participant runs at once: `execution.concurrency` must be two or more, and an omitted value fills to the number of participants. The plane is one getHost-exposed subject sandbox with synthetic seeded data, or an operator-owned public deployment (external-public), driven by N actor sandboxes. The bundle declares the weaker `attributionClass: shared-world` and a verify-enforced `attributionLimits` ceiling (`best-effort-causal-attribution` and the rest of the concurrent set). Sequential turns at `execution.concurrency: 1` were removed in 0.106.0. |
|
|
95
95
|
| External key placement | Smallest blast radius: when the keyed process (e.g. a computer-use provider loop) runs outside the sandbox, its key never enters | In-sandbox placement when the keyed process runs inside (an agent harness under test); declared per actor type, with a spend budget |
|
|
96
96
|
| Loopback entry URLs | Public-safety: never drive third-party sites unbidden | `policies.allowPublicTargets` for an owner-declared deployment/preview (a Vercel preview of your own app). Multi-participant public/preview fan-out needs explicit `participants[].target` for every participant, so the adapter-owned topology is declared rather than inferred. Provisioned clone subjects always serve in-sandbox on loopback |
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
Supported live studies automatically request analysis after each recording finishes. Findings remain
|
|
4
4
|
separate from participant feedback and the recorded study verdict.
|
|
5
5
|
|
|
6
|
-
The default is `gpt-6-astra` with high reasoning effort, a separate $3
|
|
7
|
-
|
|
8
|
-
humanish selects 32,768 tokens if the exact input's
|
|
9
|
-
|
|
6
|
+
The default is `gpt-6-astra` with high reasoning effort, a separate $3 cap on its
|
|
7
|
+
expected cost and a 600-second timeout. When no output limit is specified,
|
|
8
|
+
humanish selects 32,768 tokens if the exact input's expected cost still fits that
|
|
9
|
+
cap; otherwise it keeps the established 16,384-token allowance. This preserves
|
|
10
10
|
previously admitted studies without increasing their spending limit. To customize it:
|
|
11
11
|
|
|
12
12
|
```yaml
|
|
@@ -22,11 +22,15 @@ review:
|
|
|
22
22
|
|
|
23
23
|
Omitting `review.analysis` uses these defaults. Set `review.analysis: false` to
|
|
24
24
|
run participants without the additional analysis request. An explicit analysis
|
|
25
|
-
mapping using the default OpenAI API provider requires `maxCostUsd`.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
mapping using the default OpenAI API provider requires `maxCostUsd`. Admission
|
|
26
|
+
compares the expected cost plus a 10% margin with it; it does not limit the
|
|
27
|
+
provider's final bill, and it is separate from participant spending limits. The
|
|
28
|
+
estimate gives two numbers: the expected cost, and the worst case if the analyst
|
|
29
|
+
spends its whole output allowance. `humanish study check` gives the expected cost
|
|
30
|
+
range for the study's participant count, from a run that keeps no evidence to one
|
|
31
|
+
at the evidence limits. Use `analyze --dry-run --max-cost <usd>` on retained
|
|
32
|
+
evidence to inspect the expected cost, the worst case and the selected token
|
|
33
|
+
allowance before deliberately choosing a larger budget. Explicit
|
|
30
34
|
`maxOutputTokens` and `--max-output-tokens` limits are honored exactly. The output allowance
|
|
31
35
|
includes reasoning as well as the report; exhausting it does not produce a usable
|
|
32
36
|
report and never starts an automatic retry. Analysis
|
|
@@ -74,7 +78,7 @@ Default analysis also skips recordings containing only setup or failure records
|
|
|
74
78
|
with no retained participant activity. A desktop startup failure does not start
|
|
75
79
|
an analysis request. The original failure remains visible.
|
|
76
80
|
|
|
77
|
-
CLI live starts disclose the selected analyst
|
|
81
|
+
CLI live starts disclose the selected analyst, its expected cost range and cap, or unknown account dollars before execution.
|
|
78
82
|
`humanish study check <study> --json` and the TUI study screen also expose the
|
|
79
83
|
resolved budget without dispatching analysis. Library callers can inspect
|
|
80
84
|
`resolveAutomaticAnalysis` or `automaticAnalysisBudget` before running.
|
|
@@ -101,11 +105,13 @@ for post-run analysis, and `ok` for the overall request. Failed, cancelled or
|
|
|
101
105
|
unknown analysis produces exit code 2 without discarding the recording. A missing
|
|
102
106
|
`OPENAI_API_KEY` skips default analysis and preserves a successful run exit;
|
|
103
107
|
`automaticAnalysisTrigger: "default"` distinguishes that case in JSON. So does a
|
|
104
|
-
default analysis whose
|
|
105
|
-
skipped with `AUTOMATIC_ANALYSIS_ADMISSION_REFUSED
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
default analysis whose expected cost, plus the margin, is over the default $3 cap:
|
|
109
|
+
it is skipped with `AUTOMATIC_ANALYSIS_ADMISSION_REFUSED` and the run exits 0. For
|
|
110
|
+
any analysis refused for its cost, the job records the expected cost, the worst
|
|
111
|
+
case and the cap, and the CLI, `humanish review` and the Observer give them with
|
|
112
|
+
the `humanish analyze --run <id> --max-cost <n>` command that runs it, `n` being
|
|
113
|
+
the worst case rounded up. A missing key or an over-cap estimate for an explicitly
|
|
114
|
+
configured analysis remains a failed overall request. Every skip is retained for review and does not
|
|
109
115
|
retry automatically. Partial
|
|
110
116
|
findings remain visibly partial; a valid partial result can succeed, while a
|
|
111
117
|
partial result with an analysis error still fails the command. Recorded task
|
|
@@ -119,7 +125,7 @@ outcomes and the deterministic review verdict are never rewritten by analysis.
|
|
|
119
125
|
| none (`null`) | `complete` | Analysis completed |
|
|
120
126
|
| `AUTOMATIC_ANALYSIS_REUSED` | that of the reused result | An earlier analysis of this run was reused |
|
|
121
127
|
| `AUTOMATIC_ANALYSIS_LIMITATIONS` | `partial` | Analysis completed with recorded limitations |
|
|
122
|
-
| `AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED` | `partial` | Usage passed the
|
|
128
|
+
| `AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED` | `partial` | Usage passed the worst case or the cap |
|
|
123
129
|
| `AUTOMATIC_ANALYSIS_FAILED` | `failed` or `partial` | Analysis failed, or an unexpected error stopped it |
|
|
124
130
|
| `AUTOMATIC_ANALYSIS_CANCELLED` | `cancelled` | Ctrl-C or the TUI's **Cancel analysis** stopped it |
|
|
125
131
|
| `AUTOMATIC_ANALYSIS_DRY_RUN` | `skipped` | A dry run records no participant evidence |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanish",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.115.0",
|
|
4
4
|
"description": "Synthetic user research for apps, CLIs, and agent-facing product flows.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"comms:agentmail:contract": "node --import tsx scripts/agentmail-contract-check.mjs",
|
|
92
92
|
"format": "oxfmt",
|
|
93
93
|
"format:check": "oxfmt --check",
|
|
94
|
-
"lint": "node scripts/check-lint-cap.mjs --max-warnings=
|
|
94
|
+
"lint": "node scripts/check-lint-cap.mjs --max-warnings=439",
|
|
95
95
|
"knip": "knip",
|
|
96
96
|
"prose:check": "node scripts/check-code-prose.mjs",
|
|
97
97
|
"vocabulary:check": "tsx scripts/check-retired-words.ts",
|
|
@@ -112,13 +112,14 @@
|
|
|
112
112
|
"@e2b/desktop": "^2.4.0",
|
|
113
113
|
"@types/node": "catalog:",
|
|
114
114
|
"@types/pngjs": "^6.0.5",
|
|
115
|
-
"axe-core": "4.
|
|
116
|
-
"
|
|
115
|
+
"axe-core": "4.14.0",
|
|
116
|
+
"fast-check": "catalog:",
|
|
117
|
+
"knip": "6.40.0",
|
|
117
118
|
"oxc-parser": "catalog:",
|
|
118
|
-
"oxfmt": "0.
|
|
119
|
-
"oxlint": "1.
|
|
119
|
+
"oxfmt": "0.72.0",
|
|
120
|
+
"oxlint": "1.87.0",
|
|
120
121
|
"oxlint-tsgolint": "7.0.2003",
|
|
121
|
-
"skills": "1.7.
|
|
122
|
+
"skills": "1.7.1",
|
|
122
123
|
"tsx": "^4.23.15",
|
|
123
124
|
"typescript": "catalog:",
|
|
124
125
|
"vitest": "catalog:"
|
package/skills/humanish/SKILL.md
CHANGED
|
@@ -105,6 +105,11 @@ not local inference or the participant's existing conversation. See
|
|
|
105
105
|
[the analysis contract](../../docs/contracts/study-analysis.md) for the current
|
|
106
106
|
CLI/model qualification and setup limits.
|
|
107
107
|
|
|
108
|
+
When post-run analysis is refused for its cost, the run output and `humanish
|
|
109
|
+
review` give its expected cost, its worst case and the command that runs it,
|
|
110
|
+
`humanish analyze --run <id> --max-cost <n>`. Show the user those costs and run
|
|
111
|
+
the command only once they agree to the spend.
|
|
112
|
+
|
|
108
113
|
Do not pass numeric `maxCostUsd`/`maxOutputTokens` or their CLI flags to the
|
|
109
114
|
account branch. It cannot enforce those ceilings and rejects them. Account dollar
|
|
110
115
|
cost remains unknown even when token usage is reported. There is no fallback to
|
|
@@ -337,8 +342,7 @@ The following configuration selects **local capture**:
|
|
|
337
342
|
```yaml
|
|
338
343
|
comms:
|
|
339
344
|
email:
|
|
340
|
-
injectEnv:
|
|
341
|
-
RESEND_API_URL # adopter-named: whatever env var YOUR app reads for its
|
|
345
|
+
injectEnv: RESEND_API_URL # adopter-named: whatever env var YOUR app reads for its
|
|
342
346
|
# email-API base URL. The harness sets it to the in-sandbox catch — do NOT also
|
|
343
347
|
# list it in subject.env. VERIFY the app actually reads this variable: a stock
|
|
344
348
|
# email SDK does not honor a base-URL env unless the app passes it through, and
|