Known Documentation Gaps & Backlog
Known Documentation Gaps & Backlog
Section titled “Known Documentation Gaps & Backlog”This is a living checklist for the Vox open source community and core contributors to track undocumented or under-documented language features.
High Priority
Section titled “High Priority”-
Add deep dive for
workflowandactivitycompilation phases — closed 2026-08-23, see expl-actors-workflows.md §Compilation Phases. Traced parse -> HIR lowering -> determinism lint -> codegen with source citations at each step. The load-bearing finding:workflowbodies are not compiled to Rust at all — codegen emits a call intointerpret_workflow_durablethat re-interprets the embedded HIR at runtime and journals each step, which is why the determinism lint exists.activitybodies compile to real Rust, journaled as an opaque step. Also corrected the page’s own Durability Taxonomy: it described a second, separately-compiled “strictly Rust async” workflow path lacking step-level durability as a live “future parity” gap (citing ADR-021) — no such second path exists in the current emitter; there is exactly one workflow codegen path today, and it’s the durable one. -
Document difference between
queryandmutationtransactional boundaries natively — closed 2026-08-23, see ref-db-surface.md §Transactional boundaries. Verified againstcrates/vox-codegen/src/codegen_rust/emit/http.rsandapp_contract.rs:querynever runs in a transaction;mutationdoes whenever the module has anytable(a module-level flag, not per-function);servershares mutation’s emitter but is always called with the transaction flag hard-codedfalse. -
Expand the
Codexabstraction API reference — closed 2026-08-23, see codex-http-api.md §Rust API surface. The existing page covered only the HTTP/OpenAPI layer.Codexitself ispub type Codex = VoxDb(a type alias, not a distinct struct); documentedconnect/transaction/connection()(a mutex-guardedturso::Connectionwrapper, with a real documented race-condition caveat onlast_insert_rowid()), the generated per-table CRUD methods, and all 12facade/*.rsextension modules with what each adds. -
List all compiler auto-injected properties for
tabletypes (id,created_at,updated_at) — closed 2026-08-23; corrected 2026-08-23 after shipping a wrong answer for ~10 hours (session commit9019f6612).What was wrong. The original entry claimed “
tablegets zero auto-injected fields” and citedcrates/vox-db/src/ddl/emit.rs. That path is right but the claim describing it was wrong — I had actually read a different file with the same function name,crates/vox-codegen/src/codegen_rust/emit/tables/codegen.rs, and never reopenedvox-db’s owntable_to_ddl. Both files export a function calledtable_to_ddl; only one was checked.What’s actually true, re-verified 2026-08-23 by reading
vox-db/src/ddl/emit.rs::table_to_ddldirectly (not the codegen one) and confirming empirically:tabledoes get one auto-injected column:_id INTEGER PRIMARY KEY AUTOINCREMENT, unconditionally prepended before the declared fields (vox-db/src/ddl/emit.rs:36) — this is the real schema-migration DDL, consumed byauto_migrate.rs’sdb.auto_migrator(), the production path that reconciles a live SQLite schema against@tabledeclarations.- The generated Rust struct mirrors this:
crates/vox-codegen/src/codegen_rust/emit/tables/codegen.rs::emit_table_structunconditionally emitspub _id: Option<i64>,before the user’s declared fields (line ~283) — three lines above theinsert/get/deletemethods I did read carefully while implementingupdate()the same day, and somehow still missed the struct field two lines up. created_at/updated_atare not auto-injected — that part of the original answer holds. Confirmed:table_to_ddlhas no such columns; onlycollection_to_ddl(a different, unrelated construct) emits_created_at/_updated_at, alongside_data.- A user declaring their own
id: intfield collides with this and gets a real compiler warning:crates/vox-compiler/src/typeck/ast_decl_lints.rs:447(“Table ‘X’ declares a columnid; Vox@tablealready adds a surrogate_idprimary key.”) — which is itself evidence the original “zero auto-injected fields” claim was wrong; the warning only makes sense if_idis real. - The E1041/E1042 framing was also wrong: those validate the named
pk:argument to@table(pk: ...)when one is given; they say nothing about whether a table lacking one gets a default. It does —_idis that default, not a rejection.
Lesson for future verification passes in this repo: grep for the exact defining
fn, not just a plausible-looking file path — two crates independently defined atable_to_ddlwith different bodies, and citing the right name while reading the wrong file produced a confident, wrong, and unnoticed-for-hours answer.
CLI surface coverage
Section titled “CLI surface coverage”-
26 of 76 top-level
voxcommands were absent fromcli.md— closed 2026-08-23 by adding a Command index section listing each with the description clap already carries. Counted fromvox commands --format json, i.e.build_catalog()walking the real clap tree. (An earlier note here said “33 of 97”; that came from regex-parsing theClienum inlib.rsand over-counted cfg-gated stub variants and acronym spellings. The 34% rate was right, the counts were not — preferbuild_catalog()over source parsing.)The index is hand-written and will drift. The durable fix is generating it from
build_catalog()and gating it inssot-drift; the table carries aponytail:marker saying so. -
20 of 76 top-level commands were missing from
contracts/cli/command-registry.yaml— closed 2026-08-23 by adding a- id: <name>row tocontracts/operations/catalog.v1.yamlfor each ofbundle-app,chat,component,config,container,dispatch,drift-check,emit,ext,grammar,harness,llm,new,play,plugin,policy,repair,rollback,term,wasm, modeled on the existing pure-CLI entries (mcp: null, populatedcli:block withhandler_rusttraced to the actual dispatch match arm).vox ci operations-verify,operations-sync --target cli --write, andoperations-sync --target capability --writeregeneratedcommand-registry.yamlandcapability-registry.yaml;command-sync --writeregeneratedcli-command-surface.generated.md. All 20 now appear in both generated artifacts.That registry (projected from
contracts/operations/catalog.v1.yaml) is whatvox ci command-syncrenders intocli-command-surface.generated.md. It was gated and freshly generated, but the generator was pointed at a hand-maintained catalog that shadowed the clap tree for a quarter of the top-level surface — the CLI itself always had these 20 commands,catalog.v1.yamljust never had rows for them.- Registry coverage against
build_catalog()— closed Phase 23 (2026-10), seecrates/vox-cli/src/commands/ci/command_compliance/validators.rs::check_catalog_top_level_command_presencewired intocommand_compliance::run(repo_root). Validates that every top-level clap command in the CLI catalog exists as a registered operation incontracts/operations/catalog.v1.yaml.
- Registry coverage against
Retired-syntax prose lint
Section titled “Retired-syntax prose lint”-
contracts/documentation/retired-symbols.v1.yamlpattern coverage for at-prefixed data-layer forms (@table/@query/@mutation/@server/@tool/@resource/@form/@index/@endpoint) — closed Phase 23 (2026-10). All 9 at-prefixed syntax forms added tocontracts/documentation/retired-symbols.v1.yaml. Line-level migration-cue filtering (retired,removed,deprecated,instead,→,no longer,superseded,replaced by,migration,formerly,legacy,never emit,not @) plus carve-outs for JSON data files, migration guides, ADRs, case studies, and generated crate docs implemented incrates/vox-cli-ci/src/retired_symbol_check.rs. Gated deterministically viavox ci retired-symbol-check.
Medium Priority
Section titled “Medium Priority”- Explain the underlying generic instantiation (
<T>) algorithm used by HIR logic — closed 2026-08-23, see ref-type-system.md §7. Tracedinstantiate/fresh_var/unify/resolveincrates/vox-compiler/src/typeck/unify.rs: a generic (Ty::GenericParam) is replaced with a freshTy::TypeVarat every use site (so separate call sites never cross-contaminate theirT), then pinned down by unification with an occurs check against infinite types. - Detail all
mcp.tooloptions regarding rate limits and user confirmation schemas — closed 2026-08-23, see ref-decorators.md §tool. Mostly a false premise: thetoolkeyword itself takes no options beyond its description string. Writing@rate_limit/@cors/@pii/@webhook/@layeron atoolorresourcewas found silently inert (parsed, never consumed by codegen) and is now a compile error instead — seebcb8eb433, which generalized the existing bare-fnversion of this same check. Confirmation is real but lives entirely outside the language, as runtime policy incontracts/orchestration/permission-modes.v1.yaml+dispatch.rs’s dangerous-tool gate: risk classification, threePermissionModes, a per-repo persisted allowlist, and a documented (partially unwired) 5-tier precedence order. - Add explicit HTTP request payload mapping examples for
serverendpoints — closed 2026-08-23, see wire-format-v1-ssot.md §2.2.mutationandservershare the same param-extraction emitter (request["<name>"].clone(), flat top-level JSON lookup); the only wire differences are the path root and thatservernever gets transaction wrapping.
Completed
Section titled “Completed”- Standard library built-ins (completed 2026-04-06)
- Correct
componentdeclaration syntax (completed 2026-04-06;@islandretired 2026-05-03) - Example pipeline validation documentation (completed 2026-04-06)