LearnNewsExamplesServices
Frontmatter
id13438
titleH2 first-widget: live inserted-grid evidence projection (insert-seam projector)
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-ada
createdAtJun 16, 2026, 3:05 PM
updatedAtJun 16, 2026, 3:49 PM
githubUrlhttps://github.com/neomjs/neo/issues/13438
authorneo-opus-ada
commentsCount0
parentIssue13349
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 16, 2026, 3:49 PM

H2 first-widget: live inserted-grid evidence projection (insert-seam projector)

Closed v13.1.0/archive-v13-1-0-chunk-3 enhancementaiarchitecture
neo-opus-ada
neo-opus-ada commented on Jun 16, 2026, 3:05 PM

Context

Child of the H2 epic #13349 (conversational app creation: first Neo widget). The deterministic first-widget evidence pane (#13413 / PR #13409) projected a hand-authored blueprint. This leaf delivers the MECHANISM that lets the evidence pane reflect a grid CREATED at runtime via the container insert seam — the same add → insert path a Neural-Link create_component drives (ComponentService.createComponentcall_method(parentId, 'add', [config])container.addinsert) — rather than a static blueprint.

Scoped out (stays on #13355): the EXTERNAL create_component → evidence whitebox proof — an outside agent's write actually reaching the pane. That residual is currently blocked on the shared connectToApp e2e fixture, which does not resolve the worker id for a childapp's SharedWorker topology (target.toLowerCase on a non-string). This leaf proves the seam + projector via the in-app bootstrap; #13355 keeps the external-agent provenance proof.

The Fix

  • util/createdGridEvidence.mjsprojectCreatedGrid: maps a LIVE inserted grid (the item from the container insert event) into the safe {schema, title, columns, rows} blueprint shape projectBlueprintEvidence consumes. Scalar-only (never column internals / record data), fails closed to null, accepts live NeoInstances (a live grid/store is not a plain object, so Neo.isObject cannot guard it).
  • view/ViewportController.mjs — boots the grid by add()-ing it to a stage container (the same add → insert seam create_component drives), observes the stage's insert, and projects the inserted grid into the evidence pane.
  • view/Viewport.mjs — the grid is created into a known widget-stage container (not a static child), so an external agent can later create_component into the same stage.

Acceptance Criteria

  • The evidence pane projects the metadata of a grid INSERTED into the stage (schema / title / columns / rows), not a hand-authored blueprint.
  • The projection reads safe scalars only and fails closed on a non-grid / unreadable input.
  • Render smoke: the evidence pane and the inserted grid render together, and the evidence reflects the inserted grid (its id, not the EvidencePane default).
  • Focused unit coverage for the projector (valid / invalid / no-leak / title-fallback / row-count) + the single-create-path source constraint.

Out of Scope

  • External create_component → evidence whitebox (stays #13355, blocked on the childapp connectToApp fixture).
  • Durable transcript persistence / Memory Core write-through.

Related

Parent: #13349. Sibling residual: #13355 (external-NL provenance). Builds on #13413 / PR #13409. Delivered by PR #13437.