[AZ-386] C5 ESKF baseline: 16-state error-state KF (NumPy)

Implements the mandatory simple-baseline StateEstimator per AC-2.1a
engine-rule at C5 (IT-12 comparative study vs iSAM2). NumPy-only;
no GTSAM dependency so BUILD_STATE_ESKF=ON binaries ship without
GTSAM at all.

- 16-state error vector (pos 3 + vel 3 + rot 3 + ba 3 + bg 3 + dt 1)
  over a textbook nominal-state / error-state ESKF split.
- add_fc_imu: full nonlinear IMU integration + linearised F P F^T + Q
  covariance propagation per IMU sample.
- add_vio: simplified relative-pose update (snapshot-based; baseline
  scope, documented).
- add_pose_anchor: absolute-pose update; integrates BOTH marginals and
  jacobian modes (no skip — ESKF has no graph; AC-4).
- AC-9 divergence test: Mahalanobis r^T S^-1 r > 100 (10 sigma) on the
  innovation covariance S = H P H^T + R.
- AC-5 SPD: Cholesky-positive enforcement on every emitted covariance;
  non-SPD raises EstimatorFatalError and locks state to LOST.
- AC-6 honesty: smoothed_history entries carry smoothed=False; deviation
  from C5 contract Invariant 7 documented in module + report.
- AC-7 / AC-10 BUILD_STATE_ESKF gating: works through existing factory
  infra (state_factory._STATE_BUILD_FLAGS).
- AC-8: SourceLabelStateMachine + FallbackWatcher auto-wired eagerly
  in __init__, same pattern as the iSAM2 estimator.

Tests: 20 new unit tests covering AC-1..AC-10 + robustness checks.
Full suite: 660 passed, 2 skipped (CI-only).

The AZ-386 Jira transition to Done is deferred (Atlassian MCP returned
'Not connected'); recorded in _docs/_process_leftovers/ for replay on
the next autodev invocation per the Leftovers Mechanism.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-05-11 10:12:30 +03:00
parent 098aabac0c
commit c0bdb57957
6 changed files with 1486 additions and 1 deletions
@@ -0,0 +1,44 @@
# Jira transition for AZ-386 deferred — MCP "Not connected"
**Recorded**: 2026-05-11T10:00+03:00 (Europe/Kyiv)
**Status**: deferred-non-user (replay on next autodev invocation when Jira MCP is connected)
## What is blocked
Status transition of `AZ-386` from `To Do``Done` to reflect that
Batch 19 has landed the `EskfStateEstimator` mandatory simple-baseline
in code + tests + documentation (see
`_docs/03_implementation/batch_19_cycle1_report.md`).
## Why
The Atlassian MCP server returned `"Not connected"` on both
`transitionJiraIssue` and `getAccessibleAtlassianResources` during the
Batch 19 wrap-up. This is the documented "MCP unavailable" failure
mode in `.cursor/rules/tracker.mdc`. Per the Leftovers Mechanism the
write is recorded here and the non-tracker work (commit, push) is
allowed to proceed; the next autodev invocation will replay the
transition.
## Replay payload
- **Tool**: `transitionJiraIssue`
- **cloudId**: `denyspopov.atlassian.net`
- **issueIdOrKey**: `AZ-386`
- **target status**: `Done` (transition id is project-specific; resolve
via `getTransitionsForJiraIssue` at replay time — Jira project `AZ`
uses the standard "Software" workflow so the transition is `id: 31`
in current Jira config; confirm at replay time).
## Acceptance check on replay
After the transition succeeds:
- `getJiraIssue(AZ-386)` returns `fields.status.name == "Done"`.
- Delete this leftover file.
## Notes
- Code, tests, docs, and state file are all updated and committed. The
only outstanding action is the tracker status transition; the
AZ-386 task spec is already in `_docs/02_tasks/done/`.