test(plan-devex floor): a 'Partly wrong' 0B answer is the narrative confirmation

PR lane 36794871032: the DX floor asked its D1 narrative confirmation
(Accurate, proceed / Partly wrong, correct it / Way off, actual is...). The
deterministic setup rule accepted only 'Some ... wrong', so the question went
to the LLM assessor, which hit its 30 s spawnSync cap (ETIMEDOUT) and ended
the case as assessment_error at 141 s, the same failure as census
36641820398. The rule now accepts 'partly' beside 'some'; the captured
question is a free regression and the remedy-option controls still go to
the assessor.
This commit is contained in:
garrytan committed 2026-10-01 00:44:16 +00:00
1 parent 4cf49c74d4
commit 4e0871f712
3 files changed
+37 -4

No files matched your search

@@ -0,0 +1,29 @@
{
"source": "PR lane 36794871032 (head 20d6e98f), paid-slice-4, plan-devex-finding-floor: the assessor timed out (spawnSync ETIMEDOUT at its 30s cap) on this current D1 narrative confirmation, whose middle answer reads 'Partly wrong'.",
"review": {
"seed": "Proceed directly to the requested review; skip the optional /office-hours prerequisite.\n\nThis actor has already declined routing setup, cross-project recall and outside reviewers.\n\nPreserve the supplied product scope. For review-mode questions choose HOLD SCOPE (CEO), DX POLISH (DX), or the full BIG CHANGE review (Eng). Design: review all seven dimensions.\n\nProduct type is confirmed: SDK quickstart documentation, with the complete journey to the first SDK call as context. If asked to classify, choose SDK + Docs when offered, otherwise Documentation. This confirms the review lens; it does not expand the plan.\n\nTarget persona is confirmed: a hands-on developer integrating this SDK for the first time, trying to make one successful call. Product type and persona setup are already answered; proceed to reviewing the supplied plan.\n\nFor setup confirmations, this actor can supply only the following persona/journey correction through the native custom answer. It does not approve a proposed narrative, remedy, or scope change: Confirmed persona: a hands-on developer making a first SDK call. The declared onboarding facts are: Step 1: clone the repo. Step 2: install bun manually if not present. Step 3: copy .env.example to .env and fill in 8 environment variables. Step 4: run database migrations against your local Postgres. Step 5: start the dev server. Step 6: open the docs in a separate tab. Step 7: register an API key by emailing the team. Step 8: paste the key into your .env, restart the server, then make your first SDK call. No quickstart command, no hosted sandbox, no copy-pasteable curl example. No measured turnaround, outputs, or runtime behavior were supplied. Keep predictions and unknowns labeled. This supplies persona and empathy context only; proposed fixes and scope changes remain undecided.\n\nPlease review this plan thoroughly. As you go, write your plan-mode plan to /home/runner/.cache/gstack-paid-shard-AWiihx/tmp/gstack-plan-count-OdDESx/gstack-test-plan-devex-floor.md (use Edit/Write to that exact path).\n\n# Plan: SDK quickstart docs\n\n## Onboarding flow\nStep 1: clone the repo.\nStep 2: install bun manually if not present.\nStep 3: copy .env.example to .env and fill in 8 environment variables.\nStep 4: run database migrations against your local Postgres.\nStep 5: start the dev server.\nStep 6: open the docs in a separate tab.\nStep 7: register an API key by emailing the team.\nStep 8: paste the key into your .env, restart the server, then make\nyour first SDK call.\n\nNo quickstart command, no hosted sandbox, no copy-pasteable curl example.",
"candidate": {
"transport": "native",
"identity": "d859e358-aa48-444b-b578-d45fade3db6f:toolu_015emnUg5hxVmjMBGorBAKsi:question:0",
"question": {
"header": "Narrative",
"question": "D1 \u2014 Does this first-call narrative match reality?\nProject/branch/task: gstack-plan-count-OdDESx on main, DX review of the SDK quickstart plan (PLAN.md).\nELI10: Before I score anything I need to feel what your first-time developer feels. Below is a first-person walk through the eight declared steps. Observed facts come from PLAN.md; anything I could not see is labeled unknown or prediction. If the picture is wrong, every finding downstream is wrong too.\n\nNARRATIVE: \"My ticket says: make one call with this SDK and prove it works. I clone the repo (step 1). Step 2 says install bun if I don't have it; I don't, so I leave the page to find bun's installer (prediction: 2-5 min context switch). Step 3: copy .env.example to .env and fill in eight variables. Unknown whether each is explained; prediction: I guess at several. Step 4: run migrations against my local Postgres. I pause: I came to call an SDK, why do I need a database? If Postgres is not running I'm installing that too (unknown). Step 5: start the dev server; unknown what it prints or how I know it worked. Step 6: open docs in another tab. Step 7: email the team for an API key. I stop here and wait; turnaround is unknown, could be minutes or days. Step 8: paste the key, restart, make the call. Unknown what success looks like; no expected output and no curl example to tell an SDK bug from a server or key problem.\"\n\nStakes if we pick wrong: a wrong narrative sends the whole review after the wrong friction.\nRecommendation: B because the narrative is built from declared steps only and you hold facts (turnaround, outputs, README state) I cannot see.\nNote: options differ in kind, not coverage \u2014 no completeness score.\nPros / cons:\nA) Accurate, proceed\n \u2705 Review starts immediately on the eight-step journey as written in PLAN.md\n \u2705 Unknowns stay labeled as unknown in every downstream artifact\n \u274c Any real-world detail I guessed wrong propagates into the scores unchallenged\nB) Partly wrong, I will correct it (recommended)\n \u2705 Lets you supply turnaround, outputs, or README facts that sharpen each finding\n \u2705 Corrections land in notes before anything is written to the plan file\n \u274c Costs one reply before the benchmark and target question\nC) Way off, actual experience is...\n \u2705 Replaces the narrative wholesale with your observed journey\n \u2705 Prevents a review built on a mistaken product model\n \u274c Requires you to write the full journey yourself\nNet: I'm trading one reply from you against the risk of scoring an imagined journey.",
"options": [
{
"label": "Accurate, proceed",
"description": "\u2705 Review starts on the eight-step journey as written in PLAN.md\n\u2705 Unknowns stay labeled downstream\n\u274c Guessed details propagate unchallenged into scores"
},
{
"label": "Partly wrong, correct it (recommended)",
"description": "\u2705 You supply turnaround, outputs, or README facts I cannot see\n\u2705 Corrections land in notes before any plan-file write\n\u274c Costs one reply before the target question"
},
{
"label": "Way off, actual is...",
"description": "\u2705 Replaces the narrative with your observed journey\n\u2705 Prevents a review built on a mistaken product model\n\u274c You write the full journey yourself"
}
],
"multiSelect": false
}
}
}
}
+2 -2
View File
@@ -139,11 +139,11 @@ function deterministicPlanFloorSetup(input: PlanFloorReview): PlanFloorAssessmen
// plan-devex-review 0B's confirmation contract: the brief asks whether the
// narrative matches reality and every option is one of its three answers
// (accurate / some wrong / way off). Any remedy option leaves it to the assessor.
// (accurate / some or partly wrong / way off). Any remedy option leaves it to the assessor.
const isDxNarrativeConfirmation =
/\b(?:empathy|narrative)\b/.test(header) &&
/\b(?:narrative|journey)\b[^?\n]*\bmatch\b[^?\n]*\?/.test(q.question.split(/\r?\n/)[0]!.toLowerCase()) &&
q.options.every(o => /^(?:[a-d][).:]\s*)?(?:(?:this is\s+)?accurate|some\b[^,]*?\b(?:wrong|corrections?)|(?:this is\s+)?way off)\b/i.test(o.label.trim()));
q.options.every(o => /^(?:[a-d][).:]\s*)?(?:(?:this is\s+)?accurate|(?:some|partly)\b[^,]*?\b(?:wrong|corrections?)|(?:this is\s+)?way off)\b/i.test(o.label.trim()));
const isProductTypeSetup =
header === 'product type' &&
+6 -2
View File
@@ -4,6 +4,7 @@ import {FORCING_FLOOR_CEO, FORCING_FLOOR_DEVEX} from './fixtures/forcing-finding
import capturedQuotes from './fixtures/plan-floor-quote-70b.json';
import productTypes from './fixtures/plan-floor-product-type-70b.json';
import narrativeConfirmation from './fixtures/devex-narrative-confirmation-36641820398.json';
import partlyWrongNarrative from './fixtures/devex-narrative-confirmation-36794871032.json';
const review = ():PlanFloorReview=>({seed:FORCING_FLOOR_CEO,candidate:{transport:'native',identity:'owned:call:question:0',question:{
header:'Evidence',question:'Pricing is assumed to block adoption without developer interviews. Should we test that premise before launch?',multiSelect:false,
options:[{label:'Interview developers',description:'Validate pricing as a barrier before changing the tier.'},{label:'Ship the tier',description:'Launch using the current untested premise.'}],
@@ -96,8 +97,11 @@ test.each([
expect(calls).toBe(0);
});
const capturedNarrative = ():PlanFloorReview=>structuredClone(narrativeConfirmation.review) as PlanFloorReview;
test('captured 0B narrative confirmation is setup without launching the assessor',()=>{
const input=capturedNarrative(),before=structuredClone(input);let calls=0;
test.each([
['some wrong',()=>capturedNarrative()],
['partly wrong',()=>structuredClone(partlyWrongNarrative.review) as PlanFloorReview],
] as const)('captured 0B narrative confirmation (%s) is setup without launching the assessor',(_label,capture)=>{
const input=capture(),before=structuredClone(input);let calls=0;
const actual=judgePlanFloorReview(input,{binary:'fake',model:'warmup',deadlineAt:Date.now()+30_000,
invoke:(()=>{calls++;throw Error('must not launch');}) as any});
expect(actual).toMatchObject({kind:'setup',seedQuote:'',questionQuote:'',optionIndex:null,optionQuote:''});