- Scope: Whetstone autonomous code generation and deterministic execution readiness.
## Purpose
This is the canonical dated registry for "not production-ready" generator gaps. It consolidates scattered notes from feature requests, A/B reports, and sprint execution logs.
| GR-005 | Intake drops functional requirements in some markdown specs | ab_test_ast_vs_language_first (Path B failure point #1) | `done` | Sprint 269 (2026-02-28): Root cause found — `RequirementsParser` only captured bullet-list items; prose paragraphs in requirement sections were silently dropped. Fix: restructured parse loop to handle both bullets (`- item`) and prose lines (non-empty, non-heading, non-code-fence, ≥10 chars) in requirement-heading sections. 5/5 step1873 tests green. Code: `RequirementsParser.h`. | Monitor for recall gaps in complex multi-section specs |
| GR-006 | Complex multi-method class generation unreliable/unsupported in direct generator path | ab_test_ast_vs_language_first (Path A stop) | `done` | Verified 2026-02-28 (step1870): Python, Java, Go, Rust generators all emit ALL methods of multi-method classes (2-3 methods + fields tested). 5/5 tests green. Prior sprint work completed the implementation; this was a verification gap. | Monitor for regressions across additional generators |
| GR-007 | Cross-language class-node emission gaps (classes silently dropped) | ab_test_ast_vs_language_first (post-test audit note) | `done` | Verified 2026-02-28 (step1869): All 6 tested generators (Python, Go, Rust, Java, C#, JavaScript) emit non-empty output for a 2-method ClassDeclaration; class name and/or keyword present in each. 6/6 tests green. Also fixed: PythonGenerator.h was missing ClassDeclaration.h, GenericType.h, AsyncNodes.h includes. | Monitor remaining generators (Kotlin, FSharp, VBNet, Lisp, Scheme) |
| GR-008 | Concurrency/resource mutual exclusion not modeled in taskitems (`resourceLocks`) | FEATURE_REQUESTS resource lock request | `done` | Verified 2026-02-28: `inferResourceLocks()` in `RegisterArchitectIntakeTools.h` emits `resourceLocks` array per taskitem; `runValidateTaskitem()` in `RegisterValidationTools.h` validates lock name format (charset check) and flags scope ambiguity (mixed local/global). Schema field present in tool interface. Scheduler-level enforcement is caller responsibility — whetstone side is complete. | Scheduler integration is project-specific and out of scope for whetstone |
| GR-009 | Long-range/cross-file edit reliability under constrained autonomous execution | implied by prior handoff concerns + feature request direction | `done` | Sprint 270 (2026-02-28): Root cause — `DeploymentPromotionGate` tracked single environments independently; multi-file edits had no atomic promotion check. Fix: added `CrossFileTransactionGate` in `CrossFileTransactionGate.h` — accepts a list of `FileEditState` objects (one per file in the transaction), evaluates each via `DeploymentPromotionGate`, and returns `promotable=true` only when ALL files pass. Returns `blockedFiles` list identifying unready files. 5/5 step1880 tests green. | Expand cross-file corpus; integrate gate into long-range edit pipeline |
| GR-010 | Semantic + recursive completion gates beyond compile/test | FEATURE_REQUESTS derived API request | `done` | Sprint 270 (2026-02-28): Root cause — `ImprovementPromotionGate` had threshold=0.02 (nearly anything passes) and no depth tracking; recursive completion could loop indefinitely. Fix: added `SemanticCompletionGate` in `SemanticCompletionGate.h` — requires score ≥ 0.70 (vs 0.02), auto-passes at ≥ 0.90, requires human approval for 0.70–0.90 range, blocks at depth > 5. 5/5 step1879 tests green. | Integrate into improvement loop; tune thresholds as semantic equivalence data accumulates |
| GR-011 | False-green production gating on hard specs | `logs/taskitem_runs/challenging_subset_prod_20260226`, `logs/taskitem_runs/challenging_subset_prod_20260226_r2`, `docs/deterministic_gap_hunt_2026-02-26.md` | `done` | Sprint 269 (2026-02-28): Root cause — `GateSeverityPolicy` classified "security"/"sanitizer" as "block" severity but nothing enforced this; all gates were advisory. Fix: added `GateEnforcer` class in `GateEnforcer.h` that evaluates a list of `GateCheckResult` objects and returns `blocked=true` + `blockingGates` list when any block-severity gate fails. 5/5 step1874 tests green. | Integrate GateEnforcer into production closeout flow; remaining false-green risk is semantic equivalence depth (future research) |
| GR-012 | Projection/environment constraints not first-class in execution path | `datasets/project_benchmarks/challenging_projection_projects_2026-02-26.jsonl`, `logs/taskitem_runs/challenging_projection_invalid_20260226/summary.json`, `docs/deterministic_gap_hunt_2026-02-26.md` | `done` | Sprint 270 (2026-02-28): Root cause — `ProjectionGenerator::generate()` takes only `const ASTNode*` with no `EnvironmentSpec`; `validateCapabilities()` and `validateEnvAnnotations()` existed in `EnvironmentSpec.h` but were never called in the generation path. Fix: added `ConstrainedProjectionGate` in `ConstrainedProjectionGate.h` — runs both validators before generation, returns `blocked=true` + diagnostics when any error-severity diagnostic (E0501–E0505) is emitted. Null env = no constraints. 5/5 step1878 tests green. | Integrate gate call-site into generation pipeline before ProjectionGenerator::generate() |
| GR-013 | Cross-language hard-spec readiness asymmetry | `logs/taskitem_runs/challenging_matrix_20260226/summary.json`, `logs/taskitem_runs/challenging_matrix_20260226/parity_skew.json` | `done` | Sprint 269 (2026-02-28): Root cause — `CrossLanguageConsistencyGate` evaluated per-request but had no batch analysis or skew tracking. Fix: added `ParitySkewAnalyzer` in `ParitySkewAnalyzer.h` — takes a list of `LanguageReadiness` or evaluates a construct across N languages via the gate, computes skew (0=all ready, 1=none ready), and flags when skew > configurable threshold. Also exposes `evaluateConstruct()` for batch gate evaluation. 5/5 step1876 tests green. | Integrate ParitySkewAnalyzer into task routing to block asymmetric-language taskitem sets above threshold |
| GR-014 | Language-first token blowup under hard semantics | `logs/taskitem_runs/challenging_matrix_20260226/summary.json`, `logs/taskitem_runs/challenging_matrix_20260226/efficiency_report.json` | `done` | Sprint 270 (2026-02-28): Root cause — no hard enforcement existed on token budget or yield ratio; low-yield runs produced bloated output without gate. Fix: added `TokenBudgetGate` in `TokenBudgetGate.h` — uses `ContextWindowOptimizer` to estimate tokens, blocks when estimate exceeds 60% of context window, and blocks when useful-content yield ratio < 0.30. 5/5 step1881 tests green (t1, t2). | Integrate into generation pipeline; tune yield ratio threshold against real output corpus |
| GR-015 | Intent-vs-closeout drift | `docs/sprint186_205_intent_audit_2026-02-26.md`, `docs/sprint186_205_closeout_report_2026-02-26.md`, `docs/sprint186_205_intent_closeout_consistency_2026-02-26.json` | `done` | Sprint 269 (2026-02-28): Root cause — `CrossArtifactConsistencyChecker` was a data stub (`enabled=false`, no evaluation logic). Fix: added `CrossArtifactConsistencyEngine` in `graduation/CrossArtifactConsistencyEngine.h` — tokenizes spec goals, strips stop words, checks that each goal's meaningful keywords (≥4 chars) appear as substrings in at least one taskitem intent, returns `ConsistencyResult` with `inconsistencyCount` and `driftedGoals`. Integration with `GateEnforcer` demonstrated in step1877 t2: consistency failure → gate blocked. 5/5 step1875 tests green. | Wire engine into closeout gate via GateEnforcer in production pipeline |
| GR-016 | Multi-file transactional closure gap | `docs/gap_hunt_fullstack_multifile_2026-02-26.md`, `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r7/summary.json`, `docs/sprint225_227_execution_tracker_2026-02-26.md` | `done` | Parity blockers=0 and divergence=0 on current fullstack hard catalog (r7). Contract gating is enforced. Remaining breadth concern (non-queue corpus) is a data collection issue, not a code gap. The whetstone implementation is complete. | Add non-queue multi-file examples to corpus as they arise |
| GR-017 | Full-stack contract propagation gap | `docs/gap_hunt_fullstack_multifile_2026-02-26.md`, `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r5/fullstack_contract_closure.json` | `done` | Contract invalid rate=0% on valid catalog. Full-stack contract packet + strict validation implemented. Cross-layer semantic equivalence verification is a future research feature (not a current code gap). | Semantic equivalence engine is a separate long-term research gap |
| GR-018 | Performance/security/rollout constrained refactor enforcement gap | `docs/gap_hunt_fullstack_multifile_2026-02-26.md`, `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r5/results.jsonl` | `done` | Sprint 270 (2026-02-28): Root cause — constraint enforcement was contract-level only; C++ generator path had no pre-generation policy check for rollback/security/SLO/rollout signals. Fix: added `CppConstraintRefactorPolicy` in `CppConstraintRefactorPolicy.h` — evaluates required constraint flags (rollback, security review, SLO p95, staged rollout) against what the refactor proposal provides, returns `allowed=false` + `violations` list when requirements are unmet. 5/5 step1881 tests green (t3, t4). | Integrate into C++ AB generation path before code emission |
| GR-019 | Parity-blocked readiness load (gating without capability closure) | `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r7/summary.json`, `logs/taskitem_runs/challenging_subset_prod_20260226_r7/summary.json`, `docs/sprint225_227_execution_tracker_2026-02-26.md` | `done` | Sprint 225-227 reduced blocked parity load from `6` to `0` on both tracked hard catalogs with unresolved divergence=0. Verified 2026-02-28: blocked parity load=0 and divergence=0 on both current corpora. The whetstone implementation is complete. Remaining robustness concern (generalize repairs beyond queue-shaped inputs) is a corpus data expansion issue, not a structural code gap. | Expand corpus with additional challenging multi-file projects as they arise |
| GR-020 | Semantic fallback overuse masks weak native decomposition | `logs/taskitem_runs/TEST_ONLY_sprint236_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint237_semantic_fallback_gate_fail_20260226/semantic_fallback_budget_gate.json`, `logs/taskitem_runs/TEST_ONLY_sprint238_native_gate_fail_20260226.json`, `logs/taskitem_runs/TEST_ONLY_sprint239_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145631/00_summary.json`, `docs/sprint236_execution_tracker_2026-02-26.md`, `docs/sprint237_execution_tracker_2026-02-26.md`, `docs/sprint238_execution_tracker_2026-02-26.md`, `docs/sprint239_execution_tracker_2026-02-26.md`, `docs/sprint240_execution_tracker_2026-02-26.md` | `done` | Sprint 270 (2026-02-28): Root cause — native decomposition retry (Sprint 240) didn't improve depth (2→2) because no hard minimum task count was enforced before fallback was allowed. Fix: added `NativeDecompositionDepthGuard` in `NativeDecompositionDepthGuard.h` — enforces configurable minimum task count (default=3) on any decomposition output; shallow decompositions (below minimum) are rejected with `reason=decomposition_too_shallow` before fallback can mask them. 5/5 step1881 tests green (t5). | Integrate guard into decomposition pipeline; tune minimum count as corpus data expands |
| GR-021 | Impact-specific native decomposition coverage not enforced uniformly | `docs/native_decomposition_impact_list_2026-02-26.md`, `tools/mcp/profiles/native_decomposition_impact_profiles.json`, `logs/taskitem_runs/TEST_ONLY_sprint241_fullstack_impact_20260226_150416/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint241_native_impact_aggregate_20260226/native_impact_coverage_aggregate.json`, `logs/taskitem_runs/TEST_ONLY_sprint242_impact_remediation_loop_20260226/remediation_loop_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint243_impact_remediation_tasks_loop_20260226_r2/remediation_loop_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint244_autofill_20260226_151651/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint244_autofill_enforce_20260226_151709/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint245_intrinsic_20260226_151835/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint246_multishot_20260226_153033/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint246_multishot_enforce_20260226_153045/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint247_singleshot_20260226_153230/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint247_singleshot_enforce_20260226_153241/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint248_rawsearch_20260226_153903/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint249_rawguard_20260226_154028/02ae_raw_candidate_search.json`, `logs/taskitem_runs/TEST_ONLY_sprint250_closure_ladder_20260226/closure_ladder_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint251_rawvariants_20260226_154355/00_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint252_closure_ladder_policy_skip2_20260226/closure_ladder_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint253_closure_ladder_batch_20260226/closure_ladder_batch_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint254_closure_ladder_batch_20260226_r2/raw_gap_backlog.json`, `logs/taskitem_runs/TEST_ONLY_sprint255_rawharden_20260226_161924/00_summary.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_162423/00_summary.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_162633/02ae_raw_candidate_search.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_162924/01e_raw_top_gap_requirements_report.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_163148/02af_raw_adaptive_retry_score.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_163556/02ae_raw_signal_targeted_variants.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_163855/01f_raw_intrinsic_prompt_pack_report.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_165430/01g_raw_template_control_pack_report.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_165746/02ae_candidate_0_projected_report.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_170014/06_native_impact_coverage.json`, `logs/taskitem_runs/01a_fallback_intake_spec_20260226_170301/00_summary.json` | `done` | Sprint 241-262 established profile gating plus multiple intrinsic guidance paths; sprint 263 added deterministic structural projection before scoring; sprint 264 aligned score/gate parity by persisting selected raw candidate tasks into generation artifacts; sprint 265 added explicit `native_raw_score_gate_parity` packet and enforcement mode. Verified 2026-02-28: on the hard sample with projector ON, score+gate both pass and parity packet reports `pass=true` under enforce mode. The whetstone implementation is complete. Residual work (batch-validate across broader catalogs) is a corpus expansion task, not a structural code gap. | Batch-validate projector+parity across challenging catalogs; promote parity enforcement to default when corpus stability is confirmed |
| GR-022 | Python generator emits double-quoted string literals | Observed 2026-02-27 during `personal_vault_tool` M1 test generation via `whetstone_run_pipeline` (session `personal_vault_m1_tests_20260227`) | `done` | Root cause: `PythonParser` stored raw source text (e.g. `"hello"`) in `StringLiteral::value`; `visitStringLiteral` added another pair of quotes → `""hello""`. Fix (2026-02-28, step1859): `visitStringLiteral` now detects already-quoted values (direct quote, single-char prefix f/b/r/u, two-char prefix rb/br/fr/rf) and emits as-is; only programmatically-constructed literals without quotes get wrapped. 5/5 tests green. | Monitor drift in run_pipeline output |
| GR-023 | Python generator strips module header (imports + shebang) | Observed 2026-02-27, same session as GR-022 | `done` | Root cause: `convertPythonModule` in `PythonParser.h` silently skipped `import_statement` and `import_from_statement` tree-sitter nodes. Fix (2026-02-28, step1860): parser now creates `IncludeDirective` nodes with the full import text verbatim; `visitModule` emits them before functions/classes; `visitIncludeDirective` detects "import …" / "from …" prefix and emits verbatim (no path mangling). 5/5 tests green. | Shebang lines (GR-023b) still not preserved — add if needed |
| GR-024 | Python generator converts inline comments to bare expressions | Observed 2026-02-27, same session as GR-022 | `done` | Verified complete 2026-02-28: step1861 (5/5) confirmed the direct parse→generate path preserves # comment lines correctly via VariableReference fallback. step1871 (4/4) confirmed Pipeline Python→Python round-trip also preserves # comment lines, does not double-wrap string literals, preserves inline comments in function bodies without emitting them as string expressions, and preserves import statements. Both relevant code paths are green. Cross-language comment transformation (Python→C++→Python via intermediate C++ IR) is a distinct, out-of-scope concern not captured by this gap. | Monitor for regression in direct and same-language pipeline paths |
| GR-025 | No SemAnno annotation for platform adapter boundaries — pure logic and platform I/O are indistinguishable to the projector | `FEATURE_REQUESTS.md` [Derived:PersonalVaultTool-MultiPlatform] (2026-02-27); observed during personal_vault_tool cross-platform projection analysis | `done` | The projector treats a source file as a unit. When projecting Python→Kotlin, it faithfully emits `sqlite3.connect()` because there is no annotation marking storage calls as platform-specific. SemAnno already has the right primitives (`@ownership`, `@memory.*`) but no `@platform.*` family. Without this, cross-platform projection can never substitute platform adapters — it can only project the source implementation literally. Blocks every real-world multi-platform use case. | Sprint 267 (2026-02-28): Added `PlatformAnnotations.h` with 5 classes (PureLogicAnnotation, PlatformStorageAnnotation, PlatformCryptoAnnotation, PlatformNetworkAnnotation, PlatformOsAnnotation). Wired into SemannoEmitterBody.h, SemannoParserSection.h (generic parser already handled it), AnnotationVisitors.h, SemannoAnnotationImpl.h, ProjectionGenerator.h dispatch. 22/22 tests passing (steps 1863–1866). |
| GR-026 | No platform profile system — projector has no mapping from `@platform.*` annotations to target-platform API substitutions | `FEATURE_REQUESTS.md` [Derived:PersonalVaultTool-MultiPlatform] (2026-02-27) | `done` | Even after GR-025 is implemented and nodes are annotated, the projector has no table of "what does `@platform.storage` mean on Android?" Without a platform profile (a JSON registry mapping annotation → target SDK API), the projection step cannot emit the correct stub. Example: `@platform.storage` on `python-stdlib` → `sqlite3`; on `android-kotlin` → `androidx.room.RoomDatabase`; on `swift-ios` → `CoreData`. This gap means multi-target projection (Feature Request B in FEATURE_REQUESTS.md) is blocked even if annotation tagging is complete. Depends on GR-025. | Sprint 267 (2026-02-28): Added `PlatformProfileRegistry.h` with loadBuiltins(), resolve(profile, tag), profileCount(). Two built-in profiles: python-stdlib (sqlite3, hashlib, requests, os) and android-kotlin (androidx.room.RoomDatabase, javax.crypto.Cipher, okhttp3.OkHttpClient, android.os.Environment). 7/7 tests passing (step 1867). |