lardon3d/docs/architecture/overview.md

459 lines
15 KiB
Markdown

# Lardon3D Architecture Overview
## Purpose
Lardon3D is a persistent, incremental, resource-aware photogrammetry engine for Linux.
The TUI is the operational control center for projects, acquisition, Tasks, durable progress,
resource state, optical configuration and optional external-storage control. Rich visualization and
live acquisition remain separate product areas and must consume validated snapshots rather than
mutable worker buffers.
## Current authority
```text
CURRENT_PROJECT_DB_SCHEMA=v25
CURRENT_PRODUCTION_TASK_KINDS=16
RESOURCE_UTILIZATION_POLICY=MAXIMUM_SAFE_USEFUL_THROUGHPUT
SERIALISM_REQUIRES_PROOF=CANONICAL
REAL_S21_TRACKS=PASS/FROZEN
REAL_A6000_PRE_SFM=PASS/FROZEN
```
The current Project DB head is additive:
```text
v22 Selected scientific execution foundation
v23 Generic optical-context overlay
v24 raw.develop.batch/1 persistence
v25 features.extract.batch/1 persistence
```
Earlier schema versions remain valid historical contracts where their documentation says so. Current
documentation must not present an older version as the active head merely because that version owns a
specific historical scientific or persistence boundary.
## Global execution model
```text
TUI / Project
|
v
Task
|
v
immutable resource estimate / capability
|
v
bounded Task Queue
(one active callback)
|
v
Resource Governor
(admission + reservation)
|
v
admitted owner callback
|
+--> bounded internal participants when justified
|
v
deterministic owner publication
|
v
durable checkpoint / restart boundary
|
v
validated snapshot consumers
```
The Queue owns bounded dispatch and backpressure. The Governor owns production resource admission.
The active Task owns its execution state and any bounded internal participants. Scientific stores own
their own identities and artifact validation.
No layer may silently absorb another layer's authority.
## Canonical resource objective
Lardon3D first preserves the interactive host reserve required for normal workstation use. Safe and
useful capacity beyond that reserve belongs to the active workload.
The objective is:
```text
MAXIMUM_SAFE_USEFUL_THROUGHPUT
```
This does not mean maximizing utilization percentages for appearance. It means using the largest
currently safe and useful CPU, RAM, I/O and validated accelerator capability while preserving
scientific identity, deterministic publication, host responsiveness and pressure limits.
The companion rule is:
```text
SERIALISM_REQUIRES_PROOF
```
Per-item atomicity does not imply cross-item serialization. Ordered or owner-only durable publication
does not imply serial preparation. Independent work should expose bounded concurrency when exact
science and persistence semantics can be preserved.
A CPU1 or batch1 path may remain when serialism, a measured scaling knee, memory, I/O, GPU execution,
exclusive state or another concrete constraint justifies it. Historical conservative descriptors are
not portable performance ceilings.
On the current validation host, the normal observed outcome is approximately:
```text
16 logical CPUs total
4 logical CPUs reserved for interactive host use
12 logical CPUs available to the compute pool
~3 GiB MemAvailable hard reserve
Radeon 780M UMA available to validated and useful GPU backends
```
These values are reference-host observations, not product constants.
## Current components
### Project
Persistent project lifecycle, stable identity, directory layout and Project DB ownership.
**Status:** IMPLEMENTED
### Project Database
SQLite owns durable logical identities, relations, typed Task payloads, scientific metadata and
references to external immutable artifacts.
The current schema head is v25. The scientific meaning of historical rows remains owned by the
versioned contracts that created them.
**Status:** CURRENT / v25
### Import and ScanSets
Import materializes managed immutable assets and logical images under explicit ScanSets. Provenance
from external source paths remains distinct from managed asset identity.
**Status:** IMPLEMENTED
### Capture / Asset Provenance
Capture identity remains distinct from file, Asset, `image_id`, SHA-256, path, Task ID and campaign
group ID. RAW and JPEG siblings may belong to one physical Capture without becoming one file or one
scientific image identity.
**Status:** PASS / FROZEN
### Bounded acquisition discovery and campaign execution
Discovery and planning are bounded and deterministic. Automatic grouping requires the documented
strong evidence; otherwise explicit caller confirmation remains `CALLER_EXPLICIT`.
Durable campaign execution uses the existing Task, Queue, Governor and Project DB recovery model.
**Status:** PASS / FROZEN
### Photo Quality Triage
Quality analysis is an operational selection layer, not a scientific identity. It produces explicit
GOOD / SUSPECT / REJECT recommendations and keeps human overrides distinct.
**Status:** PASS / FROZEN
### Selected scientific execution
The selected-execution snapshot binds the retained acquisition groups to explicit scientific
representations without inferring identity from paths, filenames or metadata.
**Status:** PASS / FROZEN
### Optical profiles and calibration selection
Project DB v23 provides generic camera-body profiles, lens profiles, optical configurations,
campaign/Capture assignments, calibration profiles and explicit compatible calibration selection.
Electronic metadata aliases are exact. Manual lenses without EXIF are normal. Missing or ambiguous
identity remains unresolved rather than guessed.
**Status:** IMPLEMENTED / VALIDATED
### RAW development
The historical `raw.develop/1` path remains valid. Project DB v24 adds
`raw.develop.batch/1`, allowing bounded independent RAW preparation with deterministic owner-only
publication in selected-item order.
Per-Capture publication remains atomic while cross-Capture preparation may be concurrent.
**Status:** IMPLEMENTED / VALIDATED
### Feature Store
Feature Store publishes immutable content-addressed Feature Files and bounded typed readers for ORB,
SIFT and RootSIFT data.
The historical `features.extract/1` task remains valid. Project DB v25 adds
`features.extract.batch/1`, which prepares independent selected images with bounded participants and
publishes Feature Sets deterministically through the owner callback.
**Status:** IMPLEMENTED / VALIDATED
### Visual Index
The ORB LSH Visual Index is persistent and segmented. It indexes homogeneous Feature Sets in bounded
updates and retrieves candidate relationships without performing geometric validation.
**Status:** IMPLEMENTED
### Candidate Pair
Candidate Pair generation answers which image pairs are worth exploring. Scientific pair identity and
canonical ordering remain independent from the amount of execution parallelism used to prepare them.
Candidate currently uses a bounded coupled CPU/batch ladder because additional CPU cannot exercise
additional independent pair work while the admitted item window remains one.
**Status:** IMPLEMENTED
### Matcher
Matcher produces deterministic Match Results from Feature Sets.
ORB supports the validated Vulkan hot path with exact CPU fallback. SIFT and RootSIFT remain CPU
OpenCV L2 paths. GPU use is selected only when a backend is both validated and useful.
**Status:** IMPLEMENTED
### Geometric Verification
Geometric Verifier v3 performs Fundamental USAC/MAGSAC verification with bounded restartable Task
execution. Scientific solver parallelism remains controlled by its contract while cross-parent
preparation can use bounded Governor-admitted participants.
**Status:** IMPLEMENTED / VALIDATED
### Track Model and Track Builder
Track Model v1 and Track Builder publish immutable Track Sets with deterministic identity and bounded
recovery semantics.
Retained real-data evidence includes:
```text
REAL_S21_TRACKS=PASS/FROZEN
REAL_A6000_PRE_SFM=PASS/FROZEN
```
**Status:** PASS / FROZEN
### Sparse SfM
Calibrated Sparse SfM capability is implemented through Gates C-G:
- Gate C: calibrated geometric primitives;
- Gate D: incremental reconstruction core;
- Gate E: final per-component Bundle Adjustment;
- Gate F: durable Task orchestration and atomic Project DB publication;
- Gate G: Governor admission and resource integration.
Phase H v1 adds incremental enrichment from immutable predecessor snapshots without redefining Gate F
scientific identity.
**Status:** C-G PASS / FROZEN; PHASE H V1 PASS / FROZEN
Implemented capability must remain distinct from execution on a particular real campaign. The
historical S21 and A6000 Engine Bay campaigns remain `CALIBRATION_UNAVAILABLE` for known-calibration
Sparse SfM. The retained A6000 proof intentionally stopped before Sparse SfM and Dense/MVS.
### MVS boundary
MVS-M1 provides the validated bounded external OpenMVS boundary and deterministic COLMAP/PLY exchange
contracts.
Durable dense publication, full Dense/MVS orchestration, mesh refinement, texturing and export remain
future work.
**Status:** PASS / FROZEN boundary
### Task Runtime
Tasks own lifecycle state, progress, cooperative pause/cancel behavior, sequence boundaries,
checkpoints and typed durable reconstruction.
**Status:** IMPLEMENTED
### Task Queue
The Queue provides bounded FIFO dispatch with one active callback, stable scanning and resource-WAIT
bypass behavior. It does not own resource policy.
**Status:** IMPLEMENTED
### Task Kind Registry
The production registry currently contains 16 Task kinds. Historical documents may legitimately
record smaller inventories at their checkpoint.
**Status:** IMPLEMENTED
### Hardware Profile and Resource Snapshot
Hardware Profile detects static host capability. Resource Snapshot captures current observable
capacity and pressure signals required for admission.
Unavailable optional telemetry remains unknown; it must not be fabricated.
**Status:** IMPLEMENTED
### Resource Governor
The Governor is the sole production authority for CPU, RAM, GPU, I/O admission and process-local
scratch leases where explicitly supported.
Pressure may throttle future admission. When pressure clears, useful resources must be eligible to
ramp back up; throttling is not a permanent lower ceiling.
UMA GPU allocations are charged exactly once against host RAM. Swap, zram and external scratch never
become admitted RAM.
**Status:** IMPLEMENTED / VALIDATED
### Optional external SSD controller
The UDisks2/GDBus controller owns the reviewed physical lifecycle for the exact
`LARDON_SWAP` / `LARDON_SCRATCH` device contract. It is not a second scheduler or Governor.
The Governor remains the sole production entry for scratch leases. The current 16 production Task
kinds have zero authoritative scratch consumption; visible storage capacity is not fabricated usage.
**Status:** CURRENT / VALIDATED OPERATIONAL
### TUI observatory and control center
ncurses input and rendering remain on the main thread. Runtime observation is bounded and coalesced.
The TUI exposes project state, Tasks, durable progress, resource state, optical configuration and SSD
control.
Validated layout boundaries are:
```text
full layout >= 100x30
reference compact 72x20
minimum supported 60x15
```
Below the minimum, only the bounded terminal-too-small fallback is rendered.
Opening, closing or switching a project is a Queue/DB lifetime boundary: destroy and join the sole
Queue first, including finished callbacks, then close Project DB, recreate one empty Queue and rebind
observers.
**Status:** CURRENT / VALIDATED OPERATIONAL
## Publication and restart model
Long-running processing follows bounded sequence boundaries:
```text
admit bounded work
-> prepare bounded items
-> join participants
-> publish deterministic atomic results
-> persist typed cursor/state
-> checkpoint generic Task progress
-> release transient buffers
-> sequence break / re-admission
```
The exact order varies by Task contract, but durable progress must never claim work that has not
reached its authoritative publication boundary.
A crash may leave generic Task progress behind an already durable immutable result where the
documented retry contract permits exact reuse. Recovery must converge from durable identity; it must
not guess identity from paths, timestamps, basenames or similar metadata.
## Viewer and live boundaries
Viewer, coverage analysis, live localization and capture guidance remain future product areas.
The architecture requirement is already clear: visual consumers use validated immutable snapshots.
They do not access mutable worker buffers, own scientific identity or become a second execution
runtime.
Device-specific acquisition transports such as A6000 HDMI/USB or S21/mobile integration belong at the
acquisition adapter boundary. Heavy reconstruction remains PC-side.
## Core invariants
- No Task callback executes without a valid active reservation.
- Queue/runtime do not own resource policy.
- The Resource Governor is the sole production resource authority.
- ncurses remains owned by the main thread.
- Scientific and operational identities remain distinct.
- Task estimates and installed sequence contracts remain immutable for their defined lifetime.
- Memory, buffers, queues, files, descriptors, processes, threads and internal participants are bounded.
- Per-item atomicity does not imply cross-item serialization.
- Owner-only publication does not imply serial preparation.
- Validated and useful GPU backends are preferred when eligible and Governor-safe.
- UMA GPU memory is charged exactly once against host RAM.
- Swap, zram and scratch do not enlarge RAM admission.
- Failure and cancellation clean operation-owned transient resources.
- Atomic scientific publication never exposes partial results as complete.
- FROZEN scientific decisions are not reopened by resource-policy evolution.
## Current limitations and future scope
The following remain outside the current implemented execution model:
- general dependency DAG scheduling;
- multiple active Task callbacks / inter-Task worker pools;
- general CPU/GPU/I/O worker-pool architecture;
- multi-GPU scheduling;
- global orphan-artifact reconciliation;
- Visual Index compaction / larger-index evolution;
- authoritative Task scratch consumers;
- durable dense / mesh publication;
- full Dense/MVS orchestration;
- mesh refinement, texturing and final export workflow;
- viewer;
- offline coverage analysis;
- suggested supplementary viewpoints;
- live camera localization;
- live coverage overlay;
- A6000/S21 live acquisition integration;
- capture guidance;
- video ingestion and deterministic keyframe extraction.
Deferring inter-Task parallelism does not authorize accidental serialization inside the one active
Task. Bounded internal concurrency remains the current mechanism for independent work under
`SERIALISM_REQUIRES_PROOF`.
## Current summary
```text
CURRENT_PROJECT_DB_SCHEMA=v25
CURRENT_PRODUCTION_TASK_KINDS=16
RESOURCE_UTILIZATION_POLICY=MAXIMUM_SAFE_USEFUL_THROUGHPUT
SERIALISM_REQUIRES_PROOF=CANONICAL
RAW_BATCH_PATH=raw.develop.batch/1
FEATURE_BATCH_PATH=features.extract.batch/1
REAL_S21_TRACKS=PASS/FROZEN
REAL_A6000_PRE_SFM=PASS/FROZEN
SPARSE_SFM_CAPABILITY=C_G_PASS_FROZEN
REAL_A6000_SPARSE_SFM_EXECUTED=NO
REAL_A6000_DENSE_MVS_EXECUTED=NO
TUI=CURRENT_VALIDATED_OPERATIONAL
VIEWER=FUTURE
LIVE_CAPTURE_GUIDANCE=FUTURE
```
Detailed contracts remain owned by the specialized architecture documents. This overview summarizes
current repository state and must not replace those normative documents.