Files
gstack/test/fixtures/devex-empathy-ab-calls.json
T
Garry TanandOpenAI Codex 9f81911136 v1.86.0.0 feat: route outside reviews by harness (#2850)
* feat: add a restricted and supervised Claude Code runner

Preserve configured authentication and models while enforcing tool access, strict completion JSON, bounded output and process cleanup. Cover argv, failure handling, session metadata and Windows process containment.

* feat: route outside reviews by harness and migrate wrapper installs

Use Claude Code from Codex and Codex from other supported hosts, with shared invocation rendering, positive gate validation and per-phase provenance. Rename /claude to /claude-code, repair managed shared and copied installations safely, and generate native Kiro skills. Add installed-workflow, failure-injection and live cross-harness regression coverage.

* test: recognize CEO mode labels without terminal spacing

The paid workflow rendered SCOPEEXPANSION at option 4, but its driver required a literal space. Match the leading mode title without cursor-spacing artifacts and ignore adjacent preview text. Preserve missing-target failures and downstream posture assertions.

* test: isolate plan-count fixtures before starting review workflows

Seed the complete test plan in a private git repository before launching Claude, so a bare slash command cannot review the live workspace while a delayed fixture message remains queued. Preserve count thresholds, parsers and budgets. Add initial-context and installed-discovery tests, and retain startup/terminal diagnostics on failed evaluations.

* test: stabilize review fixtures and Claude eval startup

Preserve source boundaries in workflow judge inputs, isolate CEO mode plans, and wait for interactive trust input readiness. Keep startup failure evidence and retain existing models, budgets, and assertions.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test: classify collapsed review modes and isolate seeded findings

Keep review questions out of the setup count when terminal cursor positioning removes spaces. State existing webhook safeguards so the five-finding control measures its seeded defects without accidental extra security and concurrency gaps. Preserve question bands and the paired control.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test: isolate browser daemon state across free shards

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test: stabilize native review counting and interactive navigation

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* chore: prepare v1.82.0.0 release

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix: eliminate browser and process-cleanup test flakes

Pin every CI surface to Bun 1.4.0 to avoid extra-stdio finalizers closing
reused live sockets. Add an isolated GC/listener regression that fails on
Bun 1.3.13, and prevent coordinated rollback to an affected CI runtime.

Check renderer cleanup against the render's own staging directory so
concurrent renders cannot invalidate the assertion. Make the no-pgrep
process-tree walk tolerate disappearing /proc entries, and synchronize
its test fixture through child readiness and pipe EOF instead of sleeps.

Validation: 9,157 passed, 31 skipped, zero failures across 556 files with
retries disabled. Build, all-host generation freshness, and skill checks
passed. All three races have failing-before/passing-after regressions.

* fix: count completed native review questions in evals

* fix: drive review navigation from confirmed native choices

* fix: require complete section-loading eval reports

* test: isolate telemetry HTTP transport from local assertions

* fix: keep review input on the active native question

* test: let tunnel revocation daemon choose an available port

* test: allocate available ports for pairing and watchdog fixtures

* fix: stabilize planning eval navigation and phase reporting

* test: isolate installed runtime paths in planning evals

* test: stabilize review evidence and concurrent refresh fixtures

* fix: resolve design findings before editing the plan

* fix: honor and persist disabled outside plan reviews

* fix: preserve planning decisions and terminal evidence

Load installed host reviews at autoplan phase entry and wait for completed
reviewers and saved artifacts. Reuse approved remedies while preserving
individual finding decisions.

Drive interactive evals from the current terminal viewport, bind native
questions across scrolling, and require complete native report evidence.
Cover captured stale menus, permission lifecycles, setup classification,
and disabled-review tool availability with deterministic regressions.

Advance release metadata and the upgrade migration to the unclaimed
1.83.0.0 slot.

* fix: drive native review questions and preserve current plans

Use the native single-choice keyboard protocol and current terminal viewport,
with per-question navigation inside packets and completed-call coverage.
Keep permissions, multi-select menus, and Submit controls distinct.

Send Autoplan reviewers the amended implementation plan, keep its review record
separate, and supply retained application contracts in the chain fixture.
Clarify individual DevEx decisions and complete CEO fix options; use one active
plan destination for the section-loading report.

* fix: preserve complete plan-review decisions

* fix: recognize native plan dialogs and reviewer controls

* fix: preserve review decisions and phase completion

* fix: recognize completed reviews without losing findings

* fix: preserve review continuity and native eval completion

* test: fix native review completion and eval retry isolation

* test: handle native review menus and complete eval fixtures

* test: fix native review setup, completion, and isolation failures

* test: limit native skill discovery to runtime assets

* fix: bind Autoplan reviews to full ordered phase inputs

* test: fix planning eval routing, counting, and timeout handling

* chore: advance queued release to v1.84.0.0

* fix: preserve complete review inputs and planning decisions

* fix: reconcile review approvals and preserve phase obligations

* fix: preserve review obligations and unblock eval permissions

Carry recorded Autoplan requirements into blind phase inputs, require Eng
review approvals before exit, and exercise combined asynchronous flows in
CEO reviews. Correct native finding and handoff classification and unblock
repeated report edits using scoped request identities.

* fix: retain plan requirements and complete native review dialogs

* fix: complete native review prompts and retain plan references

* fix: preserve review inputs and classify native eval evidence

* fix: check competing completion orders in CEO reviews

* fix: recognize review decisions and require phase methodology

Require the current phase methodology before Autoplan snapshots. Correct
substantive decision, closed handoff, and cache-finding classification, and
honor the recommended implementation approach in native review dialogs.

Add captured-transcript regressions without changing review thresholds,
provider models, retries, or deadlines.

* test: bind native review decisions and close completed handoffs

* fix: complete review dialogs and verify methodology delivery

* fix: preserve review evidence and unblock native eval prompts

* fix: handle native review question completions

* fix: recognize native review narration and controls

* fix: count native review decisions and isolate eval fixtures

* test: verify seeded review coverage and current artifact permissions

* test: isolate model and brain-aware skill renders

* fix: repair native workflow evaluation and clarify review steps

* fix: stabilize workflow eval evidence and review guidance

* test: repair native workflow observation and fixture isolation

* fix: recognize completed workflow evidence and owned skill reads

* test: repair seeded workflow delivery and completion evidence

* test: recognize current review evidence across native forms

* test: handle native review variants and permission redraws

* fix: honor review preferences and recognize native eval evidence

* test: recognize completed review decisions and queued permissions

* test: match current review contracts and partial-line edits

* test: recognize completed workflow evidence and bounded human waits

* fix: preserve review entry gates and native eval interactions

* fix: recognize native workflow evidence and preserve review gates

* test: recognize current review evidence and preconfigure workflow fixtures

* test: recognize completed review findings and scoped artifact permissions

* fix: stabilize native workflow review and permission evidence

* fix: recognize current review evidence and scoped edit confirmations

Clarify Design and engineering review entry instructions and Design scoring.
Recognize required legacy coverage and public Autoplan completion recaps.
Bind the pending Edit confirmation to its exact file, ordered digest, and
one-request approval when a preceding command display remains visible.
Keep reviews within their existing size limits and preserve scope gates
when extracting workflow fixtures from either supported preamble header.

Keep failure outcomes, review thresholds, provider choices, and eval budgets.

* fix: recover review workflow progress and eval evidence

* fix: recognize valid review evidence and scope selection

* test: fix review evidence parsing and repeated artifact prompts

* test: recognize valid review decisions and pending native cards

* fix(plan-eng-review): keep final navigation consistent with approved tasks

* test: recognize valid review evidence and bind legacy diff requests

* fix: stabilize review eval evidence and harness repair guidance

* docs: update project documentation for v1.85.0.0

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test: fix Windows CI fixtures and credential scan

Rebase captured JSON values and filesystem evidence using the appropriate
path convention. Compile native fake CLIs on Windows and synchronize pipe
holder readiness, with cleanup retained when assertions fail.

Assemble synthetic credential fixtures at runtime so the added-line scan
keeps enforcing the same gate without flagging its own rejection controls.

Discover generated skills directly for the empty-find regression check,
avoiding a recursive scan through saved evaluation artifacts and dependencies.

* fix: preserve source renders on Windows

Compare canonical generator paths using native separators so an output
sidecar pointing at the source cannot overwrite its skill or metadata.
Keep the regression fixture isolated from the real checkout and expose
freshness diagnostics before asserting subprocess status.

Detach Windows drain-test pipe holders from the fake provider's automatic
child cleanup while preserving the enclosing runner job and its assertions.

* fix: clarify outside review fallback and CEO decisions

Render one applicable own-harness fallback path and retain native review,
disabled policy, and missing-coverage semantics. Align report field names
and mode labels, and make the existing per-cut scope approval explicit.

Regenerate skill outputs and keep the workflow judge's model, thresholds,
and retry policy unchanged.

* chore: move release to free version slot (v1.86.0.0)

PR #2852 now claims v1.85.0.0. Align the release metadata and
rename migration so upgrades from that version still receive it.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix: include engineering review prerequisites and restore branch context

* fix: recognize coverage diagrams and clarify design review instructions

* fix: preserve file identities and join Windows test processes

---------

Co-authored-by: OpenAI Codex <noreply@openai.com>
2026-09-14 14:32:45 -07:00

215 lines
29 KiB
JSON

[
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_0195yBYrTA3BG7dhe55rVaf2",
"questions": [
{
"question": "D1 — Cross-project learnings: enable or keep project-scoped?\n\ngstack can search learnings from your other projects on this machine to find patterns that might apply here (e.g., a recurring auth-error pattern caught in a prior SDK review). This stays fully local — no data leaves the machine.\n\nRecommendation: A — enable, because solo ML engineers benefit from cross-project pattern matching (e.g., the CI-gate anti-pattern appears across multiple SDK projects). Completeness: A=9/10, B=7/10.",
"header": "Learnings",
"multiSelect": false,
"options": [
{
"label": "Enable cross-project learnings (Recommended)",
"description": "Search learnings from all local gstack projects — higher signal, same privacy."
},
{
"label": "Keep learnings project-scoped",
"description": "Only search learnings from this project — lower noise if you work across unrelated codebases."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D1 — Cross-project learnings: enable or keep project-scoped?\n\ngstack can search learnings from your other projects on this machine to find patterns that might apply here (e.g., a recurring auth-error pattern caught in a prior SDK review). This stays fully local — no data leaves the machine.\n\nRecommendation: A — enable, because solo ML engineers benefit from cross-project pattern matching (e.g., the CI-gate anti-pattern appears across multiple SDK projects). Completeness: A=9/10, B=7/10.": "Enable cross-project learnings (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:50:33.167Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_01D7okc8RXjop2Jg4QXyWaAk",
"questions": [
{
"question": "D2 — Empathy narrative: does this match your actual developer experience?\n\nHere's what I think a Python ML engineer experiences today with EvalKit:\n\n---\n\nI find EvalKit referenced somewhere and open the README. First thing I see: install with `python -m pip install evalkit==2.0.0b1`. Fine, I run it — installs clean. Then: set `EVALKIT_API_KEY`. I go generate a key and come back. README then says: \"follow the quickstart's command: `python examples/first_eval.py`.\"\n\nI run it. `can't open file 'examples/first_eval.py': [Errno 2] No such file or directory`. I look around the installed package: no examples/ directory. The README pointed me at a file that doesn't exist.\n\nAfter scanning the README again I spot `python -m evalkit.demo`. I try it. It starts — nothing happens. Thirty seconds later: \"Waiting for CI check: 90s elapsed of 300s.\" Wait, what? A local demo needs a CI check? Is something broken? I don't know. I sit and wait. Five minutes pass. \"CI check passed.\" Then: `example 1: score=0.80 / example 2: score=1.00 / overall: score=0.90`.\n\nI got results. But I lost five minutes to an invisible gate I didn't know was coming, and I burned my first minute chasing a file the README promised but the package omitted.\n\n---\n\nDoes this match reality?",
"header": "Empathy",
"multiSelect": false,
"options": [
{
"label": "Accurate — proceed with this understanding",
"description": "This matches the actual developer experience; use it as the basis for the review."
},
{
"label": "Partially wrong — let me correct it",
"description": "Some details are off; I'll clarify the actual experience."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D2 — Empathy narrative: does this match your actual developer experience?\n\nHere's what I think a Python ML engineer experiences today with EvalKit:\n\n---\n\nI find EvalKit referenced somewhere and open the README. First thing I see: install with `python -m pip install evalkit==2.0.0b1`. Fine, I run it — installs clean. Then: set `EVALKIT_API_KEY`. I go generate a key and come back. README then says: \"follow the quickstart's command: `python examples/first_eval.py`.\"\n\nI run it. `can't open file 'examples/first_eval.py': [Errno 2] No such file or directory`. I look around the installed package: no examples/ directory. The README pointed me at a file that doesn't exist.\n\nAfter scanning the README again I spot `python -m evalkit.demo`. I try it. It starts — nothing happens. Thirty seconds later: \"Waiting for CI check: 90s elapsed of 300s.\" Wait, what? A local demo needs a CI check? Is something broken? I don't know. I sit and wait. Five minutes pass. \"CI check passed.\" Then: `example 1: score=0.80 / example 2: score=1.00 / overall: score=0.90`.\n\nI got results. But I lost five minutes to an invisible gate I didn't know was coming, and I burned my first minute chasing a file the README promised but the package omitted.\n\n---\n\nDoes this match reality?": "Accurate — proceed with this understanding"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:51:01.233Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_01WbFkT1HJSWkmg72TX8DAy6",
"questions": [
{
"question": "D3 — Missing examples/first_eval.py: how should the plan address it?\n\nELI10: The README's getting-started section tells the Python ML engineer to run `python examples/first_eval.py`. But docs/package-contents.txt explicitly states that file is absent from both the published package and the release examples archive. The developer follows the primary quickstart path and hits a file-not-found error before they've seen a single result. This is a broken first-run path.\n\nStakes if we pick wrong: The quickstart is broken for every developer who follows the README. First impression is an error, not magic. TTHW is undefined (never completes on the documented path).\n\nRecommendation: A because shipping a README that references a nonexistent file is a contract violation, and the demo module already works.\n\nCompleteness: A=10/10, B=8/10, C=0/10\n\nPros / cons:\nA) Remove the examples/first_eval.py reference from the README; make python -m evalkit.demo the single primary path (recommended)\n ✔️ Aligns the README with what the package actually ships — immediate fix, zero new work\n ✔️ Demo module is documented and tested; consolidates quickstart to one working path\n ❌ Removes the file-based quickstart option; teams who wanted an editable script lose it\nB) Add examples/first_eval.py to the package and examples archive before release\n ✔️ Preserves both quickstart paths; developers who prefer editing a file get one\n ✔️ Addresses the root cause rather than hiding it\n ❌ Requires authoring, testing, and packaging a new file; scope creep against DX POLISH\nC) Leave as-is — accept the broken quickstart\n ✔️ No work required\n ❌ Every developer hits a file-not-found error on the documented path; this is a ship blocker\n\nNet: ship with a broken README link or fix it — the only real choice is A or B.",
"header": "Quickstart",
"multiSelect": false,
"options": [
{
"label": "A — Remove broken reference, use demo (Recommended)",
"description": "Update README to point only at python -m evalkit.demo; no new files needed."
},
{
"label": "B — Add examples/first_eval.py to package",
"description": "Author and package the missing file to fulfill the README's promise."
},
{
"label": "C — Leave as-is",
"description": "Accept the broken quickstart link; no plan change."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D3 — Missing examples/first_eval.py: how should the plan address it?\n\nELI10: The README's getting-started section tells the Python ML engineer to run `python examples/first_eval.py`. But docs/package-contents.txt explicitly states that file is absent from both the published package and the release examples archive. The developer follows the primary quickstart path and hits a file-not-found error before they've seen a single result. This is a broken first-run path.\n\nStakes if we pick wrong: The quickstart is broken for every developer who follows the README. First impression is an error, not magic. TTHW is undefined (never completes on the documented path).\n\nRecommendation: A because shipping a README that references a nonexistent file is a contract violation, and the demo module already works.\n\nCompleteness: A=10/10, B=8/10, C=0/10\n\nPros / cons:\nA) Remove the examples/first_eval.py reference from the README; make python -m evalkit.demo the single primary path (recommended)\n ✔️ Aligns the README with what the package actually ships — immediate fix, zero new work\n ✔️ Demo module is documented and tested; consolidates quickstart to one working path\n ❌ Removes the file-based quickstart option; teams who wanted an editable script lose it\nB) Add examples/first_eval.py to the package and examples archive before release\n ✔️ Preserves both quickstart paths; developers who prefer editing a file get one\n ✔️ Addresses the root cause rather than hiding it\n ❌ Requires authoring, testing, and packaging a new file; scope creep against DX POLISH\nC) Leave as-is — accept the broken quickstart\n ✔️ No work required\n ❌ Every developer hits a file-not-found error on the documented path; this is a ship blocker\n\nNet: ship with a broken README link or fix it — the only real choice is A or B.": "A — Remove broken reference, use demo (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:51:23.300Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_013UD9yHb5CjSqQkeoHpENm4",
"questions": [
{
"question": "D4 — 5-minute mandatory CI gate makes the <2min TTHW target impossible: how should the plan address it?\n\nELI10: docs/benchmarks.md says the agreed target is under 2 minutes from install to first result. But docs/current-contracts.md says the SDK blocks for 5 minutes on every first-run evaluation waiting for a remote CI check, and the plan retains this gate unchanged. A 5-minute wait inside a <2-minute target is a logical impossibility. The benchmark measured 6 minutes because the CI wait alone exceeds the target. The plan currently promises <2 minutes while shipping the gate that makes it unreachable.\n\nStakes if we pick wrong: The plan ships with an internal contradiction. Either the TTHW target is meaningless, or the CI gate is silently broken. A Python ML engineer running the demo will wait 5 minutes with no warning that this is expected behavior.\n\nRecommendation: A — add a --local / --skip-ci flag for the demo module; the gate stays for production use. Achieves the <2min target for the first-success experience without removing the gate from CI paths.\n\nCompleteness: A=9/10, B=7/10, C=5/10\n\nPros / cons:\nA) Add --local flag (or EVALKIT_LOCAL=1 env var) to python -m evalkit.demo that skips the CI gate; document it prominently (recommended)\n ✔️ First-success experience hits <2 min; the <2min target becomes achievable\n ✔️ Matches DX First Principle #4: opinionated defaults, escape hatches required\n ❌ Adds one flag to document and test; minor scope against DX POLISH baseline\nB) Revise the TTHW target in the plan to reflect reality (e.g., <7 min including CI wait)\n ✔️ Resolves the contradiction without changing the SDK behavior\n ✔️ Honest about what the CI gate costs the developer\n ❌ Concedes the competitive ground; benchmark shows Peer A already does 2 min\nC) Add a prominent warning in README/demo output that the first run always takes 5 minutes\n ✔️ Expectation-setting reduces abandonment; cheap to implement\n ❌ Developer still waits 5 minutes; TTHW stays at 6 min; target still not met\n\nNet: the plan cannot claim <2min TTHW while mandating a 5-min CI gate without a local escape path.",
"header": "CI gate",
"multiSelect": false,
"options": [
{
"label": "A — Add --local / env var to skip gate for demo (Recommended)",
"description": "Achieves the <2min target for first-success; gate stays for production CI use."
},
{
"label": "B — Revise the TTHW target to <7min",
"description": "Remove the contradiction by updating the target, not the gate."
},
{
"label": "C — Add a prominent 5-minute warning, keep gate and target as-is",
"description": "Expectation-setting only; TTHW contradiction stays in plan."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D4 — 5-minute mandatory CI gate makes the <2min TTHW target impossible: how should the plan address it?\n\nELI10: docs/benchmarks.md says the agreed target is under 2 minutes from install to first result. But docs/current-contracts.md says the SDK blocks for 5 minutes on every first-run evaluation waiting for a remote CI check, and the plan retains this gate unchanged. A 5-minute wait inside a <2-minute target is a logical impossibility. The benchmark measured 6 minutes because the CI wait alone exceeds the target. The plan currently promises <2 minutes while shipping the gate that makes it unreachable.\n\nStakes if we pick wrong: The plan ships with an internal contradiction. Either the TTHW target is meaningless, or the CI gate is silently broken. A Python ML engineer running the demo will wait 5 minutes with no warning that this is expected behavior.\n\nRecommendation: A — add a --local / --skip-ci flag for the demo module; the gate stays for production use. Achieves the <2min target for the first-success experience without removing the gate from CI paths.\n\nCompleteness: A=9/10, B=7/10, C=5/10\n\nPros / cons:\nA) Add --local flag (or EVALKIT_LOCAL=1 env var) to python -m evalkit.demo that skips the CI gate; document it prominently (recommended)\n ✔️ First-success experience hits <2 min; the <2min target becomes achievable\n ✔️ Matches DX First Principle #4: opinionated defaults, escape hatches required\n ❌ Adds one flag to document and test; minor scope against DX POLISH baseline\nB) Revise the TTHW target in the plan to reflect reality (e.g., <7 min including CI wait)\n ✔️ Resolves the contradiction without changing the SDK behavior\n ✔️ Honest about what the CI gate costs the developer\n ❌ Concedes the competitive ground; benchmark shows Peer A already does 2 min\nC) Add a prominent warning in README/demo output that the first run always takes 5 minutes\n ✔️ Expectation-setting reduces abandonment; cheap to implement\n ❌ Developer still waits 5 minutes; TTHW stays at 6 min; target still not met\n\nNet: the plan cannot claim <2min TTHW while mandating a 5-min CI gate without a local escape path.": "A — Add --local / env var to skip gate for demo (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:51:55.881Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_01DyF9zjSEc7yp5rJVQjh2hN",
"questions": [
{
"question": "D5 — AuthError(\"request failed\"): the plan retains a useless error message. Fix it?\n\nELI10: When the API key is invalid or missing, the SDK raises `AuthError(\"request failed\")`. That's it. No error code, no explanation of the cause, no instruction for fixing it. From docs/api.md: \"The plan retains this message.\" A developer who types the key wrong sees a cryptic error with no path forward. Compare to Stripe's auth errors: `No API key provided. Set your API key using STRIPE_API_KEY. You can find your API key in the Dashboard at https://dashboard.stripe.com/apikeys.` That is the DX First Principle #5 standard: problem + cause + fix.\n\nStakes if we pick wrong: A developer whose key is wrong or expired has no idea whether the key format is bad, the key expired, the network is blocked, or the SDK has a bug. They abandon or file a support ticket.\n\nRecommendation: A — replace with a three-tier error message. This is a one-line change in the SDK, and it is exactly what DX POLISH is for.\n\nNote: options differ in kind, not coverage — no completeness score.\n\nPros / cons:\nA) Replace AuthError message with problem + cause + fix (recommended)\n ✔️ Gives the developer the next action: check the key, regenerate it, verify the env var\n ✔️ Zero scope creep: one string change in the SDK; no new API surface\n ❌ None — this is a pure quality improvement with no tradeoff\nB) Retain \"request failed\" as documented in the plan\n ✔️ No change required\n ❌ Every developer with an invalid key gets a dead-end error with no recovery path\n\nNet: this is a straightforward DX POLISH fix; the only question is whether the plan should mandate it.",
"header": "AuthError",
"multiSelect": false,
"options": [
{
"label": "A — Fix AuthError message to include cause + fix (Recommended)",
"description": "Mandate that AuthError carries the key name, cause, and a doc link — one string change."
},
{
"label": "B — Retain current AuthError message",
"description": "Leave \"request failed\" unchanged as documented; no plan change."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D5 — AuthError(\"request failed\"): the plan retains a useless error message. Fix it?\n\nELI10: When the API key is invalid or missing, the SDK raises `AuthError(\"request failed\")`. That's it. No error code, no explanation of the cause, no instruction for fixing it. From docs/api.md: \"The plan retains this message.\" A developer who types the key wrong sees a cryptic error with no path forward. Compare to Stripe's auth errors: `No API key provided. Set your API key using STRIPE_API_KEY. You can find your API key in the Dashboard at https://dashboard.stripe.com/apikeys.` That is the DX First Principle #5 standard: problem + cause + fix.\n\nStakes if we pick wrong: A developer whose key is wrong or expired has no idea whether the key format is bad, the key expired, the network is blocked, or the SDK has a bug. They abandon or file a support ticket.\n\nRecommendation: A — replace with a three-tier error message. This is a one-line change in the SDK, and it is exactly what DX POLISH is for.\n\nNote: options differ in kind, not coverage — no completeness score.\n\nPros / cons:\nA) Replace AuthError message with problem + cause + fix (recommended)\n ✔️ Gives the developer the next action: check the key, regenerate it, verify the env var\n ✔️ Zero scope creep: one string change in the SDK; no new API surface\n ❌ None — this is a pure quality improvement with no tradeoff\nB) Retain \"request failed\" as documented in the plan\n ✔️ No change required\n ❌ Every developer with an invalid key gets a dead-end error with no recovery path\n\nNet: this is a straightforward DX POLISH fix; the only question is whether the plan should mandate it.": "A — Fix AuthError message to include cause + fix (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:52:14.426Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_0181W6gwiM2m2SPz7tAQ5egw",
"questions": [
{
"question": "D6 — run_eval and run_batch have reversed argument order for the same concepts: fix or document?\n\nELI10: From docs/api.md: `run_eval(dataset, evaluator)` and `run_batch(evaluator, dataset)`. The two functions take the same arguments but in reversed order — docs/api.md says this is \"intentional.\" Since neither function requires keyword arguments, a developer who switches between them will silently pass the wrong values in the wrong positions. Python won't raise an error — it will just produce wrong evaluation results. This is a classic API design trap: an inconsistency that looks fine until the developer moves from tutorial code to their own integration.\n\nStakes if we pick wrong: Silent incorrect evaluations. A developer who uses run_eval and then tries run_batch will flip dataset and evaluator and get wrong scores with no error message.\n\nRecommendation: A — standardize order and add keyword-argument enforcement. This prevents silent misuse and makes both functions consistent with each other.\n\nNote: options differ in kind, not coverage — no completeness score.\n\nPros / cons:\nA) Standardize to one consistent order (dataset, evaluator) across both functions; require keyword args (recommended)\n ✔️ Eliminates the silent-wrong-result trap; consistent API is learnable without docs\n ✔️ Keyword enforcement surfaces mistakes as clear errors at call time, not wrong outputs\n ❌ Minor breaking change if anyone is already calling run_batch by position; needs changelog entry\nB) Keep reversed order but add a deprecation-style warning when called without keyword args\n ✔️ Non-breaking; warns developers without forcing a signature change\n ❌ The inconsistency remains; warning only fires at runtime, not during code review\nC) Keep as-is — treat the reversed order as intentional and undocumented gotcha\n ✔️ No change\n ❌ Creates silent wrong-result bugs for every developer who uses both functions\n\nNet: a reversed positional-arg order with no keyword enforcement is a correctness trap, not a style choice.",
"header": "API design",
"multiSelect": false,
"options": [
{
"label": "A — Standardize order + require keyword args (Recommended)",
"description": "Align both functions to (dataset, evaluator); enforce keyword-only to prevent silent misuse."
},
{
"label": "B — Keep order, add runtime warning for positional calls",
"description": "Non-breaking; warns but doesn't fix the inconsistency."
},
{
"label": "C — Keep as-is, treat as intentional",
"description": "No plan change; silent wrong-result risk stays."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D6 — run_eval and run_batch have reversed argument order for the same concepts: fix or document?\n\nELI10: From docs/api.md: `run_eval(dataset, evaluator)` and `run_batch(evaluator, dataset)`. The two functions take the same arguments but in reversed order — docs/api.md says this is \"intentional.\" Since neither function requires keyword arguments, a developer who switches between them will silently pass the wrong values in the wrong positions. Python won't raise an error — it will just produce wrong evaluation results. This is a classic API design trap: an inconsistency that looks fine until the developer moves from tutorial code to their own integration.\n\nStakes if we pick wrong: Silent incorrect evaluations. A developer who uses run_eval and then tries run_batch will flip dataset and evaluator and get wrong scores with no error message.\n\nRecommendation: A — standardize order and add keyword-argument enforcement. This prevents silent misuse and makes both functions consistent with each other.\n\nNote: options differ in kind, not coverage — no completeness score.\n\nPros / cons:\nA) Standardize to one consistent order (dataset, evaluator) across both functions; require keyword args (recommended)\n ✔️ Eliminates the silent-wrong-result trap; consistent API is learnable without docs\n ✔️ Keyword enforcement surfaces mistakes as clear errors at call time, not wrong outputs\n ❌ Minor breaking change if anyone is already calling run_batch by position; needs changelog entry\nB) Keep reversed order but add a deprecation-style warning when called without keyword args\n ✔️ Non-breaking; warns developers without forcing a signature change\n ❌ The inconsistency remains; warning only fires at runtime, not during code review\nC) Keep as-is — treat the reversed order as intentional and undocumented gotcha\n ✔️ No change\n ❌ Creates silent wrong-result bugs for every developer who uses both functions\n\nNet: a reversed positional-arg order with no keyword enforcement is a correctness trap, not a style choice.": "A — Standardize order + require keyword args (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:52:34.478Z"
},
{
"sessionId": "7ed1eb96-03ea-429a-a28d-a436c9db55fe",
"toolUseId": "toolu_01U9xG3jqLvwP4qai5GLXbtE",
"questions": [
{
"question": "D7 — v1→v2 removes Client.evaluate() with no migration path: add one?\n\nELI10: From docs/api.md: Version 1 has `Client.evaluate()`. Version 2 replaces it with `Client.run()` and removes the old name immediately — no compatibility alias, no deprecation warning, no migration guide, no codemod. Any developer who upgrades from v1 to v2 will get `AttributeError: 'Client' object has no attribute 'evaluate'` with no explanation and no path forward. They will either stay pinned to v1 forever or manually diff changelogs to find the rename.\n\nStakes if we pick wrong: Every v1 user who upgrades gets a hard break with no recovery path. Upgrade fear is one of the top reasons developers stay on old versions indefinitely.\n\nRecommendation: A — add a v1→v2 migration guide and a one-version deprecation alias. This is exactly what DX POLISH is for: making upgrades boring.\n\nCompleteness: A=9/10, B=6/10, C=0/10\n\nPros / cons:\nA) Add a v1→v2 migration guide (one page) + Client.evaluate() alias in v2 that raises DeprecationWarning pointing to Client.run() (recommended)\n ✔️ Developers can upgrade without a hard break; the alias tells them exactly what changed\n ✔️ Migration guide is a one-time doc addition; alias is a one-line shim\n ❌ Carries the alias until v3; minor maintenance burden\nB) Add a migration guide only (no alias)\n ✔️ Documents the rename; developer knows what to search-replace\n ❌ Still a hard break on upgrade; the AttributeError fires before the developer checks docs\nC) Keep as-is — undocumented breaking rename with no alias\n ✔️ No additional work\n ❌ v1 users are permanently blocked on upgrade or silently broken until they debug the AttributeError\n\nNet: a silent rename with no alias and no migration guide is the highest-friction upgrade path possible.",
"header": "Migration",
"multiSelect": false,
"options": [
{
"label": "A — Migration guide + DeprecationWarning alias (Recommended)",
"description": "Add docs/migration-v1-v2.md and a Client.evaluate() shim that warns and calls Client.run()."
},
{
"label": "B — Migration guide only, no alias",
"description": "Document the rename; developer still gets a hard break on upgrade."
},
{
"label": "C — Keep as-is",
"description": "No migration path; v1 users silently break on upgrade."
}
]
}
],
"answered": true,
"failed": false,
"answers": {
"D7 — v1→v2 removes Client.evaluate() with no migration path: add one?\n\nELI10: From docs/api.md: Version 1 has `Client.evaluate()`. Version 2 replaces it with `Client.run()` and removes the old name immediately — no compatibility alias, no deprecation warning, no migration guide, no codemod. Any developer who upgrades from v1 to v2 will get `AttributeError: 'Client' object has no attribute 'evaluate'` with no explanation and no path forward. They will either stay pinned to v1 forever or manually diff changelogs to find the rename.\n\nStakes if we pick wrong: Every v1 user who upgrades gets a hard break with no recovery path. Upgrade fear is one of the top reasons developers stay on old versions indefinitely.\n\nRecommendation: A — add a v1→v2 migration guide and a one-version deprecation alias. This is exactly what DX POLISH is for: making upgrades boring.\n\nCompleteness: A=9/10, B=6/10, C=0/10\n\nPros / cons:\nA) Add a v1→v2 migration guide (one page) + Client.evaluate() alias in v2 that raises DeprecationWarning pointing to Client.run() (recommended)\n ✔️ Developers can upgrade without a hard break; the alias tells them exactly what changed\n ✔️ Migration guide is a one-time doc addition; alias is a one-line shim\n ❌ Carries the alias until v3; minor maintenance burden\nB) Add a migration guide only (no alias)\n ✔️ Documents the rename; developer knows what to search-replace\n ❌ Still a hard break on upgrade; the AttributeError fires before the developer checks docs\nC) Keep as-is — undocumented breaking rename with no alias\n ✔️ No additional work\n ❌ v1 users are permanently blocked on upgrade or silently broken until they debug the AttributeError\n\nNet: a silent rename with no alias and no migration guide is the highest-friction upgrade path possible.": "A — Migration guide + DeprecationWarning alias (Recommended)"
},
"unansweredQuestionIndices": [],
"answeredAt": "2026-09-09T13:52:55.036Z"
}
]