OQ triage: of 27 open questions, 4 block the critical path, 1 gates the v1 scope freeze, and 4 "resolved" entries are wrong
Источник:
dev/fera-research/docs/oc1/026-oq-triage-blockers-stale-resolutions.md(read-only; сгенерировано scripts/sync-docs.mjs)
OQ triage: of 27 open questions, 4 block the critical path, 1 gates the v1 scope freeze, and 4 “resolved” entries are wrong
Section titled “OQ triage: of 27 open questions, 4 block the critical path, 1 gates the v1 scope freeze, and 4 “resolved” entries are wrong”- kind: question
- area: modules / storage / ui / perf / calls
- evidence:
/home/nikki/dev/fera/project-design/context/OQ.md(943 lines, 27 IDs, all present, none skipped) cross-checked against every ADR, TECHSPEC/RFC/QA section, the sibling research docs, and the live repos. Line numbers cited inline per row. - severity: mid
Суть / Substance
Section titled “Суть / Substance”Resolution discipline in OQ.md is genuinely good — 12 entries carry
dated Resolved → see ADR-XXX markers, and every OQ→ADR mapping I checked
is textually correct (OQ.md:25→ADR.md:268, :48→:1008, :117→:643,
:205→:466, :476→:961). The problem is not discipline; it is that
resolution is one-directional: closing an OQ updates OQ.md and adds an
ADR, but never propagates into TECHSPEC.md/RFC.md/QA.md (my findings
003, 011, 014, 018).
Headline: ~70% of OQs are resolved, but ~4 of the resolved ones now mislead, and the corpus’s biggest risks are in questions nobody asked.
Full triage
Section titled “Full triage”| ID | Title | Lines | Status | Still a blocker? |
|---|---|---|---|---|
| OQ-001 | Engine vs Style separate dylibs? | 12–32 | RESOLVED → ADR-029 (verified ADR.md:264) |
No. But its RON premise is dead — ADR-030 overruled the format (finding 002). |
| OQ-002 | Single-pass vs two-pass hit-testing | 35–51 and 55–67 | RESOLVED → ADR-030 (verified ADR.md:1008) |
No — but see the duplicate below. |
| OQ-003 | Sticker frame cache raw vs compressed | 70–80 | OPEN (research done, default pre-registered, bench never run) | YES for alpha — TECHSPEC §10 step 5 (TECHSPEC.md:463). Also the missing eviction policy makes it worse (finding 013). |
| OQ-004 | tlottie vs velato default | 83–101 | RESOLVED by sequencing (:96), no ADR |
No. Its answer invalidates QA.md:87-90, which still requires the pre-default benchmark (finding 014). |
| OQ-005 | Metadata vs content classification | 105–124 | RESOLVED → ADR-031 (verified ADR.md:643) |
No — but the resulting table contradicts itself (finding 004) and ADR-016:633-635 still calls it open. |
| OQ-006 | Fixed benchmark scene parameters | 128–159 | RESOLVED / FROZEN 2026-10-02 as fera-scene-v0 (:130-131) |
No. But the generator is a 15-LOC skeleton in ~/dev/fera/fera/tools/bench-scene — every gate referencing the scene is currently unrunnable, and oc5 measured CELL_BUDGET=128 panicking against the frozen 500-chat parameter (OQ.md:146). |
| OQ-007 | Web-of-trust plugin signing | 163–186 | OPEN deliberately (:178 “stays Open”) |
No — consistent with ADR.md:91-92 “out of scope for v1”. |
| OQ-008 | Secret chats | 190–209 | RESOLVED → ADR-025 (verified ADR.md:466) |
No. But RFC.md:30 still lists secret chats as a v1 non-goal (finding 011). |
| OQ-009 | Predictor log storage | 213–237 | RESOLVED :229, but misstates the tier |
No. Wrong: says content-encrypted; ADR.md:650-652 says metadata tier; PREDICT.md:232-233 says strong tier (finding 025). |
| OQ-010 | Pixel-diff threshold | 241–273 | PARTIAL — procedure recorded, threshold deferred by design (:243-244) |
No for alpha; yes for the QA gate (QA.md:104 still “TBD”) — a gate with no threshold is not a gate. |
| OQ-011 | Two-phase regex threshold | 277–304 | PARTIAL — decision matrix decided, calibration pending (:288) |
Alpha-adjacent: the decision exists, the calibration does not, and QA.md:69-72 demands a threshold that the matrix replaced (finding 014). Calibration’s stated trigger (OQ-006 frozen) has fired. |
| OQ-012 | Official “triads” scope | 308–326 | OPEN — terminology updated to “quad” (:320-322), support-policy half still open |
Yes for beta — it is the test matrix; ADR.md:252-254 asserts a triad policy that no longer matches reality (finding 022). |
| OQ-013 | Plugin container format (Lattice) | 330–450 | RESOLVED in reality, stale in OQ.md | Yes for alpha (plugin loading) — but not because it is open: ~/dev/fera/lattice/SPEC.md:1-6 is “Draft v1 (frozen)”, while OQ.md:435 still says “Until that exists, this OQ stays open”, its file pointer context/LATTICE.md (:437) does not exist, and its “§10.1 TBD” (:449) is frozen at lattice/SPEC.md:701-716. Also the decision has zero ADR coverage (ADR.md:903-904 still defers it). |
| OQ-014 | Engine substrate | 454–483 | RESOLVED → ADR-028 (verified ADR.md:961) |
No. GPUI residue remains in 14 places (finding 001). |
| OQ-015 | L2 translator capability set | 487–507 | RESOLVED :498 (minimal starter set), no ADR |
No. |
| OQ-025 | GitHub org & repo topology | 511–548 (out of order) | PARTIAL and factually wrong | No. Names org thefera (:523) vs actual the-fera; lists fload/mikkaj/grmrs (none exist); omits 11 repos that do, including the whole chroix* family (finding 012). |
| OQ-016 | NixOS distribution | 552–558 | OPEN parked (:555) |
No. |
| OQ-017 | Web proxy | 562–568 | OPEN deferred to v1.5+/v2.1 (:567-568) |
No per its own rule — but see finding 019: MTProto/SOCKS proxy (the actual decades-old feature) is absent from the corpus entirely. |
| OQ-018 | Mini Apps | 572–577 | OPEN deferred past v2 (:576) |
No. |
| OQ-019 | Feature map survey | 580–591 | OPEN, not started (:587) |
YES — it gates the v1 scope freeze, which is its stated purpose (:582). Three ADRs have meanwhile committed v1 features (secret chats, passkeys, calls), so scope is accumulating by ADR rather than by survey. |
| OQ-020 | Developer mode semantics | 595–604 | OPEN — three sub-questions unanswered (:598-601) |
Yes for beta / the first public build accepting third-party native modules (:602-604). ADR.md:442-446 decided only that it exists. |
| OQ-021 | Runtime on-disk layout | 608–727 | RESOLVED / FINAL :610, :649 |
No — but its promised deliverable never shipped: :649-657 “Transcription into TECHSPEC as the filesystem contract follows” — grep finds no trace in TECHSPEC. And it contradicts itself: trust-manifest.ron (:685) vs trust-manifest.json (:631) in the same block, with ADR.md:805 and TECHSPEC.md:362 siding with JSON. |
| OQ-022 | Plugin fuel & swap TTL | 731–753 | PARTIAL — policy recorded, runtime design pass never happened (:744-746) |
Alpha-adjacent (plugin host). Its 60 s straggler kill (:739-742) directly contradicts QA.md:129-132’s “zero dropped calls” (finding 014). |
| OQ-023 | Predictor formalization | 757–779 | RESOLVED → PREDICT.md (:771) |
No. But its scope statement (:759-764, “only to the predictor”) contradicts PREDICT.md:20-25 (finding 025). |
| OQ-024 | Power-efficiency + runtime fork | 783–894 | RESOLVED as formulation :847 “all contradictions resolved” — they are not |
No (execution gate, not a decision). Three live contradictions survive (finding 010): ABI #[repr(C)] vs pinned rustc, EBR vs QSBR, and the dlclose premise (finding 009). |
| OQ-027 | Telemetry policy at ОБТ | 898–918 (out of order) | OPEN, 2 of 3 sub-points decided (:900-905) |
Yes for ОБТ (:916). And its premise is false for crash reporting: telemetry is an unloadable module (:903-905), so a crash — precisely when it is not running — has no path (finding 019). |
| OQ-026 | Second site / teaser | 922–943 | OPEN parked :924 |
No. |
Structural defects in OQ.md itself
Section titled “Structural defects in OQ.md itself”- OQ-002 is duplicated, and the second copy is the one missing the
resolution. Blocks at
:35-51and:55-67are byte-identical except the first carriesResolved (2026-09-30) → ADR-030(OQ.md:48). So the file both resolves OQ-002 and, 20 lines later, presents it as unanswered. A reader working top-down sees the resolution first; a reader grepping by line range gets the stale copy. Pure copy-paste artifact; delete:55-67. - Two out-of-order insertions: OQ-025 sits between 015 and 016 (
:511), OQ-027 before OQ-026 (:898) — append-at-the-bottom editing. All 27 IDs exist; nothing missing, nothing skipped; no OQ references a non-existent OQ (verified). - Four resolutions never routed through ADR.md, contrary to
OQ.md:6-8andREADME.md:41-45: OQ-004, OQ-006, OQ-015, OQ-021 resolve to OQ.md prose or sibling docs; OQ-009 routes to “PREDICT.md §9 + OQ-021” — andPREDICT.md:237-239still contains the open question it supposedly resolved. QA.md’s orphan gate cannot be satisfied as written:QA.md:188-189requires every inline open question to be “present inOQ.md”, but QA never cites an OQ number (:72,:87,:104say bare “OQ.md”), so no linter can run it — and six referenced entries are now Resolved while the referring text still says TBD.
The questions nobody asked (the real risk surface)
Section titled “The questions nobody asked (the real risk surface)”Ranked by blast radius, all verified absent from every doc:
- Media/sticker cache eviction + quota —
RESEARCH-OQ-003.md:46-53proves ~90 MiB/sticker raw (~1440× the.tgs, ~32 GiB for three sets) and states “raw @ 512² cannot ship unbounded. It needs a quota + eviction policy”. No OQ, no ADR, no QA gate (finding 013). - On-disk schema migration / downgrade — ADR-021’s “a module swap does not imply a migration” vs ADR-024’s N-1 rollback cannot both hold (finding 017).
- Two-device conflict resolution — ADR-010 makes the local store the source of truth while the server is authoritative for history; no reconciliation rule exists (finding 019).
- Account lifecycle — logout/remove data disposition, per-account keys vs ADR-016’s single passcode-derived key (findings 007, 019).
- Notification policy — asserted in
RFC.md:147-153andTECHSPEC.md:418-429as decided, with no ADR and no OQ; the frozen scene already benchmarks a two-account merge (OQ.md:151). - Session revocation / device replacement —
ADR.md:849’s revocation is module-signing keys only (finding 019). - i18n / RTL — zero mentions anywhere, against a 1:1-fidelity goal and a KDL→rkyv style pipeline plus Native text slots (finding 019).
- MTProto/SOCKS proxy — absent entirely (finding 019).
- Backup/export stance — gestured at in
ADR.md:485, never decided (finding 019).
Варианты решения (tradeoffs)
Section titled “Варианты решения (tradeoffs)”- (A) Triage-driven cleanup: close the four stale entries, delete the duplicate, fix the renumbering, and file the nine missing decisions as OQs/ADRs. Cheapest path to a corpus that can be trusted again.
- (B) Structural fix first: make the OQ→ADR→downstream propagation mechanical (the lint in finding 018), then triage. Higher leverage, but tooling before the content is fixed is premature.
- (C) Prioritise by release gate: only fix what blocks alpha, then beta, then ОБТ; leave the rest documented as open. Fastest to a shippable alpha, leaves the corpus knowingly inconsistent.
Предлагаемое решение
Section titled “Предлагаемое решение”(A) + (C) combined — triage in release-gate order.
- Before alpha (4 items): OQ-003 close-by-measurement + the eviction
ADR (finding 013); OQ-013 state correction (mark Resolved, point at
lattice/SPEC.md, kill the deadLATTICE.mdpointer, add the missing ADR); the schema-migration/rollback ADR (finding 017); and makefera-scene-v0executable (generator + a gate), since four QA gates depend on a scene that cannot currently be run. - Before beta: OQ-012’s support matrix (finding 022); OQ-020 dev-mode semantics (session-scoped, per-module — recommendation in finding 021); OQ-010’s pixel-diff threshold once a UI exists; OQ-011’s calibration.
- Before ОБТ: OQ-027’s three sub-points + the crash-path gap.
- Scope freeze: OQ-019’s survey, restricted to decision-relevant deltas
(features Fera has already diverged on), plus the standing rule that no
ADR may add a v1 feature without a row in the published scope list — the
rule that would have prevented the
RFC.md:30contradiction. - Corpus hygiene (cheap, do alongside): delete the duplicate OQ-002
block; fix
OQ-021’s.ron/.jsonself-contradiction; fixOQ-009’s tier claim andOQ-025’s org/repo names; route OQ-004/006/015/021 through ADR.md or note why not; and giveQA.mdthe OQ-number references its orphan gate needs.