From d8e4a59cadded9104ee19c2ff388f2e972af43a9 Mon Sep 17 00:00:00 2001 From: HosungYou <136484001+HosungYou@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:27:54 +0900 Subject: [PATCH] Make LongTable interview pressure-first --- README.md | 8 +- docs/LONGTABLE-COMMAND-SURFACE.md | 5 +- docs/QUESTION-RUNTIME.md | 4 +- docs/release-notes-0.1.70.md | 30 ++++++ package-lock.json | 102 +++++++----------- package.json | 2 +- packages/longtable-checkpoints/package.json | 4 +- packages/longtable-core/package.json | 2 +- packages/longtable-mcp/package.json | 14 +-- packages/longtable-memory/package.json | 4 +- .../longtable-provider-claude/package.json | 8 +- .../longtable-provider-claude/src/skills.ts | 17 +-- .../longtable-provider-codex/package.json | 8 +- .../longtable-provider-codex/src/skills.ts | 17 +-- .../longtable-research-search/package.json | 4 +- .../longtable-scholar-research/package.json | 2 +- packages/longtable-setup/package.json | 6 +- packages/longtable/README.md | 6 +- packages/longtable/package.json | 16 +-- scripts/e2e-grilling-interview-flow.mjs | 18 +++- scripts/smoke-setup-flow.mjs | 15 ++- 21 files changed, 155 insertions(+), 137 deletions(-) create mode 100644 docs/release-notes-0.1.70.md diff --git a/README.md b/README.md index d603b5d..3f52bfc 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,8 @@ Required routing: - `$longtable-interview` is the grilling interview surface. - It does not require a Research Specification before asking the next pressure question. -- It asks one question at a time, states the tension, gives a recommended - answer, and asks the researcher to accept, revise, or reject it. +- It asks one pressure question at a time, shows the tension, and avoids option + menus or approval prompts. - If only a First Research Shape exists, LongTable continues through `$longtable-start` until a Research Specification is created or explicitly kept open. @@ -98,8 +98,8 @@ decisions, open questions, next actions, and confidence. argument, method, manuscript, evidence standard, or product decision. It inspects `CURRENT.md`, `.longtable/`, supplied documents, and cited evidence first when those can answer the question. Then it asks one high-leverage question using -this frame: tension, recommended answer, and a request to accept, revise, or -reject that recommendation. +this frame: `Tension:` plus `Pressure question:`. It does not ask the +researcher to pick from options. The interview continues only while the next question can produce a new decision, sharper boundary, stronger evidence standard, or clearer open tension. It stops diff --git a/docs/LONGTABLE-COMMAND-SURFACE.md b/docs/LONGTABLE-COMMAND-SURFACE.md index ca80b10..00b661b 100644 --- a/docs/LONGTABLE-COMMAND-SURFACE.md +++ b/docs/LONGTABLE-COMMAND-SURFACE.md @@ -52,9 +52,8 @@ LongTable grilling interview: - reads `CURRENT.md`, `.longtable/`, supplied documents, and cited evidence before asking when those sources can answer - asks one relentless sharpening question at a time -- states the tension -- gives the recommended answer -- asks the researcher to accept, revise, or reject the recommendation +- uses a `Tension:` plus `Pressure question:` frame +- avoids option menus, numbered choices, and approval prompts - continues only while the next question can produce a new decision, sharper boundary, stronger evidence standard, or clearer open tension - stops when remaining questions repeat the same tension without producing a diff --git a/docs/QUESTION-RUNTIME.md b/docs/QUESTION-RUNTIME.md index cf3c898..0bbe089 100644 --- a/docs/QUESTION-RUNTIME.md +++ b/docs/QUESTION-RUNTIME.md @@ -58,8 +58,8 @@ questions and creates or updates the Research Specification. `$longtable-interview` is a grilling interview surface. It can use the Research Specification when one exists, but it does not require one before asking a -pressure question. It asks one question at a time, states the tension, gives the -recommended answer, and asks the researcher to accept, revise, or reject it. +pressure question. It asks one question at a time using `Tension:` and +`Pressure question:`, without option menus or approval prompts. If the researcher explicitly wants a first research-start interview, use `$longtable-start`. Otherwise, `$longtable-interview` stays in the grilling diff --git a/docs/release-notes-0.1.70.md b/docs/release-notes-0.1.70.md new file mode 100644 index 0000000..965833f --- /dev/null +++ b/docs/release-notes-0.1.70.md @@ -0,0 +1,30 @@ +# LongTable 0.1.70 + +LongTable 0.1.70 makes `$longtable-interview` pressure-first instead of +approval-first. The generated Codex and Claude skills now ask one direct +research pressure question at a time, without returning to the older +recommended-answer and accept/revise/reject flow. + +## Changes + +- Replaces the `$longtable-interview` recommended-answer frame with a + `Tension:` plus `Pressure question:` frame. +- Forbids option menus, numbered choices, and approval prompts inside the + grilling interview loop. +- Delays LongTable MCP/state writes until after the researcher answers or + explicitly asks to record a decision. +- Extends the grilling-interview smoke test so generated skills fail if they + reintroduce recommended-answer or accept/revise/reject language. + +## Migration + +Use `$longtable-interview` when the researcher wants a direct pressure +interview over a plan, claim, method, evidence standard, manuscript, or +LongTable product decision. Use `$longtable-start` or normal Researcher +Checkpoints when structured choices are the desired surface. + +## Verification + +- `npm run build` +- `npm run smoke:grilling-interview` +- `npm run release:check` diff --git a/package-lock.json b/package-lock.json index 623ab4c..8b0b727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "longtable-monorepo", - "version": "0.1.69", + "version": "0.1.70", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "longtable-monorepo", - "version": "0.1.69", + "version": "0.1.70", "workspaces": [ "packages/*" ], @@ -1259,17 +1259,17 @@ }, "packages/longtable": { "name": "@longtable/cli", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { "@clack/prompts": "^1.2.0", - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/memory": "0.1.69", - "@longtable/provider-claude": "0.1.69", - "@longtable/provider-codex": "0.1.69", - "@longtable/scholar-research": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/memory": "0.1.70", + "@longtable/provider-claude": "0.1.70", + "@longtable/provider-codex": "0.1.70", + "@longtable/scholar-research": "0.1.70", + "@longtable/setup": "0.1.70" }, "bin": { "longtable": "bin/longtable" @@ -1284,10 +1284,10 @@ }, "packages/longtable-checkpoints": { "name": "@longtable/checkpoints", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.69" + "@longtable/core": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" @@ -1298,7 +1298,7 @@ }, "packages/longtable-core": { "name": "@longtable/core", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "devDependencies": { "typescript": "^5.6.0" @@ -1309,15 +1309,15 @@ }, "packages/longtable-mcp": { "name": "@longtable/mcp", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/cli": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/provider-claude": "0.1.69", - "@longtable/provider-codex": "0.1.69", - "@longtable/setup": "0.1.69", + "@longtable/checkpoints": "0.1.70", + "@longtable/cli": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/provider-claude": "0.1.70", + "@longtable/provider-codex": "0.1.70", + "@longtable/setup": "0.1.70", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, @@ -1332,33 +1332,12 @@ "node": ">=18.0.0" } }, - "packages/longtable-mcp/node_modules/@longtable/memory": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/@longtable/memory/-/memory-0.1.68.tgz", - "integrity": "sha512-TLXh2mQWoojLbQ5aYYYfo1HDOd5EaQHl8vjUzYufiQmF11WxXHBsmIqkF4QS+AybfG0zjfYlr2B9ceQZ+GCZ+w==", - "license": "MIT", - "dependencies": { - "@longtable/core": "0.1.68" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "packages/longtable-mcp/node_modules/@longtable/scholar-research": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/@longtable/scholar-research/-/scholar-research-0.1.68.tgz", - "integrity": "sha512-BUF7eHgJTK+rCS2JjBX3qWhGx6XCCsSRYzP5mLjQV72FeqMle3+Tjxefl/o41KsOvNAWy6W+eLAOEEiVfLUikQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "packages/longtable-memory": { "name": "@longtable/memory", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.69" + "@longtable/core": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" @@ -1369,12 +1348,12 @@ }, "packages/longtable-provider-claude": { "name": "@longtable/provider-claude", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/setup": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" @@ -1385,12 +1364,12 @@ }, "packages/longtable-provider-codex": { "name": "@longtable/provider-codex", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/setup": "0.1.70" }, "devDependencies": { "@types/node": "^22.10.1", @@ -1402,10 +1381,10 @@ }, "packages/longtable-research-search": { "name": "@longtable/research-search", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/scholar-research": "0.1.69" + "@longtable/scholar-research": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" @@ -1416,7 +1395,7 @@ }, "packages/longtable-scholar-research": { "name": "@longtable/scholar-research", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "devDependencies": { "@types/node": "^22.10.1", @@ -1428,11 +1407,11 @@ }, "packages/longtable-setup": { "name": "@longtable/setup", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.69", - "@longtable/memory": "0.1.69" + "@longtable/core": "0.1.70", + "@longtable/memory": "0.1.70" }, "devDependencies": { "@types/node": "^22.0.0", @@ -1441,15 +1420,6 @@ "engines": { "node": ">=18.0.0" } - }, - "packages/longtable/node_modules/@longtable/scholar-research": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/@longtable/scholar-research/-/scholar-research-0.1.68.tgz", - "integrity": "sha512-BUF7eHgJTK+rCS2JjBX3qWhGx6XCCsSRYzP5mLjQV72FeqMle3+Tjxefl/o41KsOvNAWy6W+eLAOEEiVfLUikQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } } } } diff --git a/package.json b/package.json index e163b6f..0f01e48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "longtable-monorepo", - "version": "0.1.69", + "version": "0.1.70", "private": true, "description": "Monorepo for the LongTable product surface and provider-neutral runtime packages", "workspaces": [ diff --git a/packages/longtable-checkpoints/package.json b/packages/longtable-checkpoints/package.json index 3e67f83..1ac16d0 100644 --- a/packages/longtable-checkpoints/package.json +++ b/packages/longtable-checkpoints/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/checkpoints", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Checkpoint policy engine for LongTable", "type": "module", @@ -21,7 +21,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/core": "0.1.69" + "@longtable/core": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-core/package.json b/packages/longtable-core/package.json index 4a521c9..4a1d476 100644 --- a/packages/longtable-core/package.json +++ b/packages/longtable-core/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/core", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Provider-neutral domain models and contracts for LongTable", "type": "module", diff --git a/packages/longtable-mcp/package.json b/packages/longtable-mcp/package.json index 773377c..c4fff55 100644 --- a/packages/longtable-mcp/package.json +++ b/packages/longtable-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/mcp", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "LongTable MCP transport for workspace state and Researcher Checkpoints", "type": "module", @@ -26,12 +26,12 @@ "self-test": "node ./dist/server.js --self-test" }, "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/cli": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/provider-claude": "0.1.69", - "@longtable/provider-codex": "0.1.69", - "@longtable/setup": "0.1.69", + "@longtable/checkpoints": "0.1.70", + "@longtable/cli": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/provider-claude": "0.1.70", + "@longtable/provider-codex": "0.1.70", + "@longtable/setup": "0.1.70", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, diff --git a/packages/longtable-memory/package.json b/packages/longtable-memory/package.json index aa3483d..2ff8132 100644 --- a/packages/longtable-memory/package.json +++ b/packages/longtable-memory/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/memory", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Memory contracts for LongTable explicit state, inferred hypotheses, and open tensions", "type": "module", @@ -21,7 +21,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/core": "0.1.69" + "@longtable/core": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/package.json b/packages/longtable-provider-claude/package.json index 036df84..3f682de 100644 --- a/packages/longtable-provider-claude/package.json +++ b/packages/longtable-provider-claude/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/provider-claude", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Claude adapter surface for LongTable", "type": "module", @@ -21,9 +21,9 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/setup": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/src/skills.ts b/packages/longtable-provider-claude/src/skills.ts index 86d687b..8f74162 100644 --- a/packages/longtable-provider-claude/src/skills.ts +++ b/packages/longtable-provider-claude/src/skills.ts @@ -82,7 +82,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "- `longtable: use editor, reviewer, methods, measurement, and voice perspectives as a panel to evaluate this manuscript section. Do not collapse disagreement too early.`", "- `$longtable-methods`, `$longtable-measure`, `$longtable-theory`, `$longtable-reviewer`, or `$longtable-voice` when the researcher explicitly wants that shortcut.", "- `$longtable-start` to create or continue the first research-start interview.", - "- `$longtable-interview` to run a LongTable grilling interview with one high-leverage question and a recommended answer at a time.", + "- `$longtable-interview` to run a LongTable grilling interview with one high-leverage pressure question at a time.", "- `$scholar-research` for scholarly evidence recovery, citation-slot research, and legal full-text readiness.", "", "## Rules", @@ -93,7 +93,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "- For systematic review, meta-analysis, PDF collection, full-text extraction, institutionally licensed sources, or TDM work, ensure `longtable access setup` readiness exists or surface an ACCESS CHECKPOINT before continuing.", "- Access setup records capability status only. The researcher handles VPN/proxy/library/SSO login directly; LongTable must not store passwords, API keys, tokens, PDFs, or full text in setup state.", "- For `$longtable-start`, use natural-language turns for the interview and reserve structured options for final Research Specification confirmation; First Research Shape is only a shorter handle/resume layer.", - "- For `$longtable-interview`, ask one relentless sharpening question at a time. State the tension, give the recommended answer, and ask the researcher to accept, revise, or reject it. Stop when remaining questions repeat the same tension without producing a new decision.", + "- For `$longtable-interview`, ask one relentless sharpening question at a time. Use `Tension:` and `Pressure question:`. Do not present option menus, numbered choices, or approval prompts. Stop when remaining questions repeat the same tension without producing a new decision.", "- Do not let unrelated pending Researcher Checkpoints interrupt the interview. Mention them only as separate unresolved checkpoints, and treat them as blocking only when the researcher is confirming, saving, or recording a research decision.", "- If a Researcher Checkpoint is needed, ask a short structured question with meaningful options and wait for the researcher.", "- If changing LongTable product language, README positioning, or checkpoint policy, ask a Meta-Decision Checkpoint first.", @@ -291,7 +291,9 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "", "- Ask one question at a time.", "- Each question must expose a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", - "- For each question, state the tension, give the recommended answer, and ask the researcher to accept, revise, or reject it.", + "- Each turn must include `Tension:` and `Pressure question:`.", + "- No option menus: do not present A/B/C, numbered choices, or approval choices.", + "- If a recommendation is useful, make it a brief pressure point after the question, not a menu of acceptable answers.", "- Continue only while the next question can produce a new decision, sharper boundary, stronger evidence standard, or clearer open tension.", "- Stop when remaining questions repeat the same tension without producing a new decision.", "", @@ -299,10 +301,11 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "", "1. Read available project state and identify the highest-leverage unresolved tension.", "2. Ask exactly one question.", - "3. Include `Tension:`, `Recommended answer:`, and `Question:` in the prompt.", - "4. Ask the researcher to accept, revise, or reject the recommended answer.", - "5. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", - "6. Record the resulting decision as a `DecisionRecord`, Research Specification patch, or explicit open tension when MCP/state tools are available; never silently overwrite conflicting research commitments." + "3. Include `Tension:` and `Pressure question:` in the prompt.", + "4. Make the researcher answer the pressure question directly; do not ask them to pick from options.", + "5. Use MCP/state only after the researcher answers or explicitly asks to record a decision.", + "6. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", + "7. Record the resulting decision as a `DecisionRecord`, Research Specification patch, or explicit open tension when MCP/state tools are available; never silently overwrite conflicting research commitments." ] }, { diff --git a/packages/longtable-provider-codex/package.json b/packages/longtable-provider-codex/package.json index 1c19866..75ad2ca 100644 --- a/packages/longtable-provider-codex/package.json +++ b/packages/longtable-provider-codex/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/provider-codex", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Codex adapter surface for LongTable", "type": "module", @@ -15,9 +15,9 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/setup": "0.1.70" }, "devDependencies": { "@types/node": "^22.10.1", diff --git a/packages/longtable-provider-codex/src/skills.ts b/packages/longtable-provider-codex/src/skills.ts index 335f277..cba5855 100644 --- a/packages/longtable-provider-codex/src/skills.ts +++ b/packages/longtable-provider-codex/src/skills.ts @@ -82,7 +82,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "- `$longtable: use editor, reviewer, methods, measurement, and voice perspectives as a panel to evaluate this manuscript section. Do not collapse disagreement too early.`", "- `$longtable-methods`, `$longtable-measure`, `$longtable-theory`, `$longtable-reviewer`, or `$longtable-voice` when the researcher explicitly wants that shortcut.", "- `$longtable-start` to create or continue the first research-start interview.", - "- `$longtable-interview` to run a LongTable grilling interview with one high-leverage question and a recommended answer at a time.", + "- `$longtable-interview` to run a LongTable grilling interview with one high-leverage pressure question at a time.", "- `$scholar-research` for scholarly evidence recovery, citation-slot research, and legal full-text readiness.", "", "## Routing Rules", @@ -126,7 +126,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "- For systematic review, meta-analysis, PDF collection, full-text extraction, institutionally licensed sources, or TDM work, ensure `longtable access setup` readiness exists or surface an ACCESS CHECKPOINT before continuing.", "- Access setup records capability status only. The researcher handles VPN/proxy/library/SSO login directly; LongTable must not store passwords, API keys, tokens, PDFs, or full text in setup state.", "- For `$longtable-start`, use natural-language turns for the interview and reserve MCP option UI for the final research-facing Research Specification checkpoint; First Research Shape is only a shorter handle/resume layer.", - "- For `$longtable-interview`, ask one relentless sharpening question at a time. State the tension, give the recommended answer, and ask the researcher to accept, revise, or reject it. Stop when remaining questions repeat the same tension without producing a new decision.", + "- For `$longtable-interview`, ask one relentless sharpening question at a time. Use `Tension:` and `Pressure question:`. Do not present option menus, numbered choices, or approval prompts. Stop when remaining questions repeat the same tension without producing a new decision.", "- Do not let unrelated pending Researcher Checkpoints interrupt the interview. Mention them only as separate unresolved checkpoints, and treat them as blocking only when the researcher is confirming, saving, or recording a research decision.", "- When the `mcp__longtable_state__.elicit_question` tool is available, use it first for researcher checkpoints so Codex can show the MCP elicitation UI and LongTable can record the answer as `mcp_elicitation`.", "- Use `longtable question --print --provider codex --prompt \"...\"` only as a fallback when the MCP tool is unavailable, unsupported, declined, canceled, or blocked by the client.", @@ -328,7 +328,9 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "", "- Ask one question at a time.", "- Each question must expose a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", - "- For each question, state the tension, give the recommended answer, and ask the researcher to accept, revise, or reject it.", + "- Each turn must include `Tension:` and `Pressure question:`.", + "- No option menus: do not present A/B/C, numbered choices, or approval choices.", + "- If a recommendation is useful, make it a brief pressure point after the question, not a menu of acceptable answers.", "- Continue only while the next question can produce a new decision, sharper boundary, stronger evidence standard, or clearer open tension.", "- Stop when remaining questions repeat the same tension without producing a new decision.", "", @@ -336,10 +338,11 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "", "1. Read available project state and identify the highest-leverage unresolved tension.", "2. Ask exactly one question.", - "3. Include `Tension:`, `Recommended answer:`, and `Question:` in the prompt.", - "4. Ask the researcher to accept, revise, or reject the recommended answer.", - "5. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", - "6. Record the resulting decision as a `DecisionRecord`, Research Specification patch, or explicit open tension when MCP/state tools are available; never silently overwrite conflicting research commitments.", + "3. Include `Tension:` and `Pressure question:` in the prompt.", + "4. Make the researcher answer the pressure question directly; do not ask them to pick from options.", + "5. Use MCP/state only after the researcher answers or explicitly asks to record a decision.", + "6. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", + "7. Record the resulting decision as a `DecisionRecord`, Research Specification patch, or explicit open tension when MCP/state tools are available; never silently overwrite conflicting research commitments.", "", "## Fallback", "", diff --git a/packages/longtable-research-search/package.json b/packages/longtable-research-search/package.json index a909064..cb62928 100644 --- a/packages/longtable-research-search/package.json +++ b/packages/longtable-research-search/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/research-search", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Deprecated compatibility layer for @longtable/scholar-research", "type": "module", @@ -21,7 +21,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/scholar-research": "0.1.69" + "@longtable/scholar-research": "0.1.70" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-scholar-research/package.json b/packages/longtable-scholar-research/package.json index b9810c5..7caeb71 100644 --- a/packages/longtable-scholar-research/package.json +++ b/packages/longtable-scholar-research/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/scholar-research", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "LongTable scholarly evidence recovery, citation-slot research, and legal full-text readiness", "type": "module", diff --git a/packages/longtable-setup/package.json b/packages/longtable-setup/package.json index 2a5241e..2bc3471 100644 --- a/packages/longtable-setup/package.json +++ b/packages/longtable-setup/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/setup", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Researcher onboarding and setup flows for LongTable", "type": "module", @@ -23,8 +23,8 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@longtable/core": "0.1.69", - "@longtable/memory": "0.1.69" + "@longtable/core": "0.1.70", + "@longtable/memory": "0.1.70" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/longtable/README.md b/packages/longtable/README.md index 35ca072..244642e 100644 --- a/packages/longtable/README.md +++ b/packages/longtable/README.md @@ -37,9 +37,9 @@ $longtable-interview ``` `$longtable-interview` asks one relentless sharpening question at a time. It -states the tension, gives the recommended answer, and asks the researcher to -accept, revise, or reject it. It can use Research Specification state when -present, but it does not require one before asking the next pressure question. +uses `Tension:` and `Pressure question:` without option menus or approval +prompts. It can use Research Specification state when present, but it does not +require one before asking the next pressure question. It continues only while the next question can produce a new decision, sharper boundary, stronger evidence standard, or clearer open tension, and stops when diff --git a/packages/longtable/package.json b/packages/longtable/package.json index cb56d6d..b4aa6a3 100644 --- a/packages/longtable/package.json +++ b/packages/longtable/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/cli", - "version": "0.1.69", + "version": "0.1.70", "private": false, "description": "Researcher-facing LongTable CLI", "type": "module", @@ -29,13 +29,13 @@ }, "dependencies": { "@clack/prompts": "^1.2.0", - "@longtable/checkpoints": "0.1.69", - "@longtable/core": "0.1.69", - "@longtable/memory": "0.1.69", - "@longtable/provider-claude": "0.1.69", - "@longtable/provider-codex": "0.1.69", - "@longtable/scholar-research": "0.1.69", - "@longtable/setup": "0.1.69" + "@longtable/checkpoints": "0.1.70", + "@longtable/core": "0.1.70", + "@longtable/memory": "0.1.70", + "@longtable/provider-claude": "0.1.70", + "@longtable/provider-codex": "0.1.70", + "@longtable/scholar-research": "0.1.70", + "@longtable/setup": "0.1.70" }, "devDependencies": { "@types/node": "^22.10.1", diff --git a/scripts/e2e-grilling-interview-flow.mjs b/scripts/e2e-grilling-interview-flow.mjs index efa920e..783f6f8 100644 --- a/scripts/e2e-grilling-interview-flow.mjs +++ b/scripts/e2e-grilling-interview-flow.mjs @@ -28,9 +28,13 @@ const interviewSkill = readFileSync(join(skillsDir, "longtable-interview", "SKIL const routerSkill = readFileSync(join(skillsDir, "longtable", "SKILL.md"), "utf8"); assert(interviewSkill.includes("LongTable grilling interview"), "interview skill should expose the grilling loop"); -assert(interviewSkill.includes("state the tension"), "interview skill should require the tension frame"); -assert(interviewSkill.includes("recommended answer"), "interview skill should require a recommended answer"); -assert(interviewSkill.includes("accept, revise, or reject"), "interview skill should ask for accept/revise/reject"); +assert(interviewSkill.includes("Tension:"), "interview skill should require the tension frame"); +assert(interviewSkill.includes("Pressure question:"), "interview skill should require a pressure-question frame"); +assert(interviewSkill.includes("No option menus"), "interview skill should forbid option menus"); +assert(!interviewSkill.includes("accept, revise, or reject"), "interview skill should not ask for accept/revise/reject choices"); +assert(!interviewSkill.includes("accept/revise/reject"), "interview skill should not ask for accept/revise/reject choices"); +assert(!interviewSkill.includes("Recommended answer"), "interview skill should not use a recommended-answer frame"); +assert(!interviewSkill.includes("recommended answer"), "interview skill should not use a recommended-answer frame"); assert( interviewSkill.includes("remaining questions repeat the same tension without producing a new decision"), "interview skill should preserve the grilling stop rule" @@ -40,7 +44,11 @@ assert(!interviewSkill.includes("ordinary follow-up"), "interview skill should n assert(!interviewSkill.includes("route to `$longtable-start` immediately"), "interview skill should not route itself away"); assert(!interviewSkill.includes("grill-me"), "interview skill should not advertise grill-me requests"); assert(routerSkill.includes("LongTable grilling interview"), "router should describe longtable-interview as grilling"); -assert(routerSkill.includes("recommended answer"), "router should preserve recommended-answer behavior"); +assert(routerSkill.includes("Pressure question:"), "router should preserve pressure-question behavior"); +assert(!routerSkill.includes("accept, revise, or reject"), "router should not advertise accept/revise/reject choices"); +assert(!routerSkill.includes("accept/revise/reject"), "router should not advertise accept/revise/reject choices"); +assert(!routerSkill.includes("Recommended answer"), "router should not advertise a recommended-answer frame"); +assert(!routerSkill.includes("recommended answer"), "router should not advertise a recommended-answer frame"); assert(!routerSkill.includes("$critical-interview"), "router should not advertise critical-interview"); assert(!routerSkill.includes("$grill-me"), "router should not advertise grill-me"); assert(!routerSkill.includes("grill-me"), "router should not route grill-me requests"); @@ -51,7 +59,7 @@ console.log(JSON.stringify({ removedSurface: "critical-interview", observed: { grillingLoop: true, - recommendedAnswer: true, + pressureQuestion: true, oldOrdinaryModeRemoved: true } }, null, 2)); diff --git a/scripts/smoke-setup-flow.mjs b/scripts/smoke-setup-flow.mjs index 5a19a4c..98ff0fb 100644 --- a/scripts/smoke-setup-flow.mjs +++ b/scripts/smoke-setup-flow.mjs @@ -196,11 +196,16 @@ if (interviewSkill.includes("option-first") || interviewSkill.includes("ordinary if (interviewSkill.includes("route to `$longtable-start` immediately")) { throw new Error("longtable-interview skill should no longer route grilling interviews away from itself."); } -if (!interviewSkill.includes("LongTable grilling interview") || !interviewSkill.includes("recommended answer")) { - throw new Error("longtable-interview skill should be a simple grilling loop with recommended answers."); -} -if (!interviewSkill.includes("accept, revise, or reject")) { - throw new Error("longtable-interview skill should ask the researcher to accept, revise, or reject the recommendation."); +if ( + !interviewSkill.includes("LongTable grilling interview") || + !interviewSkill.includes("Tension:") || + !interviewSkill.includes("Pressure question:") || + !interviewSkill.includes("No option menus") +) { + throw new Error("longtable-interview skill should be a simple pressure-question grilling loop."); +} +if (interviewSkill.includes("recommended answer") || interviewSkill.includes("accept, revise, or reject")) { + throw new Error("longtable-interview skill should not use the old recommended-answer approval frame."); } if (!interviewSkill.includes("remaining questions repeat the same tension without producing a new decision")) { throw new Error("longtable-interview skill should preserve the grilling stop rule.");