* feat(3081): auto-trim review prompts for small-context model reviewers Adds review.max_prompt_tokens and review.max_prompt_tokens_per_reviewer config keys. When configured, the /gsd-review workflow deterministically trims the assembled prompt before sending to each reviewer (drop CONTEXT → RESEARCH → REQUIREMENTS; head-shrink PROJECT.md; tail-truncate PLANs proportionally; reserve disclosure-note tokens upfront). Trim metadata is recorded in REVIEWS.md frontmatter. Reviewer is skipped with a warning if even the minimum review set exceeds the budget. Closes #3081 * fix(3081): register prompt-budget in SDK query registry and update inventory manifest review.md references `gsd-sdk query prompt-budget` at three call sites, but the command had no handler in the SDK registry — failing the registry-integration drift-guard test on all 6 CI matrix legs. Added a native TypeScript SDK handler (sdk/src/query/prompt-budget.ts) that ports the applyBudget logic from the CJS module, registered it in DOMAIN_STATIC_CATALOG, and regenerated docs/INVENTORY-MANIFEST.json to include the new cli_modules/prompt-budget.cjs entry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(3081): bump ws to 8.20.1 and allowlist prompt-budget sibling pair Two additional CI failures after the registry fix: 1. ws moderate CVE (GHSA-58qx-3vcg-4xpx, uninitialized memory disclosure): The advisory covers ws >=8.0.0 <8.20.1. Both root and sdk/package.json pinned ^8.20.0 which resolved to 8.20.0. Bumped both to 8.20.1 to clear the npm audit drift-guard test (bug-3588-npm-audit-clean.test.cjs). 2. lint-shared-module-handsync detected the new prompt-budget.ts / prompt-budget.cjs sibling pair without an allowlist entry. Added a cooperatingSiblings entry to scripts/shared-module-handsync-allowlist.json with classification and justification matching the established pattern. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(3081): align prompt-budget skip semantics across CJS and SDK dispatch paths Replace brittle `[ $EXIT -eq 2 ]` guards with `[ $EXIT -ne 0 ]` in all three local-reviewer blocks (Ollama, LM Studio, llama.cpp) in workflows/review.md. Any non-zero exit from prompt-budget now triggers a skip with a descriptive warning — exit 2/11 prints "budget too small", any other non-zero prints "unexpected exit code". This ensures the SDK bridge dispatch path (exit 11 via GSDError(Blocked)) triggers the same skip as the CJS path (exit 2). The SDK handler (sdk/src/query/prompt-budget.ts) already writes both metadata and prompt files before throwing, so no change needed there. The Ollama block also gains the missing OLLAMA_SKIP guard so the reviewer invocation is actually skipped (previously the block only suppressed the OLLAMA_PROMPT_FILE update but still ran the curl invocation). SDK integration path (hardFailed via GSDError(Blocked) → exit 11) is covered by handler unit tests in tests/prompt-budget.test.cjs; no gsd-sdk-*.test.cjs exercising the full bridge dispatch for this command exists yet — that gap remains and is documented here. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix prompt-budget trim ordering and review guard follow-ups * perf: optimize prompt-budget and dedup reviewer trim workflow * fix(3708): drop source-grep theater tests to satisfy lint-no-source-grep All four test files added in commit 2df566ed were pure source-grep theater: they read .cjs / .ts / .md source files and asserted that specific string literals were present or absent. None exercised runtime behaviour. Deleted: - tests/gsd-tools-memory-optimizer.test.cjs — 7 includes() on gsd-tools.cjs - tests/prompt-budget-hotpath-optimizer.test.cjs — includes() on prompt-budget.cjs + .ts - tests/prompt-budget-io-optimizer.test.cjs — includes() on prompt-budget.ts + gsd-tools.cjs - tests/review-workflow-budget-dedup.test.cjs — includes() on review.md Behavioural coverage for the prompt-budget feature already exists in tests/prompt-budget.test.cjs and tests/prompt-budget-cli.test.cjs (also added by this PR). No replacement tests needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(3708): correct budget-pressure threshold and minSet accounting Two bugs in applyBudget caused premature trimming and false hard-fails: 1. UNNEEDED_TRIM: budgetUnderPressure compared baseTokens against effectiveBudget - NOTE_RESERVE_TOKENS, triggering trim pressure 80 tokens before the budget was actually exceeded. Fix: compare against effectiveBudget directly; NOTE_RESERVE_TOKENS are still reserved in contentBudget once real pressure is confirmed. 2. FALSE_HARDFAIL: minSet included NOTE_RESERVE_TOKENS unconditionally, treating the note as mandatory even when no trim would occur and no note would be injected. Fix: exclude NOTE_RESERVE_TOKENS from minSet; a prompt that fits untrimmed needs no note and must not hard-fail. Both fixes applied in CJS and TypeScript implementations. Two regression tests added (cycles 11 and 12) that reproduce each case behaviorally. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
146 lines
10 KiB
JSON
146 lines
10 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"_comment": "Allowlist for scripts/lint-shared-module-handsync.cjs — Phase 6 of #3524 (#3575). Two categories: cooperatingSiblings (legitimate pairs, lint accepts silently) and migrateMeBacklog (known drift anti-patterns, lint warns but does not fail). All entries require cjs + ts path + classification + justification.",
|
|
"cooperatingSiblings": [
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/active-workstream-store.cjs",
|
|
"ts": "sdk/src/query/active-workstream-store.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS manages filesystem-backed workstream store; SDK layer wraps via Adapter for query dispatch. Different responsibilities, not drift."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/config-schema.cjs",
|
|
"ts": "sdk/src/query/config-schema.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "SDK config-schema.ts is the generated source-of-truth derived from sdk/shared/config-schema.manifest.json (Phase 2/#3540). CJS config-schema.cjs is the Adapter that reads from that manifest. Not a hand-sync pair; freshness check enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/frontmatter.cjs",
|
|
"ts": "sdk/src/query/frontmatter.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS implements full frontmatter parsing/mutation; SDK frontmatter.ts is the native SDK query handler delegating to the CJS runtime via the seam bridge. Not duplicating logic."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/init.cjs",
|
|
"ts": "sdk/src/query/init.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS init.cjs is the authoritative initializer; SDK init.ts provides the native handler layer for the SDK query seam. Phase 5.2+ will migrate remaining subcommands, but current architecture is intentional."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/phase.cjs",
|
|
"ts": "sdk/src/query/phase.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS phase.cjs is the full phase lifecycle implementation; SDK phase.ts provides the native query handler. The SDK delegates to CJS for most subcommands. Phase 5.2+ candidate for further migration."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/profile-output.cjs",
|
|
"ts": "sdk/src/query/profile-output.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS profile-output.cjs handles profiling output rendering; SDK profile-output.ts is the corresponding SDK query handler. Separate responsibilities across the seam."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/roadmap.cjs",
|
|
"ts": "sdk/src/query/roadmap.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS roadmap.cjs is the full roadmap implementation; SDK roadmap.ts provides the native handler for SDK query dispatch. Phase 5.2+ candidate."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/state.cjs",
|
|
"ts": "sdk/src/query/state.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS state.cjs is the full state implementation; SDK state.ts routes known subcommands via executeForCjs (Phase 5.0/#3558, Phase 5.1/#3574). Intentional seam delegation pattern."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/state-document.cjs",
|
|
"ts": "sdk/src/query/state-document.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS state-document.cjs is the generated Adapter reading from sdk/src/state-document/ Shared Module (Phase 1/#3531). SDK state-document.ts is the corresponding source-of-truth query handler. Freshness check enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/template.cjs",
|
|
"ts": "sdk/src/query/template.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS template.cjs handles template operations; SDK template.ts is the corresponding SDK native handler. Separate responsibilities across the seam."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/uat.cjs",
|
|
"ts": "sdk/src/query/uat.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS uat.cjs implements UAT workflows; SDK uat.ts provides the SDK query handler layer. Separate responsibilities."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/verify.cjs",
|
|
"ts": "sdk/src/query/verify.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS verify.cjs is the full verify implementation; SDK verify.ts provides the native handler. Phase 5.2+ candidate for further delegation."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/workstream.cjs",
|
|
"ts": "sdk/src/query/workstream.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS workstream.cjs handles workstream management; SDK workstream.ts provides the SDK query handler. Workstream support inside sync bridge is an open follow-up item."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/workstream-inventory.cjs",
|
|
"ts": "sdk/src/query/workstream-inventory.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS workstream-inventory.cjs is the generated Adapter for the workstream-inventory Shared Module (Phase 3/#3548). SDK workstream-inventory.ts is the source-of-truth query handler. Freshness check enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/config.cjs",
|
|
"ts": "sdk/src/config.ts",
|
|
"classification": "CJS-CLI-ONLY",
|
|
"justification": "Phase 2 (#3536) already migrated CONFIG_DEFAULTS and loadConfig/mergeDefaults to the Configuration Module and sdk/src/config.ts. What remains in config.cjs is exclusively CLI command handlers (cmdConfigGet, cmdConfigSet, cmdConfigNewProject, cmdConfigEnsureSection, cmdConfigSetModelProfile, cmdConfigPath, cmdMigrateConfig, buildNewProjectConfig, setConfigValue, ensureConfigFile) that depend on CJS-only APIs (withPlanningLock, platformWriteSync/ReadSync/EnsureDir, sync fs ops, process.exit). sdk/src/config.ts provides only the async loadConfig/mergeDefaults SDK layer. The two files serve disjoint surfaces with no logical overlap — not a hand-sync drift anti-pattern."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/intel.cjs",
|
|
"ts": "sdk/src/query/intel.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS intel.cjs is the synchronous runtime implementation used by gsd-tools.cjs; sdk/src/query/intel.ts is the async QueryHandler port for the SDK query seam (explicitly documented as a port in its file header). The two files intentionally diverge on INTEL_FILES naming (CJS: file-roles.json/api-map.json/dependency-graph.json/arch-decisions.json; SDK: files.json/apis.json/deps.json/arch.md) — existing CJS tests are locked to the old naming. Not a hand-sync drift pattern; separate runtime responsibilities across the seam."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/model-catalog.cjs",
|
|
"ts": "sdk/src/model-catalog.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "Both files read from sdk/shared/model-catalog.json (ADR-0003 precedent) as independent consumers of the shared manifest. CJS exposes VALID_AGENT_TIERS, MODEL_ALIAS_MAP, RUNTIME_PROFILE_MAP, KNOWN_RUNTIMES, RUNTIMES_WITH_REASONING_EFFORT, nextTier, formatAgentToModelMapAsTable for core.cjs and model-profiles.cjs consumers. SDK exposes resolveRuntimeTierDefault, runtimesWithReasoningEffort for session-runner.ts and query handlers. The shared JSON is the single source-of-truth; both adapters derive their exports from it without duplicating any logic between themselves."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/plan-scan.cjs",
|
|
"ts": "sdk/src/query/plan-scan.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "CJS plan-scan.cjs is the generated Adapter reading from sdk/src/query/plan-scan.ts Shared Module (Phase 6/#3575). SDK plan-scan.ts is the source-of-truth. Freshness check (check-plan-scan-fresh.mjs) enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/secrets.cjs",
|
|
"ts": "sdk/src/query/secrets.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "CJS secrets.cjs is the generated Adapter reading from sdk/src/query/secrets.ts Shared Module (Phase 6/#3575). SDK secrets.ts is the source-of-truth. Freshness check (check-secrets-fresh.mjs) enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/schema-detect.cjs",
|
|
"ts": "sdk/src/query/schema-detect.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "CJS schema-detect.cjs is the generated Adapter reading from sdk/src/query/schema-detect.ts Shared Module (Phase 6/#3575). SDK schema-detect.ts is the source-of-truth. Generated CJS adds detectSchemaOrm compat export (not in SDK) and exports SCHEMA_PATTERNS/ORM_INFO for backward compatibility. Freshness check (check-schema-detect-fresh.mjs) enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/decisions.cjs",
|
|
"ts": "sdk/src/query/decisions.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "Phase 6 (#3575): CJS decisions.cjs is the generated Adapter reading from sdk/src/query/decisions.ts Shared Module. SDK source-of-truth; regex aligned to accept alphanumeric IDs (D-INFRA-01). CJS callers (gap-checker.cjs) use {id, text} subset; extra fields {category, tags, trackable} are present but ignored. Freshness check (check-decisions-fresh.mjs) enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/workstream-name-policy.cjs",
|
|
"ts": "sdk/src/workstream-name-policy.ts",
|
|
"classification": "ADAPTER-OVER-MODULE",
|
|
"justification": "Phase 6 (#3575): CJS workstream-name-policy.cjs is the generated Adapter reading from sdk/src/workstream-name-policy.ts Shared Module. SDK source-of-truth now exports all three functions used by CJS callers (toWorkstreamSlug, hasInvalidPathSegment, isValidActiveWorkstreamName) plus validateWorkstreamName alias. Freshness check (check-workstream-name-policy-fresh.mjs) enforces alignment."
|
|
},
|
|
{
|
|
"cjs": "get-shit-done/bin/lib/prompt-budget.cjs",
|
|
"ts": "sdk/src/query/prompt-budget.ts",
|
|
"classification": "cooperating-sibling",
|
|
"justification": "CJS prompt-budget.cjs provides the applyBudget implementation used by gsd-tools.cjs case 'prompt-budget'. SDK prompt-budget.ts is the native QueryHandler port for gsd-sdk query dispatch (#3081). The SDK handler ports the pure budget logic and adds CLI arg parsing / file I/O directly, satisfying the registry-integration drift-guard without duplicating shared state."
|
|
}
|
|
],
|
|
"migrateMeBacklog": []
|
|
}
|