LearnNewsExamplesServices
Frontmatter
id13361
titleMutate first widget from bounded follow-up requests
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-ada
createdAtJun 15, 2026, 5:55 PM
updatedAtJun 17, 2026, 1:10 PM
githubUrlhttps://github.com/neomjs/neo/issues/13361
authorneo-gpt
commentsCount2
parentIssue13349
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 13357 Capture first-widget requests in a safe chat surface
blocking[]
closedAtJun 17, 2026, 1:10 PM
milestonev13.1

Mutate first widget from bounded follow-up requests

Closed v13.1.0/archive-v13-1-0-chunk-3 enhancementaiarchitecture
neo-gpt
neo-gpt commented on Jun 15, 2026, 5:55 PM

Context

Epic neomjs/neo#13349 owns the Agent Harness H2 path: chat/work surface -> constrained blueprint -> live first Neo widget. The current child chain covers the first rendered widget (#13353 / PR neomjs/neo#13354), visible transcript / accepted-blueprint evidence (#13355), and safe first-widget request intake (#13357).

ADR 0020 and neomjs/neo-agent-brain#144 both make the next product promise explicit: the first widget must be live-mutable after it appears, not just generated once. ADR 0020 states the canonical demo as "build me a neo grid" -> a pane that becomes its own window, live-mutable; neomjs/neo-agent-brain#144 states that the standalone harness mutates itself through the same Neural Link mechanism it uses to build apps.

Release classification: post-release Agent Harness product line; attach to Agent Harness Project 13, not the v13 release board.

The Problem

After neomjs/neo#13357, the user can submit the canonical first-widget request and see deterministic widget provenance. That still stops short of the H2 proof if the result cannot be changed through the same conversational surface. A static first widget is a better demo, not yet a co-inhabited live object.

This ticket owns the next small proof: bounded follow-up requests mutate the existing first-widget state. The slice must stay constrained and reversible in shape. It should accept only a small, explicit edit grammar over the first widget, such as title, row count, column visibility, or sample-data reset. It must not introduce arbitrary code execution, generic provider orchestration, durable persistence, or Node-git write-through.

The Architectural Reality

  • learn/agentos/decisions/0020-agent-harness-concept.md names pillar 2 as conversational app creation and the canonical demo as chat -> live blueprint emission -> live-mutable grid pane.
  • resources/content/issues/chunk-2/issue-13012.md names runtime mutation via Neural Link and separately names NL-mutation-to-commit write-through onto Node-git. Those are related but not the same leaf.
  • learn/agentos/NeuralLink.md lists constrained runtime mutation tools such as set_instance_properties, create_component, remove_component, undo, and redo. This ticket should consume the bounded runtime-mutation concept without opening the full developer/admin surface.
  • resources/content/issues/chunk-3/issue-13064.md classifies harness-facing Neural Link tool projection as read / write-locked / admin, and warns that embedded harness agents must not inherit the full developer surface by default.
  • resources/content/issues/chunk-3/issue-13221.md preserves undo/redo and transaction-stack work as separate Neural Link substrate. This ticket may depend on those affordances if they are available, but it should not reimplement them.
  • learn/agentos/HarnessDockZoneModel.md separates runtime component ownership from persistence. It treats persisted item.blueprint and saved layouts as their own JSON-first model boundary, so durable persistence/write-through remains a later H2 child.

The Fix

Add a one-PR H2 child slice that lets the AgentOS widget child app accept bounded follow-up edit requests after the initial first-widget request is captured.

Expected shape:

  • Reuse the request/transcript/evidence surface from neomjs/neo#13357 instead of creating a second chat path.
  • Parse a small deterministic edit grammar over the first widget, for example "rename it to ", "show 8 rows", "hide/show column <name>", or "reset sample data".</li> <li>Apply accepted edits to the existing first-widget blueprint/runtime state from neomjs/neo#13353 rather than creating a replacement widget or a second hardcoded demo path.</li> <li>Reflect accepted and rejected edit attempts in the evidence/transcript surface from neomjs/neo#13355.</li> <li>Fail closed for unknown edit commands, overlong input, HTML-like input, invalid row/column bounds, and missing prerequisite widget state.</li> <li>Keep provider invocation, streaming orchestration, Memory Core persistence, saved layouts, Node-git write-through, and Electron shell work out of scope.</li> </ul> <h2 class="neo-h2" data-record-id="6">Contract Ledger Matrix</h2><div class="neo-markdown-table-wrapper"><table> <thead> <tr> <th>Target Surface</th> <th>Source of Authority</th> <th>Proposed Behavior</th> <th>Fallback</th> <th>Docs</th> <th>Evidence</th> </tr> </thead> <tbody><tr> <td>First-widget follow-up edit surface</td> <td>neomjs/neo#13349, ADR 0020, neomjs/neo#13357</td> <td>Accepts bounded edit requests after first-widget intake exists</td> <td>Unknown or unsafe commands render a bounded rejection state</td> <td>JSDoc / @summary on parsing and projection helpers</td> <td>Unit tests plus local render smoke</td> </tr> <tr> <td>Edit grammar -> widget state projection</td> <td>neomjs/neo#13353 blueprint contract</td> <td>Mutates the existing first-widget blueprint/runtime state without creating a parallel widget path</td> <td>Invalid bounds or missing widget state preserve current widget and surface an error</td> <td>Helper docs name accepted fields and limits</td> <td>Unit tests for each accepted edit and fail-closed branch</td> </tr> <tr> <td>Harness-visible mutation authority</td> <td>neomjs/neo#13064, Neural Link docs</td> <td>Uses only bounded app-runtime mutation semantics appropriate for harness embedding</td> <td>If write-locked substrate is unavailable, keep mutation local to deterministic state and name the residual</td> <td>PR body evidence</td> <td>Source assertion or test proving no admin/full-developer surface is exposed</td> </tr> <tr> <td>Transcript/evidence reflection</td> <td>neomjs/neo#13355 safe evidence surface</td> <td>Shows accepted/rejected edit attempts without unsafe rendering</td> <td>Unsafe text remains escaped / bounded</td> <td>Component/helper summary</td> <td>Unit/source assertion for no unsafe HTML path</td> </tr> </tbody></table></div> <h2 class="neo-h2" data-record-id="7">Decision Record impact</h2><p>Aligned with ADR 0020. No ADR amendment expected; this ticket implements the "live-mutable" part of the H2 canonical demo without changing product ordering, source placement, Neural Link authority tiering, or persistence boundaries.</p> <h2 class="neo-h2" data-record-id="8">Acceptance Criteria</h2><ul> <li><input disabled="" type="checkbox"> The AgentOS widget child app exposes bounded follow-up edit submission after neomjs/neo#13357's first-widget request intake path exists.</li> <li><input disabled="" type="checkbox"> Accepted edit commands mutate the existing first-widget blueprint/runtime state from neomjs/neo#13353 rather than creating a replacement widget or duplicate demo path.</li> <li><input disabled="" type="checkbox"> At least two deterministic edits are supported, one label/title edit and one grid-shape/data edit.</li> <li><input disabled="" type="checkbox"> Unknown commands, overlong input, HTML-like input, invalid row/column bounds, and missing prerequisite widget state fail closed to bounded visible states.</li> <li><input disabled="" type="checkbox"> Accepted and rejected edit attempts appear in the transcript/evidence surface from neomjs/neo#13355 without unsafe HTML rendering.</li> <li><input disabled="" type="checkbox"> The implementation does not call an LLM provider, persist transcript/widget state, write through to git, expose admin Neural Link tools, or introduce Electron shell/build-root behavior.</li> <li><input disabled="" type="checkbox"> Focused unit coverage verifies accepted edits, rejected edits, blueprint-path reuse, safe rendering, and no duplicate widget path.</li> <li><input disabled="" type="checkbox"> Local render smoke verifies initial intake, transcript/evidence, live widget, and follow-up edit surfaces work together after prerequisites land.</li> </ul> <h2 class="neo-h2" data-record-id="9">Out of Scope</h2><ul> <li>Natural-language model invocation or streaming chat orchestration.</li> <li>Durable transcript or widget persistence.</li> <li>Saved dock-zone layouts or <code>item.blueprint</code> write-through.</li> <li>Node-git commit/write-through flows.</li> <li>Generic Neural Link admin tool exposure or tool-surface curation.</li> <li>Multi-writer locking or undo/redo substrate implementation; those remain neomjs/neo-agent-brain#143 / neomjs/neo#13221-adjacent lanes.</li> <li>Electron shell/build-root work; that remains neomjs/neo#13033.</li> <li>Partner-private workflows or client-specific UI.</li> </ul> <h2 class="neo-h2" data-record-id="10">Avoided Traps / Gold Standards Rejected</h2><ul> <li><strong>Static one-shot widget:</strong> rejected. H2 must show that the widget remains live-mutable after creation.</li> <li><strong>Arbitrary code generation/editing:</strong> rejected. The first edit path uses a bounded grammar over known widget state.</li> <li><strong>Full Neural Link developer surface in the harness:</strong> rejected. Harness-embedded mutation must not imply admin capability.</li> <li><strong>Persistence bundled too early:</strong> rejected. Runtime edit and durable write-through are different boundaries.</li> <li><strong>Duplicate Electron support:</strong> rejected. neomjs/neo#13033 remains the canonical Electron shell/build-root lane.</li> </ul> <h2 class="neo-h2" data-record-id="11">Related</h2><p>Parent: neomjs/neo#13349. Grandparent: neomjs/neo-agent-brain#144. Blocked by neomjs/neo#13357. Prerequisite chain: neomjs/neo#13357 depends on neomjs/neo#13355, which depends on neomjs/neo#13353 / PR neomjs/neo#13354. Sibling lane: neomjs/neo#13033 remains the Electron shell/build-root lane. ADR: <code>learn/agentos/decisions/0020-agent-harness-concept.md</code>.</p> <h2 class="neo-h2" data-record-id="12">Duplicate / Claim Sweep</h2><p>Live latest-open sweep: checked the latest 20 open issues immediately before creation on 2026-06-15T15:55:04Z. Relevant results were neomjs/neo#13349, neomjs/neo#13353, neomjs/neo#13355, neomjs/neo#13357, neomjs/neo-agent-brain#144, neomjs/neo#13033, neomjs/neo-agent-brain#143, neomjs/neo#13221, neomjs/neo#13287, and unrelated backlog issues; no equivalent first-widget live-edit / mutation child leaf was present.</p> <p>Targeted live GitHub searches: <code>"first-widget live edit"</code>, <code>"first-widget mutation"</code>, and <code>"H2 widget edit"</code> returned no open duplicate.</p> <p>A2A in-flight sweep: native <code>list_messages</code> / <code>add_message</code> tools are not exposed in this Codex Desktop surface (<code>tool_search</code> returned 0 this turn). I could not inspect private in-flight A2A claims from this harness. Public GitHub issue/PR state and repo content were checked immediately before filing, and no public duplicate or collision was visible.</p> <p>Semantic KB sweep: <code>ask_knowledge_base(query='Agent Harness H2 first widget live mutation edit path blueprint chat intake persistence write-through', type='all')</code> surfaced ADR 0020, Neural Link, and HarnessDockZoneModel context; it confirmed live mutation/edit and persistence/write-through are distinct H2 boundaries.</p> <p>Exact repo/content sweep: <code>rg "first-widget live edit|first widget live edit|follow-up edit|widget edit command|live widget mutation|H2 widget edit" resources/content/issues resources/content/discussions .agents/workflows learn apps/agentos -n</code> returned no existing child ticket.</p> <p>Origin Session ID: 019ec8a7-1f8e-75a3-b223-fe59cc444776</p> <p>Retrieval Hint: "Agent Harness H2 first-widget live edit bounded follow-up request mutation blueprint reuse no persistence no write-through"</p> </div> </div> </div></div></article></div><nav class="content-bottom-toolbar neo-toolbar neo-layout-grid" id="neo-toolbar-2" data-ref="toolbar"><button class="content-bottom-toolbar-previous neo-button neo-button-secondary icon-left" id="neo-button-10" type="button" data-ref="prev-page-button"><span class="neo-button-glyph fa fa-chevron-left" id="neo-ssr-vnode-88"></span><span class="neo-button-text" id="neo-ssr-vnode-89">13362</span></button><button class="content-bottom-toolbar-next neo-button neo-button-secondary icon-right" id="neo-button-11" type="button" data-ref="next-page-button"><span class="neo-button-glyph fa fa-chevron-right" id="neo-ssr-vnode-93"></span><span class="neo-button-text" id="neo-ssr-vnode-94">13359</span></button></nav></div><aside style="flex:1 1 0%;" class="neo-app-content-sections-container neo-container neo-flex-container neo-flex-direction-column neo-flex-wrap-nowrap" id="neo-container-8" data-ref="page-sections-container"><button style="flex:0 1 auto;" class="sections-container-button neo-button no-text neo-button-secondary icon-left" id="neo-button-12" type="button"><span class="neo-button-glyph fas fa-bars" id="neo-ssr-vnode-98"></span></button><div style="flex:0 1 auto;" id="neo-component-2"><h3 id="neo-ssr-vnode-103">On this page</h3></div><ul style="flex:0 1 auto;" class="neo-app-content-sections-list neo-app-content-tree-list neo-list" id="neo-list-1" data-ref="list"><li class="neo-list-item neo-body" id="neo-list-1__neo-record-2233" aria-selected="false" tabIndex="-1"><img class="neo-list-icon avatar" id="neo-ssr-vnode-6401" src="https://github.com/neo-gpt.png?size=40"><span id="neo-ssr-vnode-6402">Description</span></li></ul></aside></div></div></div></div></div> </body> </html>