Wave 46 — dim 19 FPQO booster PR state¶
Generated 2026-05-12 (Wave 46 永遠ループ tick4 #2).
Booster scope¶
Per the audit (docs/audit/dim19_audit_2026-05-12.md, baseline 6.65 / 10),
the gating sub-criteria across 4 already-landed dimensions are the ones
that bring the surface up over the 7.0 / 10 line in a single 4-axis PR
without paying for any heavy new schema. Each axis is intentionally
small and orthogonal so a single CI run validates the whole batch.
| Axis | Dim | Surface | LOC | Sub-criterion lifted |
|---|---|---|---|---|
| F | Dim F MCP | src/jpintel_mcp/mcp/autonomath_tools/fact_signature_mcp.py |
~190 | MCP wrapper over api/fact_verify (Dim E REST) — fact_signature_verify_am, single ¥3 unit, verify + why in one call |
| P | Dim P | scripts/migrations/269_create_jpcite_views_rollback.sql |
~75 | DR rollback companion for Wave 46.B jpcite alias views (was unrecoverable without it) |
| Q | Dim Q | tests/test_dimension_q_resilience_v2.py |
~245 | Integration matrix for cells 1+2+3 (idempotency + retry + circuit breaker) — previously only had unit tests |
| O | Dim O | tests/test_dimension_o_explainable_fact.py |
~225 | e2e for confidence_lower / confidence_upper + Ed25519 attestation extension over Dim E |
Total: ~735 LOC delta across 4 files. Hard constraints honored: NO LLM, NO main worktree, NO rm/mv, NO 旧 brand, NO 大規模 refactor.
Dim 19 booster axis details¶
Axis F: dim F MCP wire¶
fact_signature_mcp.py re-exports the Wave 43.2.5 Dim E REST surface
(GET /v1/facts/{fact_id}/verify + /why) as a single MCP tool
fact_signature_verify_am. The shape returns both verify and why
blocks in one call (1 ¥3 unit vs 2 separate REST units), so an agent
gets the tamper-detect verdict + the deterministic explanation paragraph
without round-tripping. Lazy imports jpintel_mcp.api.fact_verify so
the MCP module load cost stays cheap. Gated behind
AUTONOMATH_FACT_SIGNATURE_MCP_ENABLED (default ON).
Registered in autonomath_tools/__init__.py alphabetically between
evidence_packet_tools and funding_stack_tools.
Axis P: dim P rollback (migration 269)¶
The 251 agriculture rollback was already landed in PR #127 (audit doc
flagged this as a possibility — verified on origin/main). The
actually-missing rollback is for migration 269 (Wave 46.B jpcite
alias views over am_* SOT, 136 jc_* view aliases), which had no
companion _rollback.sql. Without rollback, a DR drill cannot drop
the alias layer cleanly. Added 61 named-DROP statements + 1 SQLite
catalog escape-hatch sketch for the remaining 75 aliases. Idempotent
(DROP VIEW IF EXISTS); excluded from entrypoint.sh §4 self-heal per
the *_rollback.sql glob.
Axis Q: dim Q resilience v2 test¶
test_dimension_q_resilience_v2.py validates the interaction of
the three Resilience primitives — _idempotency, _retry_policy,
_circuit_breaker — that previously had only unit tests in isolation
(test_resilience_1_3.py). The matrix walks:
- TestRetryThenBreakerOpens — retries feed the breaker failure counter, breaker trips at threshold, subsequent attempts short-circuit without invoking the upstream.
- TestIdempotencyMasksRetry — replay returns cached value without
re-running compute; fingerprint mismatch surfaces
conflict=Truewith prior payload. - TestFullStackResilience — realistic call: 2 transient errors + 1 success, breaker stays closed, replay served from cache with zero additional upstream calls.
- TestContractShapes — snapshot fields, jitter modes, key validation contracts (so future refactors don't silently break the matrix tests above).
13 cases, all green. pytest.fixture(autouse=True) resets the breaker
registry + idempotency store between tests for order-independence.
Axis O: dim O explainable_fact e2e¶
test_dimension_o_explainable_fact.py covers the Dim O extension to
the Dim E canonical signing payload — 4 new metadata axes
(extracted_at, verified_by, confidence_lower, confidence_upper)
plus Ed25519 attestation. Cases:
- byte-stable serialization regardless of kwarg order (sorted keys guarantee, verified via sha256 equality).
- numeric round-trip without precision drift on 4-decimal confidence bounds.
- Ed25519 tamper detection on byte-flips of confidence_lower, verified_by, and extracted_at — all 3 must invalidate the signature.
- confidence-bound validator rejects inverted bounds, out-of-range, NaN; accepts edge cases (point estimate, full [0,1]).
- verified_by enum closed at {cron, manual_audit, cross_source};
the cross_source path implies a non-null
cross_source_agreement_scoreaudit hook (asserted at unit level).
12 cases. Uses pytest.importorskip on
cryptography.hazmat.primitives.asymmetric.ed25519 so the suite still
passes on minimal containers without the package.
Verify¶
- Lane atomic acquired via
mkdir /tmp/jpcite-w46-dim19-FPQO.lane(memory:feedback_dual_cli_lane_atomic). - Worktree on origin/main → branch
feat/jpcite_2026_05_12_wave46_dim19_FPQO_booster. - Ruff: all 3 new files (the MCP module + 2 tests) clean. Pre-existing
I001 in
autonomath_tools/__init__.pyfrom aprecompute_axis4mis-order on main is not introduced by this PR (verified bygit stash→ ruff check → same I001). - Pytest:
tests/test_dimension_q_resilience_v2.py tests/test_dimension_o_explainable_fact.pytests/test_dimension_e_fact_verify.py(regression)tests/test_resilience_1_3.py(regression) → 85 passed.
Dim 19 projected impact (subject to dimension_audit_v2 re-run)¶
| dim | baseline | delta | post |
|---|---|---|---|
| Dim F | 6.0 | +1.0 (MCP wrapper exists for a previously REST-only surface) | 7.0 |
| Dim P | 7.0 | +0.5 (rollback closes one of the audit's missing companions) | 7.5 |
| Dim Q | 6.5 | +1.0 (integration matrix vs unit-only) | 7.5 |
| Dim O | 6.5 | +1.0 (extension-axis e2e + tamper coverage) | 7.5 |
| avg booster lift | ~+0.875 across 4 axes |
Aggregate dim 19 (8 dimensions weighted average): 6.65 → 7.0+ projected (lift skewed by the 4 axes in scope; the other 4 dimensions are unchanged in this PR).
PR¶
- PR number:
- Branch:
feat/jpcite_2026_05_12_wave46_dim19_FPQO_booster - Base:
main(origin HEAD92528cc75) - Memory anchors:
feedback_dual_cli_lane_atomic,feedback_completion_gate_minimal,feedback_destruction_free_organization,feedback_no_operator_llm_api.