diff --git a/README.md b/README.md index 6af800b..65093af 100644 --- a/README.md +++ b/README.md @@ -180,31 +180,33 @@ Team-style requests route through panel. Explicit debate-language requests write panel debate records under `.longtable/panel/`. LongTable team execution is disabled for new work, and `.longtable/team/` is historical state only. -## Journal Editor and Venue Fit +## Journal-Grounded Reviewer and Venue Fit -`longtable-editor` is intentionally a thin role adapter. It foregrounds the -Journal Editor perspective and must disclose `LongTable consulted: Journal -Editor`, but it is not allowed to invent knowledge about a named target journal. +`longtable-reviewer` is the compact surface for peer-review and editor-style +feedback. It keeps reviewer objections, Journal Editor fit judgment, Venue +Strategist tradeoffs, and scholar-research evidence in one evidence-backed +workflow instead of splitting journal feedback into a separate visible skill. -If a target journal is named, LongTable should not claim journal fit from role -intuition alone. A fit judgment needs a journal profile: aims/scope, author -guidance, recent article patterns, and article type expectations. Without that -profile, the editor judgment should either ask whether to run scholarly/venue -search or label fit as provisional. +If a target journal is named, LongTable should ground reviewer feedback in a +Journal Profile: aims/scope, author guidance, recent article patterns, and +article type expectations. If reference papers are available or recoverable, +LongTable should build a Reference Pattern Matrix covering decision structure, +paper flow, standardized terminology, Figure/Table conventions, and APA 7 +style expectations. Useful command surfaces: ```bash -longtable review --role editor --prompt "Evaluate this manuscript positioning." -longtable panel --role editor,reviewer --prompt "Compare journal fit and reviewer risk." +longtable review --role reviewer --prompt "Evaluate this manuscript positioning for the target journal." +longtable panel --role reviewer,measurement_auditor --prompt "Compare journal fit, reviewer risk, and measurement evidence." longtable search --intent venue --query "" longtable scholar-research scaffold --cwd "" --json ``` Treat journal fit as a risk rubric, not an acceptance prediction. A useful -editor pass separates scope fit, contribution fit, method/evidence norm fit, -editorial salience, and citation/evidence risk, and marks unsupported claims as -provisional. +reviewer pass separates editor-facing contribution claim, reviewer objection, +venue-strategy tradeoff, evidence gap, revision action, and any Researcher +Checkpoint needed before changing venue positioning. ## Researcher Checkpoints diff --git a/docs/LONGTABLE-COMMAND-SURFACE.md b/docs/LONGTABLE-COMMAND-SURFACE.md index 7b5e49b..231beba 100644 --- a/docs/LONGTABLE-COMMAND-SURFACE.md +++ b/docs/LONGTABLE-COMMAND-SURFACE.md @@ -124,6 +124,21 @@ to panel debate records under `.longtable/panel/`. `longtable team` is not a public command surface. Historical `.longtable/team/` records remain readable only as older workspace state. +### `longtable review --role reviewer` + +Journal-grounded review: + +- keeps peer-review objections, Journal Editor fit judgment, Venue Strategist + tradeoffs, and scholar-research evidence under the reviewer surface +- uses `Journal Profile` before target-journal fit claims +- uses `Reference Pattern Matrix` when reference papers are available or + recoverable +- compares decision structure, paper flow, standardized terminology, + Figure/Table conventions, and APA 7 style expectations +- returns editor-facing contribution claim, reviewer objection, + venue-strategy tradeoff, evidence gap, revision action, and any needed + Researcher Checkpoint + ### `longtable handoff` Continuation work packet: diff --git a/docs/release-notes-0.1.72.md b/docs/release-notes-0.1.72.md new file mode 100644 index 0000000..3900e34 --- /dev/null +++ b/docs/release-notes-0.1.72.md @@ -0,0 +1,32 @@ +# LongTable 0.1.72 + +LongTable 0.1.72 makes `longtable-reviewer` the compact evidence-backed +journal review surface. The reviewer role now carries peer-review objections, +Journal Editor fit judgment, Venue Strategist tradeoffs, and scholar-research +evidence workflow without adding a separate visible editor skill to the compact +surface. + +## Changes + +- Expands the Reviewer role to cover journal-grounded fit risks and missing + evidence, not only peer-review objections. +- Adds a Journal-grounded reviewer workflow to generated Codex and Claude + `longtable-reviewer` skills. +- Adds the same workflow to `longtable review --role reviewer --print` and the + legacy `longtable-reviewer` prompt alias. +- Requires reviewer feedback to use a `Journal Profile` and, when reference + papers are available or recoverable, a `Reference Pattern Matrix`. +- Documents checks for decision structure, paper flow, standardized + terminology, Figure/Table conventions, and APA 7 style expectations. + +## Migration + +Use `longtable-reviewer` or `longtable review --role reviewer` for journal-fit, +editor-style, and peer-review feedback. `--role editor` remains available as an +explicit role lens, but the compact reviewer surface now owns the evidence-backed +journal review workflow. + +## Verification + +- `npm run smoke:role-audit` +- `npm run release:check` diff --git a/package-lock.json b/package-lock.json index 1862db4..2918447 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "longtable-monorepo", - "version": "0.1.71", + "version": "0.1.72", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "longtable-monorepo", - "version": "0.1.71", + "version": "0.1.72", "workspaces": [ "packages/*" ], @@ -1259,17 +1259,17 @@ }, "packages/longtable": { "name": "@longtable/cli", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { "@clack/prompts": "^1.2.0", - "@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" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/memory": "0.1.72", + "@longtable/provider-claude": "0.1.72", + "@longtable/provider-codex": "0.1.72", + "@longtable/scholar-research": "0.1.72", + "@longtable/setup": "0.1.72" }, "bin": { "longtable": "bin/longtable" @@ -1284,10 +1284,10 @@ }, "packages/longtable-checkpoints": { "name": "@longtable/checkpoints", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.71" + "@longtable/core": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" @@ -1298,7 +1298,7 @@ }, "packages/longtable-core": { "name": "@longtable/core", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "devDependencies": { "typescript": "^5.6.0" @@ -1309,15 +1309,15 @@ }, "packages/longtable-mcp": { "name": "@longtable/mcp", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@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", + "@longtable/checkpoints": "0.1.72", + "@longtable/cli": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/provider-claude": "0.1.72", + "@longtable/provider-codex": "0.1.72", + "@longtable/setup": "0.1.72", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, @@ -1334,10 +1334,10 @@ }, "packages/longtable-memory": { "name": "@longtable/memory", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.71" + "@longtable/core": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" @@ -1348,12 +1348,12 @@ }, "packages/longtable-provider-claude": { "name": "@longtable/provider-claude", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.71", - "@longtable/core": "0.1.71", - "@longtable/setup": "0.1.71" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/setup": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" @@ -1364,12 +1364,12 @@ }, "packages/longtable-provider-codex": { "name": "@longtable/provider-codex", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/checkpoints": "0.1.71", - "@longtable/core": "0.1.71", - "@longtable/setup": "0.1.71" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/setup": "0.1.72" }, "devDependencies": { "@types/node": "^22.10.1", @@ -1381,10 +1381,10 @@ }, "packages/longtable-research-search": { "name": "@longtable/research-search", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/scholar-research": "0.1.71" + "@longtable/scholar-research": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" @@ -1395,7 +1395,7 @@ }, "packages/longtable-scholar-research": { "name": "@longtable/scholar-research", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "devDependencies": { "@types/node": "^22.10.1", @@ -1407,11 +1407,11 @@ }, "packages/longtable-setup": { "name": "@longtable/setup", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "dependencies": { - "@longtable/core": "0.1.71", - "@longtable/memory": "0.1.71" + "@longtable/core": "0.1.72", + "@longtable/memory": "0.1.72" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/package.json b/package.json index 29538a6..fdb27e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "longtable-monorepo", - "version": "0.1.71", + "version": "0.1.72", "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 cd09dd7..a424552 100644 --- a/packages/longtable-checkpoints/package.json +++ b/packages/longtable-checkpoints/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/checkpoints", - "version": "0.1.71", + "version": "0.1.72", "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.71" + "@longtable/core": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-core/package.json b/packages/longtable-core/package.json index b76adfa..71119c0 100644 --- a/packages/longtable-core/package.json +++ b/packages/longtable-core/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/core", - "version": "0.1.71", + "version": "0.1.72", "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 5749304..174d75b 100644 --- a/packages/longtable-mcp/package.json +++ b/packages/longtable-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/mcp", - "version": "0.1.71", + "version": "0.1.72", "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.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", + "@longtable/checkpoints": "0.1.72", + "@longtable/cli": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/provider-claude": "0.1.72", + "@longtable/provider-codex": "0.1.72", + "@longtable/setup": "0.1.72", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" }, diff --git a/packages/longtable-memory/package.json b/packages/longtable-memory/package.json index 116d34d..6543a25 100644 --- a/packages/longtable-memory/package.json +++ b/packages/longtable-memory/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/memory", - "version": "0.1.71", + "version": "0.1.72", "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.71" + "@longtable/core": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/package.json b/packages/longtable-provider-claude/package.json index 7914d78..ef9178a 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.71", + "version": "0.1.72", "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.71", - "@longtable/core": "0.1.71", - "@longtable/setup": "0.1.71" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/setup": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-provider-claude/src/skills.ts b/packages/longtable-provider-claude/src/skills.ts index fce0fc5..0e21877 100644 --- a/packages/longtable-provider-claude/src/skills.ts +++ b/packages/longtable-provider-claude/src/skills.ts @@ -399,7 +399,8 @@ function mustAskQuestionsForRole(role: RoleDefinition): string[] { "What is the strongest venue-facing contribution claim, and what would make it overreach?" ], reviewer: [ - "What objection would a skeptical reviewer raise first, and what missing evidence would answer it?" + "What objection would a skeptical reviewer raise first, and what missing evidence would answer it?", + "Which journal or venue expectation is the draft trying to satisfy, and what reference-paper pattern proves that expectation?" ], theory_critic: [ "Which construct boundary or theoretical assumption must stay explicit before the claim is revised?" @@ -431,6 +432,16 @@ function roleSkillSpec(role: RoleDefinition, surface: LongTableSkillSurface = "c "- Require a journal profile before fit judgment: aims/scope, author guidance, recent article pattern, and article type expectations.", "- If the journal profile is missing, ask whether to run scholarly/venue search or label the fit as provisional." ] + : role.key === "reviewer" + ? [ + "## Journal-grounded reviewer workflow", + "", + "- Keep `longtable-reviewer` as the visible compact surface; use Journal Editor and Venue Strategist as internal lenses.", + "- When a target journal, submission venue, reference paper set, or journal-ready claim is named, ground feedback in a `Journal Profile`: aims/scope, author guidance, recent article pattern, and article type expectations.", + "- Use `scholar-research` or `longtable search --intent venue` to build or refresh a `Reference Pattern Matrix` before making source-backed journal-fit claims.", + "- Read available reference papers and compare decision structure, paper flow, standardized terminology, Figure/Table conventions, and APA 7 style expectations.", + "- Return reviewer feedback as: editor-facing contribution claim, reviewer objection, Venue Strategist tradeoff, evidence gap, revision action, and Researcher Checkpoint when the recommendation changes venue positioning." + ] : []; return { name: skillNameForRole(role, surface), diff --git a/packages/longtable-provider-codex/package.json b/packages/longtable-provider-codex/package.json index 03d062d..f98f930 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.71", + "version": "0.1.72", "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.71", - "@longtable/core": "0.1.71", - "@longtable/setup": "0.1.71" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/setup": "0.1.72" }, "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 e867970..634dc1a 100644 --- a/packages/longtable-provider-codex/src/skills.ts +++ b/packages/longtable-provider-codex/src/skills.ts @@ -437,7 +437,8 @@ function mustAskQuestionsForRole(role: RoleDefinition): string[] { "What is the strongest venue-facing contribution claim, and what would make it overreach?" ], reviewer: [ - "What objection would a skeptical reviewer raise first, and what missing evidence would answer it?" + "What objection would a skeptical reviewer raise first, and what missing evidence would answer it?", + "Which journal or venue expectation is the draft trying to satisfy, and what reference-paper pattern proves that expectation?" ], theory_critic: [ "Which construct boundary or theoretical assumption must stay explicit before the claim is revised?" @@ -469,6 +470,16 @@ function roleSkillSpec(role: RoleDefinition, surface: LongTableSkillSurface = "c "- Require a journal profile before fit judgment: aims/scope, author guidance, recent article pattern, and article type expectations.", "- If the journal profile is missing, ask whether to run scholarly/venue search or label the fit as provisional." ] + : role.key === "reviewer" + ? [ + "## Journal-grounded reviewer workflow", + "", + "- Keep `longtable-reviewer` as the visible compact surface; use Journal Editor and Venue Strategist as internal lenses.", + "- When a target journal, submission venue, reference paper set, or journal-ready claim is named, ground feedback in a `Journal Profile`: aims/scope, author guidance, recent article pattern, and article type expectations.", + "- Use `scholar-research` or `longtable search --intent venue` to build or refresh a `Reference Pattern Matrix` before making source-backed journal-fit claims.", + "- Read available reference papers and compare decision structure, paper flow, standardized terminology, Figure/Table conventions, and APA 7 style expectations.", + "- Return reviewer feedback as: editor-facing contribution claim, reviewer objection, Venue Strategist tradeoff, evidence gap, revision action, and Researcher Checkpoint when the recommendation changes venue positioning." + ] : []; return { name: skillNameForRole(role, surface), diff --git a/packages/longtable-research-search/package.json b/packages/longtable-research-search/package.json index 3968115..298f260 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.71", + "version": "0.1.72", "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.71" + "@longtable/scholar-research": "0.1.72" }, "devDependencies": { "typescript": "^5.6.0" diff --git a/packages/longtable-scholar-research/package.json b/packages/longtable-scholar-research/package.json index 8dec1ce..0bd1182 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.71", + "version": "0.1.72", "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 74657ce..c1d1007 100644 --- a/packages/longtable-setup/package.json +++ b/packages/longtable-setup/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/setup", - "version": "0.1.71", + "version": "0.1.72", "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.71", - "@longtable/memory": "0.1.71" + "@longtable/core": "0.1.72", + "@longtable/memory": "0.1.72" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/longtable/README.md b/packages/longtable/README.md index d375021..0cb1c95 100644 --- a/packages/longtable/README.md +++ b/packages/longtable/README.md @@ -109,18 +109,22 @@ Team-style requests route through panel. Explicit debate-language requests write panel debate records under `.longtable/panel/`; LongTable team execution is disabled for new work. -## Journal Editor Fit Boundary +## Journal-Grounded Reviewer -`longtable-editor` and `--role editor` foreground the Journal Editor role; they -do not invent target-journal knowledge. If a target journal is named, journal -fit claims require a journal profile: aims/scope, author guidance, recent -article patterns, and article type expectations. Without that profile, -LongTable should ask whether to run scholarly/venue search or mark fit as -provisional. +`longtable-reviewer` and `--role reviewer` are the compact surface for +peer-review, editor-style, and venue-fit feedback. The reviewer role combines +Journal Editor and Venue Strategist lenses with scholar-research evidence +instead of requiring a separate visible editor skill. + +If a target journal is named, journal-fit claims require a Journal Profile: +aims/scope, author guidance, recent article patterns, and article type +expectations. Reference papers should be compared through a Reference Pattern +Matrix covering decision structure, paper flow, standardized terminology, +Figure/Table conventions, and APA 7 style expectations. ```bash -longtable review --role editor --prompt "Evaluate this manuscript positioning." -longtable panel --role editor,reviewer --prompt "Compare journal fit and reviewer risk." +longtable review --role reviewer --prompt "Evaluate this manuscript positioning." +longtable panel --role reviewer,measurement_auditor --prompt "Compare journal fit and reviewer risk." longtable search --intent venue --query "" ``` diff --git a/packages/longtable/package.json b/packages/longtable/package.json index 1c4792b..e01d9c4 100644 --- a/packages/longtable/package.json +++ b/packages/longtable/package.json @@ -1,6 +1,6 @@ { "name": "@longtable/cli", - "version": "0.1.71", + "version": "0.1.72", "private": false, "description": "Researcher-facing LongTable CLI", "type": "module", @@ -29,13 +29,13 @@ }, "dependencies": { "@clack/prompts": "^1.2.0", - "@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" + "@longtable/checkpoints": "0.1.72", + "@longtable/core": "0.1.72", + "@longtable/memory": "0.1.72", + "@longtable/provider-claude": "0.1.72", + "@longtable/provider-codex": "0.1.72", + "@longtable/scholar-research": "0.1.72", + "@longtable/setup": "0.1.72" }, "devDependencies": { "@types/node": "^22.10.1", diff --git a/packages/longtable/src/persona-router.ts b/packages/longtable/src/persona-router.ts index 1ee48cb..02c9c75 100644 --- a/packages/longtable/src/persona-router.ts +++ b/packages/longtable/src/persona-router.ts @@ -189,6 +189,16 @@ export function renderRoleGuidance(roles: readonly CanonicalPersona[]): string | "Role guidance:", ...roles.map((role) => { const definition = getPersonaDefinition(role); + if (role === "reviewer") { + return [ + `- ${definition.label}: ${definition.shortDescription}`, + " Journal-grounded reviewer workflow:", + " - Build or request a Journal Profile before target-journal fit claims.", + " - Use scholar-research or venue search to form a Reference Pattern Matrix.", + " - Compare reference papers for decision structure, paper flow, standardized terminology, Figure/Table conventions, and APA 7 style.", + " - Include the Venue Strategist tradeoff in the reviewer feedback." + ].join("\n"); + } return `- ${definition.label}: ${definition.shortDescription}`; }) ].join("\n"); diff --git a/packages/longtable/src/personas.ts b/packages/longtable/src/personas.ts index 37b5ad9..7b72dfe 100644 --- a/packages/longtable/src/personas.ts +++ b/packages/longtable/src/personas.ts @@ -38,9 +38,9 @@ export const PERSONA_DEFINITIONS: readonly PersonaDefinition[] = [ { key: "reviewer", label: "Reviewer", - shortDescription: "Surfaces likely peer-review objections and requests for clarification.", + shortDescription: "Surfaces peer-review objections, journal-grounded fit risks, and missing evidence.", triggerMode: "auto-callable", - synonyms: ["reviewer", "peer reviewer", "심사자", "리뷰어", "심사위원"], + synonyms: ["reviewer", "peer reviewer", "journal reviewer", "editorial reviewer", "심사자", "리뷰어", "심사위원"], defaultPanelMember: true, checkpointSensitivity: "medium", supportedModes: ["review", "critique", "draft", "commit", "submit"] diff --git a/packages/longtable/src/prompt-aliases.ts b/packages/longtable/src/prompt-aliases.ts index 1738161..4170b30 100644 --- a/packages/longtable/src/prompt-aliases.ts +++ b/packages/longtable/src/prompt-aliases.ts @@ -104,11 +104,16 @@ function promptSpec() { }, { name: "longtable-reviewer", - description: "LongTable reviewer view", - argumentHint: "", + description: "LongTable reviewer view for peer-review and journal-grounded fit risks", + argumentHint: "", body: [ "You are LongTable with the Reviewer role foregrounded.", - "Prioritize likely objections, missing evidence, weak claims, and points needing clarification.", + "Prioritize likely objections, missing evidence, weak claims, journal-grounded fit risks, and points needing clarification.", + "Journal-grounded reviewer workflow:", + "- Build or request a Journal Profile before target-journal fit claims.", + "- Use scholar-research or venue search to form a Reference Pattern Matrix.", + "- Compare reference papers for decision structure, paper flow, standardized terminology, Figure/Table conventions, and APA 7 style.", + "- Include the Venue Strategist tradeoff in the reviewer feedback.", "Disclose that the reviewer role was consulted.", "Treat any slash-command arguments as the review object." ] diff --git a/scripts/smoke-role-audit.mjs b/scripts/smoke-role-audit.mjs index 0c1954e..ee5df75 100644 --- a/scripts/smoke-role-audit.mjs +++ b/scripts/smoke-role-audit.mjs @@ -1,5 +1,5 @@ import { execFileSync } from "node:child_process"; -import { mkdtempSync } from "node:fs"; +import { mkdtempSync, readFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { resolve, join } from "node:path"; @@ -29,6 +29,12 @@ for (const role of audit.roles) { } const tmp = mkdtempSync(join(tmpdir(), "longtable-role-audit-")); +const promptsDir = join(tmp, "prompts"); +execFileSync("node", [cli, "codex", "install-prompts", "--dir", promptsDir], { + cwd: tmp, + encoding: "utf8" +}); +const reviewerPromptAlias = readFileSync(join(promptsDir, "longtable-reviewer.md"), "utf8"); const editorPrompt = execFileSync("node", [ cli, "review", @@ -50,13 +56,51 @@ assert( "editor role guidance should include the persona judgment criteria" ); +const reviewerPrompt = execFileSync("node", [ + cli, + "review", + "--cwd", + tmp, + "--role", + "reviewer", + "--prompt", + "Evaluate this manuscript positioning for Journal of Management using reference papers.", + "--print" +], { + cwd: tmp, + encoding: "utf8" +}); + const roles = personas.listRoleDefinitions(); +const codexCompactNames = codex.buildCodexSkillSpecs(roles, "compact").map((skill) => skill.name); +const claudeCompactNames = claude.buildClaudeSkillSpecs(roles, "compact").map((skill) => skill.name); const codexEditor = codex.buildCodexSkillSpecs(roles, "full").find((skill) => skill.name === "longtable-editor"); const claudeEditor = claude.buildClaudeSkillSpecs(roles, "full").find((skill) => skill.name === "longtable-editor"); +const codexReviewer = codex.buildCodexSkillSpecs(roles, "compact").find((skill) => skill.name === "longtable-reviewer"); +const claudeReviewer = claude.buildClaudeSkillSpecs(roles, "compact").find((skill) => skill.name === "longtable-reviewer"); const journalFitBoundary = "If a target journal is named, do not claim journal fit from role intuition alone."; +const journalGroundedReviewerMarkers = [ + "Journal-grounded reviewer workflow", + "Journal Profile", + "Reference Pattern Matrix", + "decision structure", + "standardized terminology", + "Figure/Table", + "APA 7", + "Venue Strategist", + "scholar-research" +]; assert(codexEditor?.body.join("\n").includes(journalFitBoundary), "Codex editor skill should require journal evidence before fit claims"); assert(claudeEditor?.body.join("\n").includes(journalFitBoundary), "Claude editor skill should require journal evidence before fit claims"); +assert(!codexCompactNames.includes("longtable-editor"), "Codex compact surface should not split editor into a separate visible skill"); +assert(!claudeCompactNames.includes("longtable-editor"), "Claude compact surface should not split editor into a separate visible skill"); +for (const marker of journalGroundedReviewerMarkers) { + assert(codexReviewer?.body.join("\n").includes(marker), `Codex reviewer skill should include ${marker}`); + assert(claudeReviewer?.body.join("\n").includes(marker), `Claude reviewer skill should include ${marker}`); + assert(reviewerPrompt.includes(marker), `reviewer prompt should include ${marker}`); + assert(reviewerPromptAlias.includes(marker), `reviewer prompt alias should include ${marker}`); +} console.log("role audit smoke passed");