* 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>
152 lines
5.0 KiB
JSON
152 lines
5.0 KiB
JSON
{
|
|
"_comment": "Canonical schema manifest for valid config key paths. validKeys is the union of CJS config-schema.cjs and SDK query/config-schema.ts (they are enforced set-equal by tests/config-schema-sdk-parity.test.cjs). runtimeStateKeys mirrors RUNTIME_STATE_KEYS. dynamicKeyPatterns mirrors DYNAMIC_KEY_PATTERNS from SDK (which includes the canonical 'source' regex strings). The .test function is reconstructed at runtime from new RegExp(source).",
|
|
"validKeys": [
|
|
"mode",
|
|
"granularity",
|
|
"parallelization",
|
|
"commit_docs",
|
|
"model_profile",
|
|
"search_gitignored",
|
|
"brave_search",
|
|
"firecrawl",
|
|
"exa_search",
|
|
"workflow.research",
|
|
"workflow.plan_check",
|
|
"workflow.verifier",
|
|
"workflow.nyquist_validation",
|
|
"workflow.ai_integration_phase",
|
|
"workflow.ui_phase",
|
|
"workflow.ui_safety_gate",
|
|
"workflow.auto_advance",
|
|
"workflow.node_repair",
|
|
"workflow.node_repair_budget",
|
|
"workflow.tdd_mode",
|
|
"workflow.human_verify_mode",
|
|
"workflow.text_mode",
|
|
"workflow.research_before_questions",
|
|
"workflow.discuss_mode",
|
|
"workflow.skip_discuss",
|
|
"workflow.auto_prune_state",
|
|
"workflow.use_worktrees",
|
|
"workflow.worktree_skip_hooks",
|
|
"workflow.code_review",
|
|
"workflow.code_review_depth",
|
|
"workflow.code_review_command",
|
|
"workflow.pattern_mapper",
|
|
"workflow.plan_bounce",
|
|
"workflow.plan_bounce_script",
|
|
"workflow.plan_bounce_passes",
|
|
"workflow.plan_chunked",
|
|
"workflow.plan_review_convergence",
|
|
"workflow.post_planning_gaps",
|
|
"workflow.security_enforcement",
|
|
"workflow.security_asvs_level",
|
|
"workflow.security_block_on",
|
|
"workflow.drift_threshold",
|
|
"workflow.drift_action",
|
|
"code_quality.fallow.enabled",
|
|
"code_quality.fallow.scope",
|
|
"code_quality.fallow.profile",
|
|
"code_quality.fallow.mcp",
|
|
"ship.pr_body_sections",
|
|
"git.branching_strategy",
|
|
"git.base_branch",
|
|
"git.create_tag",
|
|
"git.phase_branch_template",
|
|
"git.milestone_branch_template",
|
|
"git.quick_branch_template",
|
|
"planning.commit_docs",
|
|
"planning.search_gitignored",
|
|
"planning.sub_repos",
|
|
"review.ollama_host",
|
|
"review.lm_studio_host",
|
|
"review.llama_cpp_host",
|
|
"review.default_reviewers",
|
|
"review.max_prompt_tokens",
|
|
"review.max_prompt_tokens_per_reviewer",
|
|
"workflow.cross_ai_execution",
|
|
"workflow.cross_ai_command",
|
|
"workflow.cross_ai_timeout",
|
|
"workflow.subagent_timeout",
|
|
"executor.stall_detect_interval_minutes",
|
|
"executor.stall_threshold_minutes",
|
|
"workflow.inline_plan_threshold",
|
|
"hooks.context_warnings",
|
|
"hooks.workflow_guard",
|
|
"workflow.context_coverage_gate",
|
|
"statusline.show_last_command",
|
|
"statusline.context_position",
|
|
"workflow.ui_review",
|
|
"workflow.max_discuss_passes",
|
|
"features.thinking_partner",
|
|
"context",
|
|
"features.global_learnings",
|
|
"learnings.max_inject",
|
|
"project_code",
|
|
"phase_naming",
|
|
"manager.flags.discuss",
|
|
"manager.flags.plan",
|
|
"manager.flags.execute",
|
|
"response_language",
|
|
"context_window",
|
|
"intel.enabled",
|
|
"graphify.enabled",
|
|
"graphify.build_timeout",
|
|
"graphify.auto_update",
|
|
"claude_md_path",
|
|
"claude_md_assembly.mode",
|
|
"runtime",
|
|
"resolve_model_ids"
|
|
],
|
|
"runtimeStateKeys": [
|
|
"workflow._auto_chain_active"
|
|
],
|
|
"dynamicKeyPatterns": [
|
|
{
|
|
"topLevel": "agent_skills",
|
|
"source": "^agent_skills\\.[a-zA-Z0-9_-]+$",
|
|
"description": "agent_skills.<agent-type>"
|
|
},
|
|
{
|
|
"topLevel": "review",
|
|
"source": "^review\\.models\\.[a-zA-Z0-9_-]+$",
|
|
"description": "review.models.<cli-name>"
|
|
},
|
|
{
|
|
"topLevel": "features",
|
|
"source": "^features\\.[a-zA-Z0-9_]+$",
|
|
"description": "features.<feature_name>"
|
|
},
|
|
{
|
|
"topLevel": "claude_md_assembly",
|
|
"source": "^claude_md_assembly\\.blocks\\.[a-zA-Z0-9_]+$",
|
|
"description": "claude_md_assembly.blocks.<section>"
|
|
},
|
|
{
|
|
"topLevel": "model_profile_overrides",
|
|
"source": "^model_profile_overrides\\.[a-zA-Z0-9_-]+\\.(opus|sonnet|haiku)$",
|
|
"description": "model_profile_overrides.<runtime>.<opus|sonnet|haiku>"
|
|
},
|
|
{
|
|
"topLevel": "models",
|
|
"source": "^models\\.(planning|discuss|research|execution|verification|completion)$",
|
|
"description": "models.<planning|discuss|research|execution|verification|completion>"
|
|
},
|
|
{
|
|
"topLevel": "dynamic_routing",
|
|
"source": "^dynamic_routing\\.(enabled|escalate_on_failure|max_escalations|tier_models\\.(light|standard|heavy))$",
|
|
"description": "dynamic_routing.<enabled|escalate_on_failure|max_escalations|tier_models.<light|standard|heavy>>"
|
|
},
|
|
{
|
|
"topLevel": "model_overrides",
|
|
"source": "^model_overrides\\.[a-zA-Z0-9_-]+$",
|
|
"description": "model_overrides.<agent-id>"
|
|
},
|
|
{
|
|
"topLevel": "review",
|
|
"source": "^review\\.max_prompt_tokens_per_reviewer\\.[a-zA-Z0-9_-]+$",
|
|
"description": "review.max_prompt_tokens_per_reviewer.<reviewer-slug>"
|
|
}
|
|
]
|
|
}
|