From 744f175e067ba2e8b71ea7ccaccb786cfd48a47b Mon Sep 17 00:00:00 2001 From: HosungYou <136484001+HosungYou@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:40:11 +0900 Subject: [PATCH] Compact LongTable interview guidance --- README.md | 9 ++- docs/LONGTABLE-COMMAND-SURFACE.md | 4 +- docs/QUESTION-RUNTIME.md | 4 +- docs/release-notes-0.1.71.md | 27 +++++++ package-lock.json | 72 +++++++++---------- 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 | 26 ++++--- .../longtable-provider-codex/package.json | 8 +-- .../longtable-provider-codex/src/skills.ts | 26 ++++--- .../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 | 7 +- scripts/smoke-setup-flow.mjs | 10 ++- 21 files changed, 147 insertions(+), 114 deletions(-) create mode 100644 docs/release-notes-0.1.71.md diff --git a/README.md b/README.md index 3f52bfc..6af800b 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 pressure question at a time, shows the tension, and avoids option - menus or approval prompts. +- It frames each turn as `Tension:` followed by one `Pressure question:` and + waits for a direct answer. - If only a First Research Shape exists, LongTable continues through `$longtable-start` until a Research Specification is created or explicitly kept open. @@ -97,9 +97,8 @@ decisions, open questions, next actions, and confidence. `$longtable-interview` is a relentless sharpening interview for a research plan, 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:` plus `Pressure question:`. It does not ask the -researcher to pick from options. +those can answer the question. Then it names `Tension:` and asks one +`Pressure question:`. 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 00b661b..7b5e49b 100644 --- a/docs/LONGTABLE-COMMAND-SURFACE.md +++ b/docs/LONGTABLE-COMMAND-SURFACE.md @@ -52,8 +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 -- uses a `Tension:` plus `Pressure question:` frame -- avoids option menus, numbered choices, and approval prompts +- frames each turn as `Tension:` followed by `Pressure question:` +- waits for the researcher's direct answer - 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 0bbe089..7e752b7 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 using `Tension:` and -`Pressure question:`, without option menus or approval prompts. +pressure question. It frames each turn as `Tension:` followed by one +`Pressure question:` and waits for a direct answer. 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.71.md b/docs/release-notes-0.1.71.md new file mode 100644 index 0000000..4bd07c3 --- /dev/null +++ b/docs/release-notes-0.1.71.md @@ -0,0 +1,27 @@ +# LongTable 0.1.71 + +LongTable 0.1.71 compresses `$longtable-interview` into a smaller positive +contract. The generated Codex and Claude skills now describe the interview as a +compact pressure loop instead of centering the guidance on what to avoid. + +## Changes + +- Replaces prohibition-first interview wording with a compact loop: + read state, name `Tension:`, ask one `Pressure question:`, then wait. +- Keeps the direct-answer behavior while removing option-menu and approval + wording from the generated interview skill body. +- Updates setup and grilling smoke tests to require the compact contract. +- Updates README and command-surface docs to match the minimized interview + language. + +## Migration + +No command changes. Use `$longtable-interview` as before; the generated skill +now carries fewer instructions and a stronger output shape. + +## Verification + +- `npm run build` +- `npm run smoke:setup` +- `npm run smoke:grilling-interview` +- `npm run release:check` diff --git a/package-lock.json b/package-lock.json index 8b0b727..1862db4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "longtable-monorepo", - "version": "0.1.70", + "version": "0.1.71", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "longtable-monorepo", - "version": "0.1.70", + "version": "0.1.71", "workspaces": [ "packages/*" ], @@ -1259,17 +1259,17 @@ }, "packages/longtable": { "name": "@longtable/cli", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { "@clack/prompts": "^1.2.0", - "@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" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/memory": "0.1.71", + "@longtable/provider-claude": "0.1.71", + "@longtable/provider-codex": "0.1.71", + "@longtable/scholar-research": "0.1.71", + "@longtable/setup": "0.1.71" }, "bin": { "longtable": "bin/longtable" @@ -1284,10 +1284,10 @@ }, "packages/longtable-checkpoints": { "name": "@longtable/checkpoints", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.70" + "@longtable/core": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" @@ -1298,7 +1298,7 @@ }, "packages/longtable-core": { "name": "@longtable/core", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "devDependencies": { "typescript": "^5.6.0" @@ -1309,15 +1309,15 @@ }, "packages/longtable-mcp": { "name": "@longtable/mcp", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@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", + "@longtable/checkpoints": "0.1.71", + "@longtable/cli": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/provider-claude": "0.1.71", + "@longtable/provider-codex": "0.1.71", + "@longtable/setup": "0.1.71", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, @@ -1334,10 +1334,10 @@ }, "packages/longtable-memory": { "name": "@longtable/memory", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.70" + "@longtable/core": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" @@ -1348,12 +1348,12 @@ }, "packages/longtable-provider-claude": { "name": "@longtable/provider-claude", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.70", - "@longtable/core": "0.1.70", - "@longtable/setup": "0.1.70" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/setup": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" @@ -1364,12 +1364,12 @@ }, "packages/longtable-provider-codex": { "name": "@longtable/provider-codex", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.70", - "@longtable/core": "0.1.70", - "@longtable/setup": "0.1.70" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/setup": "0.1.71" }, "devDependencies": { "@types/node": "^22.10.1", @@ -1381,10 +1381,10 @@ }, "packages/longtable-research-search": { "name": "@longtable/research-search", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/scholar-research": "0.1.70" + "@longtable/scholar-research": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" @@ -1395,7 +1395,7 @@ }, "packages/longtable-scholar-research": { "name": "@longtable/scholar-research", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "devDependencies": { "@types/node": "^22.10.1", @@ -1407,11 +1407,11 @@ }, "packages/longtable-setup": { "name": "@longtable/setup", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.70", - "@longtable/memory": "0.1.70" + "@longtable/core": "0.1.71", + "@longtable/memory": "0.1.71" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/package.json b/package.json index 0f01e48..29538a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "longtable-monorepo", - "version": "0.1.70", + "version": "0.1.71", "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 1ac16d0..cd09dd7 100644 --- a/packages/longtable-checkpoints/package.json +++ b/packages/longtable-checkpoints/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/checkpoints", - "version": "0.1.70", + "version": "0.1.71", "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.70" + "@longtable/core": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-core/package.json b/packages/longtable-core/package.json index 4a1d476..b76adfa 100644 --- a/packages/longtable-core/package.json +++ b/packages/longtable-core/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/core", - "version": "0.1.70", + "version": "0.1.71", "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 c4fff55..5749304 100644 --- a/packages/longtable-mcp/package.json +++ b/packages/longtable-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/mcp", - "version": "0.1.70", + "version": "0.1.71", "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.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", + "@longtable/checkpoints": "0.1.71", + "@longtable/cli": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/provider-claude": "0.1.71", + "@longtable/provider-codex": "0.1.71", + "@longtable/setup": "0.1.71", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, diff --git a/packages/longtable-memory/package.json b/packages/longtable-memory/package.json index 2ff8132..116d34d 100644 --- a/packages/longtable-memory/package.json +++ b/packages/longtable-memory/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/memory", - "version": "0.1.70", + "version": "0.1.71", "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.70" + "@longtable/core": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/package.json b/packages/longtable-provider-claude/package.json index 3f682de..7914d78 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.70", + "version": "0.1.71", "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.70", - "@longtable/core": "0.1.70", - "@longtable/setup": "0.1.70" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/setup": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/src/skills.ts b/packages/longtable-provider-claude/src/skills.ts index 8f74162..fce0fc5 100644 --- a/packages/longtable-provider-claude/src/skills.ts +++ b/packages/longtable-provider-claude/src/skills.ts @@ -93,8 +93,8 @@ 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. 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.", + "- For `$longtable-interview`, run the compact pressure loop: read state, name the unresolved `Tension:`, ask exactly one `Pressure question:`, then wait. Continue only while the next question can produce a new decision.", + "- Keep unrelated pending Researcher Checkpoints separate. 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.", "- Stop before acting when the request would change the research question/scope, theory frame, measurement/coding standard, method design, or analysis strategy.", @@ -277,7 +277,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "- First inspect `CURRENT.md` and `.longtable/state.json` when available.", "- If MCP `read_research_specification` is available, use it as context, not as a gate.", "- If the answer can be found in `CURRENT.md`, `.longtable/`, the codebase, supplied documents, or cited evidence, inspect those first instead of asking.", - "- Do not route away to `$longtable-start` merely because a Research Specification is missing.", + "- Research Specification state is optional context; use `$longtable-start` only when the researcher explicitly wants a first research-start interview.", "- If the researcher explicitly wants a first research-start interview, use `$longtable-start`; otherwise keep the grilling interview here.", "", "## When To Use", @@ -289,23 +289,21 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): ClaudeSkill "", "## Grilling Loop", "", - "- Ask one question at a time.", - "- Each question must expose a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", - "- 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.", + "- Ask exactly one question per turn.", + "- Frame each turn as `Tension:` followed by `Pressure question:`.", + "- Target a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", + "- Keep any recommendation to one pressure point after the question.", "- 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.", "", "## Flow", "", "1. Read available project state and identify the highest-leverage unresolved tension.", - "2. Ask exactly one question.", - "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." + "2. Ask exactly one `Pressure question:` under `Tension:`.", + "3. Wait for the researcher's direct answer.", + "4. Use MCP/state after the answer or an explicit record request.", + "5. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", + "6. Record the result as a `DecisionRecord`, Research Specification patch, or explicit open tension; preserve conflicting research commitments in the record." ] }, { diff --git a/packages/longtable-provider-codex/package.json b/packages/longtable-provider-codex/package.json index 75ad2ca..03d062d 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.70", + "version": "0.1.71", "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.70", - "@longtable/core": "0.1.70", - "@longtable/setup": "0.1.70" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/setup": "0.1.71" }, "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 cba5855..e867970 100644 --- a/packages/longtable-provider-codex/src/skills.ts +++ b/packages/longtable-provider-codex/src/skills.ts @@ -126,8 +126,8 @@ 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. 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.", + "- For `$longtable-interview`, run the compact pressure loop: read state, name the unresolved `Tension:`, ask exactly one `Pressure question:`, then wait. Continue only while the next question can produce a new decision.", + "- Keep unrelated pending Researcher Checkpoints separate. 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.", "- If `CURRENT.md` shows a pending required checkpoint, ask the researcher for a selection and wait. Do not choose or record `longtable decide --question --answer ` unless the researcher explicitly provides that value.", @@ -314,7 +314,7 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "- First inspect `CURRENT.md` and `.longtable/state.json` when available.", "- If MCP `read_research_specification` is available, use it as context, not as a gate.", "- If the answer can be found in `CURRENT.md`, `.longtable/`, the codebase, supplied documents, or cited evidence, inspect those first instead of asking.", - "- Do not route away to `$longtable-start` merely because a Research Specification is missing.", + "- Research Specification state is optional context; use `$longtable-start` only when the researcher explicitly wants a first research-start interview.", "- If the researcher explicitly wants a first research-start interview, use `$longtable-start`; otherwise keep the grilling interview here.", "", "## When To Use", @@ -326,23 +326,21 @@ function baseSkillSpecs(surface: LongTableSkillSurface = "compact"): CodexSkillS "", "## Grilling Loop", "", - "- Ask one question at a time.", - "- Each question must expose a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", - "- 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.", + "- Ask exactly one question per turn.", + "- Frame each turn as `Tension:` followed by `Pressure question:`.", + "- Target a decision, hidden assumption, weak boundary, unsupported claim, or evidence gap.", + "- Keep any recommendation to one pressure point after the question.", "- 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.", "", "## Core Flow", "", "1. Read available project state and identify the highest-leverage unresolved tension.", - "2. Ask exactly one question.", - "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.", + "2. Ask exactly one `Pressure question:` under `Tension:`.", + "3. Wait for the researcher's direct answer.", + "4. Use MCP/state after the answer or an explicit record request.", + "5. If the answer changes the specification, propose or apply a Research Specification patch through MCP/state when available.", + "6. Record the result as a `DecisionRecord`, Research Specification patch, or explicit open tension; preserve conflicting research commitments in the record.", "", "## Fallback", "", diff --git a/packages/longtable-research-search/package.json b/packages/longtable-research-search/package.json index cb62928..3968115 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.70", + "version": "0.1.71", "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.70" + "@longtable/scholar-research": "0.1.71" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-scholar-research/package.json b/packages/longtable-scholar-research/package.json index 7caeb71..8dec1ce 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.70", + "version": "0.1.71", "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 2bc3471..74657ce 100644 --- a/packages/longtable-setup/package.json +++ b/packages/longtable-setup/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/setup", - "version": "0.1.70", + "version": "0.1.71", "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.70", - "@longtable/memory": "0.1.70" + "@longtable/core": "0.1.71", + "@longtable/memory": "0.1.71" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/longtable/README.md b/packages/longtable/README.md index 244642e..d375021 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 -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. +frames each turn as `Tension:` followed by one `Pressure question:` and waits +for a direct answer. 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 b4aa6a3..1c4792b 100644 --- a/packages/longtable/package.json +++ b/packages/longtable/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/cli", - "version": "0.1.70", + "version": "0.1.71", "private": false, "description": "Researcher-facing LongTable CLI", "type": "module", @@ -29,13 +29,13 @@ }, "dependencies": { "@clack/prompts": "^1.2.0", - "@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" + "@longtable/checkpoints": "0.1.71", + "@longtable/core": "0.1.71", + "@longtable/memory": "0.1.71", + "@longtable/provider-claude": "0.1.71", + "@longtable/provider-codex": "0.1.71", + "@longtable/scholar-research": "0.1.71", + "@longtable/setup": "0.1.71" }, "devDependencies": { "@types/node": "^22.10.1", diff --git a/scripts/e2e-grilling-interview-flow.mjs b/scripts/e2e-grilling-interview-flow.mjs index 783f6f8..e23f862 100644 --- a/scripts/e2e-grilling-interview-flow.mjs +++ b/scripts/e2e-grilling-interview-flow.mjs @@ -30,7 +30,10 @@ 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("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("Ask exactly one question per turn"), "interview skill should stay compact"); +assert(interviewSkill.includes("Wait for the researcher's direct answer"), "interview skill should require a direct-answer loop"); +assert(!interviewSkill.includes("No option menus"), "interview skill should avoid prohibition-first wording"); +assert(!interviewSkill.includes("approval prompts"), "interview skill should avoid prohibition-first wording"); 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"); @@ -45,6 +48,8 @@ assert(!interviewSkill.includes("route to `$longtable-start` immediately"), "int 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("Pressure question:"), "router should preserve pressure-question behavior"); +assert(routerSkill.includes("compact pressure loop"), "router should advertise the compact pressure loop"); +assert(!routerSkill.includes("approval prompts"), "router should avoid prohibition-first wording"); 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"); diff --git a/scripts/smoke-setup-flow.mjs b/scripts/smoke-setup-flow.mjs index 98ff0fb..6c3ca3f 100644 --- a/scripts/smoke-setup-flow.mjs +++ b/scripts/smoke-setup-flow.mjs @@ -200,11 +200,17 @@ if ( !interviewSkill.includes("LongTable grilling interview") || !interviewSkill.includes("Tension:") || !interviewSkill.includes("Pressure question:") || - !interviewSkill.includes("No option menus") + !interviewSkill.includes("Ask exactly one question per turn") || + !interviewSkill.includes("Wait for the researcher's direct answer") ) { 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")) { +if ( + interviewSkill.includes("recommended answer") || + interviewSkill.includes("accept, revise, or reject") || + interviewSkill.includes("No option menus") || + interviewSkill.includes("approval prompts") +) { 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")) {