feat(perception): add E34 temporal occupied layer

This commit is contained in:
DCCONSTRUCTIONS
2026-07-27 16:55:40 +03:00
parent 95c6540691
commit 621084fcd6
22 changed files with 4732 additions and 104 deletions
+16 -3
View File
@@ -681,10 +681,23 @@ workloads and are evidence of node visibility, not E33 process consumption.
E33 qualifies downstream publication against the immutable E10→E32 chain; it
does not rerun or independently requalify upstream inference.
Execution was strictly sequential through E33: E30 determined what E31 was
E34 accepted immutable temporal-layer result
`e34-temporal-occupied-8d9abb3f2cc072cfdbb16cc4e55798e05c35a0abe0b8f691096770e091573a73`.
It consumes all `2,119,302` accepted E32 point rows, keeps current occupied
cells separate from held/expired unknown state and preserves the persistent
reconstruction. Peak state is 37 components and 324 cells per component;
component continuity is `82.15%`, geometry-only re-association is `81.78%`,
logical TTL emission delay is zero and coherent global map-frame jump count is
zero. The earlier rejected immutable run exposed and retained a `0.333 s`
source gap plus an incoherent nearest-neighbor jump detector; the fixed
implementation uses an independent TTL deadline and coherent translation
support without changing the frozen profile.
Execution was strictly sequential through E34: E30 determined what E31 was
allowed to change; E31 determined the E32 profile; E32 determined the E33
runtime input. Exact accounting is now closed, so E34 and E35 are the active
critical path.
runtime input; E32/E33 then bound the E34 layer. Exact accounting and the
bounded nominal temporal layer are now closed, so E35 is the active critical
path.
E36 is the first generalization gate. A separate product decision follows:
either keep the result as operator/shadow evidence, or start L5 occupied-space
integration. No LAB in this cycle can enable navigation, commands or safety
@@ -192,7 +192,17 @@ p95 was `2.668 ms`, process RSS peaked at `92.34 MiB`, both queues remained
bounded at depth two and the exact physical worker/container identity is
retained. This qualifies the final TrackGeometry publication stage against the
immutable upstream E10→E32 chain; it is not a new model-inference benchmark.
A8/E34+E35 is now the critical path.
A8/E34 is complete in immutable result
`e34-temporal-occupied-8d9abb3f2cc072cfdbb16cc4e55798e05c35a0abe0b8f691096770e091573a73`.
It consumes all `2,119,302` accepted E32 point rows across all 4,489 frames,
keeps hit-only occupied evidence separate from persistent reconstruction,
publishes held/expired state as unknown, peaks at 37 active components and 324
cells per component, and emits no free cells. Geometry-only re-association is
`81.78%`; overall component continuity is `82.15%`. Expiration uses an
independent `0.75 s` deadline and records the `0.283 s` worst source-gap
materialization delay separately. The first immutable run remains a rejected
artifact documenting the frame-clock and incoherent-jump implementation
failures. E35 is now the critical path.
- [x] Reproduce all 4,489 immutable E29 frames with the exact frozen profile
before applying E31/E30 changes.
@@ -212,7 +222,7 @@ A8/E34+E35 is now the critical path.
and publish per-frame health/timing plus resource telemetry.
- [x] Bind the accepted result to physical worker `DESKTOP-OPJ8J04` and the
pinned container image; independently verify all result artifacts.
- [ ] Build E34 as a separate short-TTL occupied/unknown temporal layer over
- [x] Build E34 as a separate short-TTL occupied/unknown temporal layer over
accepted E32/E33 evidence.
- [ ] Run E35 deterministic degradation/recovery variants without changing
the immutable source or accepted E32/E33 results.
@@ -0,0 +1,89 @@
# ADR 0027 — E34 short-TTL occupied/unknown temporal layer
Date: 2026-07-27
Status: accepted for source-scoped diagnostic/shadow use
## Context
E32 published exclusive, source-indexed `PointSlab` ownership over all 4,489
immutable RAVNOVES00 frames. E33 proved that the exact E32 publication stream
can be delivered at recorded `1.0×` pace through bounded worker channels with
closed accounting. Neither result is a local temporal model: geometry-only
component keys are frame-local, current support disappears immediately when a
source is unavailable, and there is no explicit expiration event.
The K1 stream is already registered mapped evidence. It does not retain the
beam origin and firing time required for honest ray-cleared free-space
mapping. The accepted persistent reconstruction must also remain a separate,
immutable derivative.
## Predeclared decision
1. E34 consumes only the accepted content-addressed E32 result under the
accepted E33 timing/accounting envelope. It never rewrites E32, E33, raw
evidence, the mapped stream or persistent reconstruction.
2. The output is a separate `lidar-local-map/v1` diagnostic derivative in the
E32 `map` frame. It publishes only hit-backed `occupied` and conservatively
aged `unknown` state. It never publishes `free`.
3. Current E32 point owners become `current/occupied` temporal components.
Camera track identity is retained only as source provenance. Geometry-only
components receive new temporal IDs and may be spatially re-associated
without inventing a semantic class.
4. A component without current accepted points becomes `held/unknown` for at
most `0.75 s`. Its last hit-backed cells remain explicitly stale evidence,
not current measurement and not free-space proof.
5. After the TTL, the component emits one `expired/unknown` tombstone and is
removed from the active occupied layer. Expired cells are never published
as occupied.
6. Geometry-only re-association is deterministic, one-to-one and bounded to a
`0.35 s` gap and `0.9 m` centroid distance. It additionally requires either
a `0.05` neighbor-expanded voxel overlap or a centroid distance no greater
than one `0.45 m` voxel.
7. The layer uses hit-only `0.45 m` voxels, at most `4,096` cells per component
and at most `256` active components. Crossing a bound fails closed; cells
are not silently truncated and components are not silently evicted.
8. A map-frame jump candidate is diagnostic only. It requires at least four
adjacent matched components within `0.25 s`, median displacement of at
least `1.5 m` and 25th-percentile displacement of at least `0.9 m`.
9. Acceptance requires complete 4,489-frame accounting, exact upstream
artifact identity, bounded state, no free-space publication, no component
held past TTL, expiry no later than one `0.25 s` observation interval after
the theoretical deadline and zero global map-frame jump candidates.
10. Continuity, re-association, geometry-only persistence and ghost lifetime
are measured and reported. They are not converted into detector accuracy
or ground truth and are not retuned after inspecting this run.
11. Dynamic class, traversability, planner input, commands, navigation and
safety authority remain unavailable.
## Consequences
- The E34 result can prove a bounded temporal contract without claiming
free-space quality or changing persistent mapping.
- Camera-only, conflict, unknown and source-unavailable inputs can preserve
uncertainty but cannot create new occupied cells without prior accepted
hit-backed provenance.
- A rejected run remains immutable evidence. Any later profile change requires
a new ADR decision, profile identity and LAB result rather than overwriting
E34.
## Execution outcome
The first immutable implementation result
`e34-temporal-occupied-1bab293c1867100e172923b189f8273c47eacca3dd179fd54573200906affd7c`
was rejected without changing the profile. It exposed two implementation-level
architecture errors:
- scalar nearest-neighbor displacement was not sufficient to call a jump
global; the corrected detector requires one coherent translation within the
already fixed voxel residual;
- frame-driven expiry could not meet the TTL across a recorded `0.333 s`
source gap; expiration now uses an independent logical layer deadline and
retains the later replay materialization time separately.
The accepted result is
`e34-temporal-occupied-8d9abb3f2cc072cfdbb16cc4e55798e05c35a0abe0b8f691096770e091573a73`.
It processes all 4,489 frames and all 2,119,302 E32 point rows, peaks at 37
active components and 324 cells per component, emits zero free cells, meets
the `0.75 s` TTL exactly and reports zero coherent global map-frame jump
candidates. A8 now continues with E35 deterministic degradation/recovery.