Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

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

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.

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.
  1. OQ-002 is duplicated, and the second copy is the one missing the resolution. Blocks at :35-51 and :55-67 are byte-identical except the first carries Resolved (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.
  2. 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).
  3. Four resolutions never routed through ADR.md, contrary to OQ.md:6-8 and README.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” — and PREDICT.md:237-239 still contains the open question it supposedly resolved.
  4. QA.md’s orphan gate cannot be satisfied as written: QA.md:188-189 requires every inline open question to be “present in OQ.md”, but QA never cites an OQ number (:72, :87, :104 say 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:

  1. Media/sticker cache eviction + quota — RESEARCH-OQ-003.md:46-53 proves ~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).
  2. 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).
  3. 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).
  4. Account lifecycle — logout/remove data disposition, per-account keys vs ADR-016’s single passcode-derived key (findings 007, 019).
  5. Notification policy — asserted in RFC.md:147-153 and TECHSPEC.md:418-429 as decided, with no ADR and no OQ; the frozen scene already benchmarks a two-account merge (OQ.md:151).
  6. Session revocation / device replacement — ADR.md:849’s revocation is module-signing keys only (finding 019).
  7. i18n / RTL — zero mentions anywhere, against a 1:1-fidelity goal and a KDL→rkyv style pipeline plus Native text slots (finding 019).
  8. MTProto/SOCKS proxy — absent entirely (finding 019).
  9. 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.

(A) + (C) combined — triage in release-gate order.

  1. 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 dead LATTICE.md pointer, add the missing ADR); the schema-migration/rollback ADR (finding 017); and make fera-scene-v0 executable (generator + a gate), since four QA gates depend on a scene that cannot currently be run.
  2. 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.
  3. Before ОБТ: OQ-027’s three sub-points + the crash-path gap.
  4. 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:30 contradiction.
  5. Corpus hygiene (cheap, do alongside): delete the duplicate OQ-002 block; fix OQ-021’s .ron/.json self-contradiction; fix OQ-009’s tier claim and OQ-025’s org/repo names; route OQ-004/006/015/021 through ADR.md or note why not; and give QA.md the OQ-number references its orphan gate needs.