Literate AI

Repository documentation

Evaluation of OVA's AI-Driven Development and Component Model

Scope and evidence

This evaluation uses OVA commit 811c71c9472ec07a5bae2dba32f6d8f21b0802bb (feat: add source-grounded component system) as its extraction baseline. The receiving repository baseline is literate-ai commit 1caa902 (Initial commit).

The review covers the complete source-grounded implementation, not only its design documents:

At the baseline, this subsystem comprises roughly 5,943 implementation lines across eleven central Python modules, plus focused unit and integration tests. OVA's full gate reported 366 passing non-native tests, strict OpenSpec validation, a clean macOS launch, and a real deterministic OVA-in-OVA source-grounded generation transaction. The independent extraction reviewer also re-ran 82 architecture-focused tests with all passing. Those results validate the current vertical slice; they do not satisfy the redesign and migration gates below.

Executive verdict

OVA has invented the outline of a valuable general system, not merely an Omniverse code generator. Its best idea is the continuity chain:

intent -> specs -> exact dependency closure -> exact source -> knowledge index
       -> evidence -> API contracts -> file plan -> generated source -> validation
       -> source package -> artifact package -> publication -> reusable Component

Each arrow is intended to produce an explicit, digest-bound object. Generated output returns to the beginning as another composable Component. Model selection, skills, caches, and publications are part of the lifecycle rather than ambient process state. That is the correct foundation for a modern form of literate programming.

The implementation is also still a first vertical slice. Its reusable domain model is interleaved with OVA names, Omniverse policy, CodeGraph CLI details, Python compilation, filesystem layouts, Litestar routes, and four hard-coded LLM stages. Several objects called immutable are updated through mutable projections, security is plan-only, and the self-hosting sample proves recursive composition rather than a byte-for-byte OVA rebuild. Copying the subsystem wholesale would preserve these accidental constraints.

The recommendation is therefore extract the invariants, redesign the boundaries, and port behavior through compatibility fixtures. Do not begin by renaming ova to literate_ai.

What OVA got right

1. A generated application is a Component

OvaComponentSpec, CachedOvaComponent, ComponentSourceLock, and the registry make generated applications discoverable in the same system as framework and catalog inputs. This enables recursive composition and is the core reason OVA can eventually be built in OVA.

The general framework must retain this invariant while separating a Component's logical identity from its immutable revisions and machine-local projections.

2. Specifications are generation inputs, not documentation afterthoughts

Every v2 manifest names canonical OpenSpec capability or active-change files. OpenSpecArtifactLoader loads their complete contents, records their digests in the file plan and generation provenance, and checks them again immediately before acceptance. ComponentSpecJournal preserves user intent in the active proposal.

The TOCTOU check and full-content binding are worth retaining. The journal mechanism needs redesign: prompt events should be immutable provenance records with an OpenSpec projection, not comments injected directly into one proposal file.

3. Source knowledge is revision-bound evidence

OVA refuses model queries until ComponentSourceLock and CodeGraphIndexLock agree on the source revision and digest. CodeEvidence carries source, index, query, content, symbol, and location identities. EvidencePolicy checks those identities again at API contract, plan, and generated-file boundaries.

This is substantially better than SDK-name prompting or documentation-only retrieval. The exact-source/index/evidence barrier should be a framework invariant, while CodeGraph becomes the first implementation of a general knowledge-index port.

4. Generation is staged and contract-bearing

SourceGroundedGenerator.generate() does not request an application in one opaque prompt. It resolves composition, assembles the full vocabulary, retrieves evidence, creates component API contracts, creates an evidence-bound file plan, generates files, validates staged output, performs bounded evidence-assisted repair, checks spec drift, accepts output, and writes provenance.

The stages and typed transition records are strong. The fixed stage names and one orchestrator method are not. The neutral system needs a versioned workflow definition whose default code workflow happens to contain these stages.

5. Model policy belongs to the Component

ModelEndpoint, ModelGroup, ModelStageSelector, and ComponentModelSelector make model routing explicit and portable. Groups are versioned and digestible; selectors express capabilities, locality, context size, cost, providers, and fallback. Exact selection decisions are written to provenance. Credentials are indirect environment references and are not rendered or persisted by Settings.

This is a general capability. It should become workflow-stage policy rather than requiring OVA's four generation stages in every Component schema.

6. Empty local caches and explicit publication are first-class

ComponentFinder, ComponentSourceCache, CodeGraphIndexManager, and ComponentCacheStore support local, per-user fault-in. Source packages carry forward dependencies; artifact packages carry the selected dependency package mapping; the linker resolves a closure. SourceCachePublicationService is deliberately separate from cache readiness and publication is explicit by default.

That separation is essential for offline, private, and single-user workflows.

7. Samples carry executable architectural meaning

The sample ladder covers simple, intermediate, advanced, composed, and self-hosting tiers. Each sample is itself a Component with specs, a pinned skill, a model selector, requirements, acceptance criteria, and an entrypoint. Strict OpenSpec validation and a sample checker turn the playground into conformance input.

The neutral framework should adopt this pattern and replace OVA/Omniverse scenarios with software-neutral equivalents. OVA-specific samples remain in OVA as downstream integration tests.

8. The security design separates authenticity from safety

The checked-in plan correctly states that authoritative signatures establish origin and integrity but do not establish safe behavior. It proposes quarantine, scanning, classification locks, dependency-risk propagation, compiler enforcement, audit, and a non-default identity-scoped expiring yolo policy.

This belongs in the general framework. It is not implemented in the baseline and must remain described as planned until adversarial tests prove it.

Structural problems to fix during extraction

Domain and naming coupling

Resolver policy is not neutral or sufficiently expressive

Provider selection must become an explicit policy port with a deterministic explanation object. OVA foundation and physics behavior belongs in an OVA policy adapter.

Complete vocabulary currently means eager global materialization

ComponentCompositionService.prepare_all_components() calls fault_all(), so forming the vocabulary can clone and index every enabled repository. This works for a small catalog and fails as the ecosystem grows. The live OVA self-hosting verification exposed this directly through large Git LFS payloads and source-empty meta repositories.

The framework needs two levels:

  1. a complete descriptor vocabulary containing every discoverable Component and its availability/identity metadata; and
  2. exact source evidence faulted only for the selected closure and explicitly requested comparison candidates.

Unavailable entries must remain visible without being presented as usable API evidence.

Source identities are not yet uniformly content identities

The neutral source layer needs canonical tree manifests, source-provider attestations, aggregate snapshots, and explicit dirty-source policy.

Evidence retention and prompt allocation are weaker than the lock model

Use structured provider results, CAS-backed evidence artifacts, selected-closure-first token-aware budgets, and language/provider analyzers that reconcile proposed API-use graphs with source contracts.

Cache immutability is partially violated

ObjectPackageManifest contains depending_components. When a new consumer is built, _record_dependent() mutates the dependency's stored object manifest. This means an object presented as an immutable package changes because of an external event.

The fix is to keep immutable package manifests content-addressed and store reverse edges in a separate, rebuildable dependency-index projection. Mutable latest aliases must also live outside package identities.

Object-package construction also removes and rebuilds an existing destination directory. latest_object_packages() silently omits dependency objects that have not been cached, so a source lock can name a requirement missing from the recorded build closure. Generated cache records and source packages flatten every transitive locked Component into requires, losing direct/transitive and build/runtime/optional edge meaning. The new package model must preserve typed edges, fault or fail on every required artifact, and reject an attempted content-address collision instead of overwriting it.

Build semantics are a Python-specific placeholder

build_object_package() compiles .py to checked-hash bytecode and copies every other file as a resource. This is useful test coverage for package lineage, not a general builder. It also runs before the planned classification lock exists.

The framework needs builder ports, toolchain locks, hermetic execution requests, classification authorization, and typed artifacts. No builder—including Python—may be invoked without the security transition once enforcement is enabled.

This is a present contract contradiction, not only missing hardening: SourceGroundedGenerator.generate() invokes the Python object builder before any classification lock exists, while the checked-in security specification says unclassified source must never compile. General build APIs remain disabled until the compiler guard and adversarial tests are executable.

Acceptance is not transactionally atomic as a set

Each generated file is written atomically, but ProjectGenerationTransaction.accept() updates files one at a time. A crash can leave a project containing part of a generation set. Lock files and provenance are written after source acceptance, which can further separate state.

Use an immutable workspace tree or transactional directory swap, followed by an atomic revision reference update. A run event store must make restart/reconciliation possible.

Workflow and provenance need stronger semantics

Separate deterministic run input identity from execution events and operational timestamps. Make workflow definitions, stage contracts, and policy decisions versioned objects.

Endpoint locality is currently asserted metadata, not a verified transport/network property, and CLI loading does not uniformly apply the URL checks used by Settings. ModelPortfolio.decisions is mutable shared history, which makes concurrent provenance unsafe. The new model layer must enforce prompt-egress policy and record isolated request/response artifacts, model revision/fingerprint, parameters, token/cost data, retry/failure/fallback reasons, and data classification for each call.

Settings and publication are functional vertical slices, not framework contracts

The neutral core should expose typed settings sections and publication ports. A CLI, JSON API, or optional UI can render those schemas. OVA keeps its Litestar presentation.

The current self-hosting proof is intentionally narrow

samples/ova-self-hosting proves that OVA can be selected as a Component and that a new immutable generated Component can be produced from that composition. The deterministic backend emits a descriptor file; it does not regenerate OVA's complete source tree, rebuild its distribution, run its full tests, or compare behavior.

True framework self-hosting requires a clean-cache bootstrap that regenerates a candidate framework revision, builds it with an accepted toolchain and classification, runs conformance tests, and uses the candidate to repeat the process with stable semantic results.

Several sample specifications also use normative language for classification, relinking, and self-hosting behavior that their descriptor/fixture tests do not execute. Until end-to-end gates exist, those samples are architectural promises rather than evidence of implementation.

Versioning, scale, and operational lifecycle remain early

These are acceptable prototype limits but must become explicit contracts, projections, operations, and downstream integration gates before the framework or OVA can claim one unified lifecycle.

Extraction decision matrix

OVA area Decision literate-ai destination What remains in OVA
Strict schemas, path validation, canonical digests Generalize domain/identity, per-context models OVA schema compatibility mapper
OvaComponentSpec and manifests Redesign ComponentDefinition, ComponentRevision, component.json ova.yaml reader and OVA extension fields
OpenSpec artifact loading and drift check Extract behind port ports/specs, adapters/specs/openspec OVA capability vocabulary/spec content
Prompt journal Redesign immutable IntentEvent plus OpenSpec projection OVA prompt capture UI hook
Skills with content digests Generalize ToolRecipeRef/SkillRef OVA-specific authoring skills
Catalog and generated registry Generalize descriptor registry and revision registry ports Omniverse/Isaac catalog entries
Source cache, leases, Git/local snapshots Generalize and harden source domain plus Git/local/CAS adapters OVA source-provider configuration
CodeGraph index and evidence Generalize behind port knowledge domain plus CodeGraph adapter OVA query templates and capability questions
Composition and dependency locks Redesign policy-driven resolver foundation/physics provider policy
Complete vocabulary Redesign descriptor vocabulary plus lazy grounded closure OVA catalog presentation
Model portfolio/groups/selectors Generalize model domain and provider adapters NVIDIA defaults and OVA UI wording
Staged generator and evidence policy Generalize as workflow engine run/workflow application services OVA workflow/profile and prompts
Python syntax validator Extract as plugin example validator adapter Omniverse/Isaac validators
Source/object package cache Redesign as immutable CAS package domain/storage ports OVA legacy-cache importer
Reverse dependents Reject current mutation separate dependency graph projection none
Python bytecode builder Keep only as example adapter optional Python builder native OVA/Kit/Isaac builders
Component linker Generalize artifact closure resolver OVA runtime linking/launch adapter
Filesystem publication Generalize filesystem publisher adapter OVA Settings actions
Settings service/UI Split typed settings core; optional headless API Litestar templates/routes and runtime settings
Sample ladder Extract pattern and neutral samples samples/ and conformance suite graphics/robotics samples
OVA self-host sample Replace with neutral snapshot-replication proof framework readiness sample OVA-on-framework self-host integration
Security classification plan Move and implement centrally security domain/policy/runner ports OVA platform-specific isolation profiles

Readiness assessment

Concern Baseline quality Extraction implication
Conceptual Component model Strong Preserve, but split logical identity/revision/projections
Specification continuity Strong prototype Preserve OpenSpec adapter; redesign intent journal
Source and evidence grounding Strong prototype Preserve invariants; generalize engine and strengthen identities
Composition Early Replace OVA defaults and simplistic provider selection
Model routing Strong prototype Extract with arbitrary workflow-stage support
Generation orchestration Strong vertical slice Recast as durable workflow/event state machine
Cache/package lineage Useful prototype Move to true CAS and external graph projections
Publication Narrow but well-separated Retain separation and add registry protocol
Settings Good OVA UI Define scopes/schema/secrets before extracting presentation
Samples Strong documentation pattern Rebuild as neutral conformance fixtures
Self-hosting Composition proof only Add full bootstrap/rebuild proof
Security Thoughtful plan, no enforcement Phase 1 blocker for any compiler execution
Schema/version migration Missing Design before first public release
Operational restart/recovery Missing Add durable runs and reconciliation

Conclusion

OVA should not remain the owner of these concepts, and literate-ai should not become an OVA utility library. The correct boundary is a portable lifecycle kernel with explicit ports and immutable wire contracts. OVA becomes one application adapter and one demanding conformance consumer. The migration plan makes OVA authoritative during Phase 1 and removes its duplicated implementation only in Phase 2 after real parity evidence.

Read the Markdown sourceConference homePublished 1.3.0 · Patch 1.3.1 in progress · Development 1.4