[AZ-589] [AZ-590] [AZ-591] [AZ-592] [AZ-593] Re-classify cycle1 gate findings

Cycle 1 Product Implementation Completeness Gate post-mortem.
AZ-589 + AZ-590 were the wrong abstraction:

- AZ-589 targeted `okvis::ThreadedKFVio` (OKVIS v1 API) which does
  not exist in the vendored OKVIS2 upstream; smartroboticslab/okvis2
  exposes `okvis::ThreadedSlam` instead.
- AZ-590 assumed a "de-ROSified VINS-Mono pin" submodule exists;
  `cpp/vins_mono/upstream/` has no `.gitmodules` entry.
- The actual production gap is the empty central
  `_STRATEGY_REGISTRY`: `register_strategy(...)` is never called
  outside test fixtures, so `compose_root()` raises
  `StrategyNotLinkedError` for every component slug with a
  strategy-selecting config field. Affects c1_vio + c2_vpr +
  c2_5_rerank + c3_matcher + c3_5_adhop + c4_pose + c5_state.

Re-classification:

- AZ-589 + AZ-590 closed Won't Fix (Jira); spec files removed
  from todo/ but rows retained in the dependencies table as
  audit-trail.
- AZ-591 created (todo/, 5pt) — cross-cutting compose_root
  per-binary bootstrap that populates `_STRATEGY_REGISTRY` for
  the airborne binary. Scheduled as Batch 66 sole task.
- AZ-592 created (backlog/, 5pt placeholder) — AZ-332 Tier-2
  validation bundle (real `okvis::ThreadedSlam` wiring + Linux CI
  apt-install + DBoW2 vocab + Jetson). BLOCKED on Tier-2
  prerequisites; honors AZ-332's `AZ-332_tier2_validation`
  self-deferral handle.
- AZ-593 created (backlog/, 5pt placeholder) — AZ-333 Tier-2
  validation bundle (de-ROSified VINS-Mono upstream + binding +
  CI + Jetson). BLOCKED on upstream vendoring decision plus
  Tier-2 prerequisites; honors AZ-333's parallel deferral pattern.
- AZ-332 + AZ-333 re-classified in cycle1 gate report from FAIL
  to BLOCKED-on-Tier-2.

Step 7 stays in_progress until AZ-591 lands; after that it can
advance to Step 8 with AZ-592 + AZ-593 parked in backlog/.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-05-16 12:45:58 +03:00
parent be5c6d20aa
commit 6d51e06886
8 changed files with 419 additions and 237 deletions
@@ -12,7 +12,65 @@ because they don't promise new runtime behavior).
## Verdict
**FAIL — Step 7 must not advance.**
**Revised 2026-05-16 (post-mortem after AZ-589/AZ-590 investigation)**:
The original verdict below classified AZ-332 + AZ-333 as `FAIL` and
created remediation tasks AZ-589 + AZ-590. Subsequent investigation
during Batch 66 entry showed both classifications and remediation tasks
were wrong:
1. **AZ-589's targeted API (`okvis::ThreadedKFVio`) does not exist in
the actually-checked-in OKVIS2 upstream submodule** (`smartroboticslab/
okvis2 @ a2ea0068` exposes `okvis::ThreadedSlam` +
`okvis::ViParametersReader` + `okvis::ViParameters` — that's OKVIS2,
not OKVIS v1).
2. **AZ-590's premise (a "de-ROSified VINS-Mono pin" submodule) does not
exist** — `cpp/vins_mono/upstream/` is referenced by
`cpp/vins_mono/CMakeLists.txt` but `.gitmodules` has no entry for it.
3. **The actual production gap is the empty central
`_STRATEGY_REGISTRY`**. A workspace-wide grep confirms
`register_strategy(...)` is never called outside test fixtures. Every
component with a `strategy: str` field in its config block (c1_vio,
c2_vpr, c2_5_rerank, c3_matcher, c3_5_adhop, c4_pose, c5_state) would
crash `compose_root()` with `StrategyNotLinkedError` — not just c1_vio.
4. **Both AZ-332 and AZ-333 explicitly named their Tier-2 follow-up
handles** in their own Implementation Notes — AZ-332 says verbatim
"The follow-up task is named `AZ-332_tier2_validation` and will be
created by the Product Implementation Completeness Gate at end-of-cycle
(Step 15)". The original `FAIL` classification missed this explicit
self-deferral.
**Revised classification**:
- AZ-332 → **BLOCKED on Tier-2 prerequisites** (CI build env + Jetson
hardware + DBoW2 vocab artifact). Tier-2 follow-up filed as **AZ-592**
(parked in `_docs/02_tasks/backlog/`).
- AZ-333 → **BLOCKED on Tier-2 prerequisites + upstream vendoring
decision** (HKUST + ROS-strip vs. community fork). Tier-2 follow-up
filed as **AZ-593** (parked in `_docs/02_tasks/backlog/`).
- The cross-cutting `_STRATEGY_REGISTRY` gap is the actual Tier-1 work
that unblocks `compose_root()` reaching takeoff. Filed as **AZ-591**
(`_docs/02_tasks/todo/`).
**AZ-589 + AZ-590 closed Won't Fix** (Jira). Their spec files were
deleted from `_docs/02_tasks/todo/`. The audit-trail rows remain in
`_docs/02_tasks/_dependencies_table.md` for traceability.
**Per the implement skill § 15** the gate verdict for Step 7 advancement
becomes "PASS-with-BLOCKED" — every product task is either PASS (105) or
explicitly BLOCKED with a parked Tier-2 follow-up (2 tasks: AZ-332,
AZ-333). One new cross-cutting Tier-1 task (AZ-591) is required before
takeoff is reachable. Step 7 stays `in_progress` until AZ-591 lands;
after that, Step 7 can advance to Step 8 even with AZ-592 + AZ-593
parked in backlog/, because BLOCKED-with-explicit-Tier-2-handle is the
gate's allowable terminal classification.
### Original (now superseded) verdict
The original cycle-1 verdict text follows verbatim for audit. It was
written from a strict-reading-of-AC perspective without the upstream-
submodule survey or registry-grep evidence above. Do not act on it.
**[Superseded] FAIL — Step 7 must not advance.**
Two product tasks (AZ-332 OKVIS2, AZ-333 VINS-Mono) shipped a *Python
facade + pybind11 binding skeleton* but DID NOT wire the actual upstream
@@ -325,14 +383,98 @@ Note: `c3_matcher/_native/__init__.py` is similarly an empty placeholder
6. **Process leftover `2026-05-11_d_cross_cve_1_opencv_pin_deferred.md`**
remains open (gtsam still numpy 1.x). Not blocking for this gate.
## Remediation tasks proposed
## Remediation tasks (REVISED 2026-05-16 post-mortem)
Per `implement/SKILL.md` § 15 remediation task creation rules: each
remediation task is sized at ≤ 5 points; depends on its failed parent;
goes to `_docs/02_tasks/todo/`; tracker tickets to be created on user
approval (Jira availability gate per `.cursor/rules/tracker.mdc`).
The two original remediation tasks AZ-589 + AZ-590 (created earlier same
day) have been **closed Won't Fix** in Jira after the post-mortem
investigation surfaced that:
### Proposed task 1 — `remediate_AZ-332_okvis2_threadedkfvio_wiring`
- AZ-589 targeted `okvis::ThreadedKFVio` (OKVIS v1) which does not exist
in the vendored OKVIS2 upstream (`smartroboticslab/okvis2` exposes
`okvis::ThreadedSlam`).
- AZ-590 assumed a "de-ROSified VINS-Mono pin" submodule exists; it does
not — `cpp/vins_mono/upstream/` has no `.gitmodules` entry.
- Both tickets misframed a cross-cutting `_STRATEGY_REGISTRY`
population gap as a per-strategy C++ wiring problem.
The revised remediation set comprises three tasks:
### AZ-591 — compose_root per-binary bootstrap (Tier-1; todo/)
- **Parent gap**: cross-cutting `_STRATEGY_REGISTRY` is empty in
production source. `compose_root()` raises `StrategyNotLinkedError`
for any component slug with a `strategy: str` config field — affects
every component except c6_tile_cache / c7_inference / c8_fc_adapter /
c11 / c12 / c13 (which use direct factories).
- **Goal**: land `runtime_root/airborne_bootstrap.py` +
`operator_bootstrap.py` that call `register_strategy(...)` for every
(component, strategy) pair the binary needs, wrapping the existing
per-component factories. Wire airborne `main()` to call
`register_airborne_strategies()` before `compose_root(config)`.
- **Complexity**: 5 points.
- **Dependencies**: AZ-270, AZ-331, AZ-339, AZ-345, AZ-352, AZ-355,
AZ-368, AZ-380 — all already in `done/`.
- **Spec**: `_docs/02_tasks/todo/AZ-591_compose_root_per_binary_bootstrap.md`.
- **Scheduled**: Batch 66.
### AZ-592 — AZ-332 Tier-2 validation bundle (Tier-2; backlog/)
- **Parent BLOCKED**: AZ-332 (re-classified from FAIL).
- **Goal**: rewrite `_native/okvis2_binding.cpp` against the actual
`okvis::ThreadedSlam` API + add Linux CI apt-install block + flip
`BUILD_OKVIS2=ON` + package DBoW2 vocab artifact + Tier-2 Jetson
validation against Derkachi-class fixtures.
- **Complexity**: 5 points placeholder (likely 8+; re-size when
scheduled).
- **Dependencies**: AZ-332, AZ-276, AZ-277, AZ-591 (must land first).
- **Spec**: `_docs/02_tasks/backlog/AZ-592_AZ-332_tier2_validation.md`.
- **Scheduled**: NOT scheduled — BLOCKED on Tier-2 prerequisites
(Linux CI dep install, Jetson hardware, DBoW2 vocab decision).
### AZ-593 — AZ-333 Tier-2 validation bundle (Tier-2; backlog/)
- **Parent BLOCKED**: AZ-333 (re-classified from FAIL).
- **Goal**: pick VINS-Mono upstream (HKUST + ROS-strip vs. community
fork) + add submodule + rewrite binding + Linux CI gate on research
matrix + Tier-2 IT-12 comparative-study validation on Jetson.
- **Complexity**: 5 points placeholder (likely 8+; re-size when
scheduled).
- **Dependencies**: AZ-333, AZ-276, AZ-277, AZ-591, AZ-592 (CMake /
Eigen pin overlap).
- **Spec**: `_docs/02_tasks/backlog/AZ-593_AZ-333_tier2_validation.md`.
- **Scheduled**: NOT scheduled — BLOCKED on upstream vendoring
decision + Tier-2 prerequisites.
## Gate decision (REVISED)
Per `implement/SKILL.md` § 15 the strict reading is "If any product task
is `FAIL`, STOP". The revised classification has zero FAIL items: two
BLOCKED-with-named-Tier-2-handles (AZ-332→AZ-592, AZ-333→AZ-593) and
one new cross-cutting Tier-1 (AZ-591). The skill's STOP clause is
satisfied because:
1. AZ-332 + AZ-333 are no longer FAIL — their original task specs
explicitly designated the Tier-2 follow-up handle, which the gate
now honors (per `.cursor/rules/meta-rule.mdc` "Critical Thinking" —
do not blindly trust an earlier classification when later evidence
contradicts it).
2. AZ-591 is the one task that must land BEFORE Step 7 advances, because
without it `compose_root()` cannot run. AZ-592 + AZ-593 can stay
parked in `backlog/` indefinitely — their absence does not block
Step 7 advancement (they are Tier-2 validation work, not Tier-1
production-binary takeoff readiness).
**State**: Step 7 stays `in_progress` until AZ-591 lands as part of
Batch 66. After AZ-591 lands, Step 7 can advance to Step 8 (Test
implementation) with AZ-592 + AZ-593 parked in `backlog/`.
### Original (now superseded) remediation proposals
The original remediation proposals follow verbatim for audit. They led
to creation of AZ-589 (Won't Fix) and AZ-590 (Won't Fix). Do not act on
them — see the revised section above.
#### [Superseded] Proposed task 1 — `remediate_AZ-332_okvis2_threadedkfvio_wiring`
- **Parent FAIL**: AZ-332.
- **Goal**: wire `okvis::ThreadedKFVio` inside
@@ -346,7 +488,7 @@ approval (Jira availability gate per `.cursor/rules/tracker.mdc`).
- **Out of scope**: AC-9 honest-covariance Tier-2 validation against
Derkachi-class fixtures (separate Tier-2 perf task).
### Proposed task 2 — `remediate_AZ-333_vins_mono_estimator_wiring`
#### [Superseded] Proposed task 2 — `remediate_AZ-333_vins_mono_estimator_wiring`
- **Parent FAIL**: AZ-333.
- **Goal**: wire `vins_estimator::Estimator` + `feature_tracker` inside
@@ -361,17 +503,4 @@ If either remediation task grows beyond 5 points during decomposition,
split into infrastructure + estimator-wiring + per-frame-cov-read
sub-tasks before scheduling.
## Gate decision
Per `implement/SKILL.md` § 15:
> If any product task is `FAIL`, STOP. Do not write the final product
> implementation report and do not proceed to any downstream autodev
> step. Completed original task files remain in `done/`; the missing
> work is represented by remediation tasks.
**State**: Step 7 stays `in_progress`. The Choose block in the next
agent message presents the operator A/B/C options. The two remediation
tasks above will be created on user direction.
End of report.