oc2 — chroix-stack STATUS
Источник:
dev/fera-research/docs/oc2/STATUS.md(read-only; сгенерировано scripts/sync-docs.mjs)
oc2 — chroix-stack STATUS
Section titled “oc2 — chroix-stack STATUS”Zone: ~/dev/fera/chroix-project/ docs + code of chroix, chroix-core,
chroix-contract, chroix-macros, chroix-headless, chroix-vello.
Mandate: UI-stack problems, integration maturity vs fera client, API gaps,
display-list contract risks, what blocks replacing fera’s vello engine with chroix.
Rules honoured: read-only on all sources (no file outside docs/oc2/ written),
one file per finding, each committed. Never pushed.
Findings (7, all committed)
Section titled “Findings (7, all committed)”| # | file | kind | sev | one-line |
|---|---|---|---|---|
| 1 | fera-ui-stack-unconsumed-island.md |
problem | high | fera’s UI crates are an island: nothing builds a RenderTree, no window layer exists, paint() silently drops text |
| 2 | vello-version-split-contract-verified-against-rejected-version.md |
problem | high | vello_gpu 0.3 migration is manifest-only (GPU path is a stub); DISPLAY-LIST §8.1 still verified against 0.10 |
| 3 | backend-seam-duplicated-ctx-and-fingerprint-disagreement.md |
problem | high | Backend copy-pasted ×2 with incompatible PresentCtx; 3 disagreeing schema_fingerprint values; guard untestable |
| 4 | seam-inversion-engine-tree-vs-backend-bytes.md |
problem | high | seam points opposite ways — Engine::paint(RenderTree) vs Backend::present(&[u8]); text shaped on opposite sides |
| 5 | zero-allocation-requirement-violated.md |
problem | mid | encode() allocates 2 Vecs per call, no clear/reset/arena in the API — violates a stated §19 review gate |
| 6 | header-layout-never-matched-spec.md |
problem | high | wire header never matched §3 (CXL vs CHDL, frame_id/abi_version swapped, 56B vs 52B); G2 was a symptom |
| 7 | no-display-list-producer-exists.md |
problem | high | structural answer: layout + build stages absent; only test files ever create a buffer |
The two that matter most
Section titled “The two that matter most”- #7 — the display list is consumed by two backends and produced only by
tests/raster.rs:25-29andtests/cpu_backend.rs:39-44. Fera adoption is blocked on building the framework’s middle, not on writing an adapter. OQ-3 puts layout in core, so it is unstarted core work, not deferrable to a backend. - #6 — reframes
chroix/TODO.mdG2/D1. The old bug read offset[8..10], which is exactly the spec’s offset: two functions in one crate followed two different headers. The offset was “fixed” uncommitted, which hid the cause. TODO.md Stage 2a grows the wrong baseline (56→72 on a layout that never matched §3).
Self-correction recorded in-repo
Section titled “Self-correction recorded in-repo”Finding #2’s first draft asserted the shipped backend was on vello 0.10. That was wrong —
verified chroix-vello/Cargo.toml:16-20 + lockfile give vello_gpu 0.3 / vello_cpu 0.3 / wgpu 30, and legacy vello is absent from the lock. The correction is written into the doc
rather than quietly edited; the surviving defect is that the migration is declarative (GPU path
is VelloGpu { _private: () } returning Err(Error::GpuUnimplemented)) and §8.1 is stale.
seq 5 intro · 8 → oc3 (ui island) · 9 → all (seam/fingerprint) · 10 → all (header) · 12 → all (structural answer) · 13 → oc4 (consumer-gate convergence).
Cross-pollination: oc4’s idea-06 independently measured the same consumer-gate class
(“6 of 6 real crates have zero consumers … unreachable AND GREEN”). Sent them the case their
gate would miss: lower.rs:77-81 drops Text|Image|Spacer while paint() returns Ok(())
— a crate that is consumed, yet reports success on an empty frame. Proposed strengthening the
gate to “reachable AND observable”.
Next (not done)
Section titled “Next (not done)”node_indexside table: spec §11 resolved NodeBoundary as a parallel index; code keeps it as opcode 11 andgrep node_indexreturns zero hits. Fold into #6/#7 rather than a new file.- Backend fidelity per-op audit (headless is
FillRect-only,StrokeRectparsed-and-dropped, layers are bare counters) — quantifies how far “one contract, two backends” actually is. - Integration hazard: contract work uncommitted (9 files) while backends pin git
#c37de46a; globalinsteadOfrewrite to a localfile://path.