このセッションの成果
handoff #44 を継承。残作業 C(var宣言/型推論)を完了し master へマージ 。これで 純AST経路(if-source-shadow OFF)の testTypeInference 失敗が解消 → if-off 失敗 1 → 0 。
マージ済み(tinyexpression、master a5177f3)
PR fix: declared-type-aware AST equality for var declarations (#32 "C") #45 : declared-type-aware AST equality。consumer-only、unlaxer-dsl/codegen リリース不要 。
精密化した根本原因: $name == $remitter は BooleanEqualityExpr (ComparisonExpr ではない)にマップされ、evalBooleanEqualityExpr が両オペランドを無条件 boolean 強制 → 誤って等価。宣言は @declares のみで AST 脱落。欠けていたのは型 (as string)だけ(値 set-if-not-exists は既存経路で適用済み)。
修正(legacy VariableTypeResolver と同等): P4TypedAstEvaluator に declaredVariableTypes:Map<String,ExpressionType>(宣言なし式は空map→既存挙動と完全同一 )。AstDeclarationRuntime.tryEvaluateMainExpression が宣言トークンから型mapを構築し受け渡し。
恒久テスト P4TypedAstEvaluatorDeclaredTypeTest(if無し宣言型 equality、shadow非依存)。
検証
🎯 残ゲート = パース性能(#38 / #20 、unlaxer-parser #40 packrat)
純AST経路は全テストで忠実になった (if-off 失敗 0)。fallback=0 / if-shadow の実除去 に残るゲートは1つ:
if-shadow 除去の前提(再掲)
次セッションの選択肢
perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38 /test: BackendSpeedComparisonTest が legacy パーサー経路 (JavaCodeCalculatorV3 ctor) でハング — #19 の残り #20 パース性能 : unlaxer-parser handoff: P4 fallback=0 セッション (2026-06-26) — #43 codegen根治継続 / #32 第2段 string-concat fold widening の再開手順 #40 packrat メモ化の設計・実装(大きめ・別リポジトリ)。fallback=0 への律速。
if-shadow を実際に外す PoC(packrat 前提なので handoff: P4 fallback=0 セッション (2026-06-26) — #43 codegen根治継続 / #32 第2段 string-concat fold widening の再開手順 #40 とセット)。
P4 機能ギャップ: ブロックコメント / len / ダブルクォート / .in / 宣言setter / scope / javacode math未対応 #22 の残ニッチ機能(dot-method リテラル受け手 等、文法拡張 + Central deploy)。
ビルド/検証コマンド
フル: mvn -o verify -Dmaven.test.failure.ignore=true -Dtinyexpression.skipRailroad=true -Dgpg.skip=true -Dmaven.javadoc.skip=true -Dspotbugs.skip=true -Derrorprone.skip=true
緑判定ゲート: bash tools/ci/check-test-baseline.sh(OK: 新規失敗なし = 緑。既知失敗は perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38 testTernaryInSinWithDoubleParensStillWorks の1件)
再生成: rm -rf target/generated-sources target/classes
if-off 計測: evalIfExpr 先頭を if (!Boolean.getBoolean("p4.disableIfSourceShadow")) { ...既存... } で包む → -Dp4.disableIfSourceShadow=true で実行 → 計測後 revert 。
注意 : 同一 target/ で maven を並行実行しない(surefire-reports / classes が破損する)。
運用メモ(ユーザー方針)
関連
#32 (fallback=0計画), #35 (workaround真っ当化), #22 (機能ギャップ), #38 (perf:指数バックトラック), unlaxer-parser #40 (packrat)。前 handoff #44 (closed)。
memory: p4-issue35-cycle-landscape(C完了・gotcha), p4-issue32-stringconcat-blocker, tinyexpression-ci-baseline-gate, workflow-speed-over-green-ci, p4-fallback-zero-project。
このセッションの成果
handoff #44 を継承。残作業 C(var宣言/型推論)を完了し master へマージ。これで 純AST経路(if-source-shadow OFF)の
testTypeInference失敗が解消 → if-off 失敗 1 → 0。マージ済み(tinyexpression、master
a5177f3)$name == $remitterはBooleanEqualityExpr(ComparisonExprではない)にマップされ、evalBooleanEqualityExprが両オペランドを無条件 boolean 強制 → 誤って等価。宣言は@declaresのみで AST 脱落。欠けていたのは型(as string)だけ(値 set-if-not-exists は既存経路で適用済み)。VariableTypeResolverと同等):P4TypedAstEvaluatorにdeclaredVariableTypes:Map<String,ExpressionType>(宣言なし式は空map→既存挙動と完全同一)。AstDeclarationRuntime.tryEvaluateMainExpressionが宣言トークンから型mapを構築し受け渡し。P4TypedAstEvaluatorDeclaredTypeTest(if無し宣言型 equality、shadow非依存)。検証
testTypeInferencePASS、フル baseline gate 緑(44分、新規失敗ゼロ、既知失敗は perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38 の1件のみ)。p4-issue35-cycle-landscape(C — DONE & MERGED 節、gotcha 含む)。🎯 残ゲート = パース性能(#38 / #20、unlaxer-parser #40 packrat)
純AST経路は全テストで忠実になった(if-off 失敗 0)。fallback=0 / if-shadow の実除去に残るゲートは1つ:
P4AstEvaluatorCalculatorTestは if-ON でも ~1263s(巨大ネスト if = 不正検知 fraud formula のパース時間が支配的、eval ではない)。フル baseline gate は44分。if-shadow 除去の前提(再掲)
次セッションの選択肢
ビルド/検証コマンド
mvn -o verify -Dmaven.test.failure.ignore=true -Dtinyexpression.skipRailroad=true -Dgpg.skip=true -Dmaven.javadoc.skip=true -Dspotbugs.skip=true -Derrorprone.skip=truebash tools/ci/check-test-baseline.sh(OK: 新規失敗なし= 緑。既知失敗は perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38 testTernaryInSinWithDoubleParensStillWorks の1件)rm -rf target/generated-sources target/classesevalIfExpr先頭をif (!Boolean.getBoolean("p4.disableIfSourceShadow")) { ...既存... }で包む →-Dp4.disableIfSourceShadow=trueで実行 → 計測後 revert。target/で maven を並行実行しない(surefire-reports / classes が破損する)。運用メモ(ユーザー方針)
.flattened-pom.xml/package-lock.jsonはビルド生成物(コミットしない)。関連
#32(fallback=0計画), #35(workaround真っ当化), #22(機能ギャップ), #38(perf:指数バックトラック), unlaxer-parser #40(packrat)。前 handoff #44(closed)。
memory:
p4-issue35-cycle-landscape(C完了・gotcha),p4-issue32-stringconcat-blocker,tinyexpression-ci-baseline-gate,workflow-speed-over-green-ci,p4-fallback-zero-project。