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
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 #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 #13354), visible transcript / accepted-blueprint evidence (#13355), and safe first-widget request intake (#13357).

ADR 0020 and #13012 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; #13012 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 #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 #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 <a href="#/news/tickets/13353">#13353</a> 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 <a href="#/news/tickets/13355">#13355</a>.</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><a href="#/news/tickets/13349">#13349</a>, ADR 0020, <a href="#/news/tickets/13357">#13357</a></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><a href="#/news/tickets/13353">#13353</a> 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><a href="#/news/tickets/13064">#13064</a>, 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><a href="#/news/tickets/13355">#13355</a> 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 <a href="#/news/tickets/13357">#13357</a>'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 <a href="#/news/tickets/13353">#13353</a> 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 <a href="#/news/tickets/13355">#13355</a> 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 <a href="#/news/tickets/13056">#13056</a> / <a href="#/news/tickets/13221">#13221</a>-adjacent lanes.</li> <li>Electron shell/build-root work; that remains <a href="#/news/tickets/13033">#13033</a>.</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. <a href="#/news/tickets/13033">#13033</a> remains the canonical Electron shell/build-root lane.</li> </ul> <h2 class="neo-h2" data-record-id="11">Related</h2><p>Parent: <a href="#/news/tickets/13349">#13349</a>. Grandparent: <a href="#/news/tickets/13012">#13012</a>. Blocked by <a href="#/news/tickets/13357">#13357</a>. Prerequisite chain: <a href="#/news/tickets/13357">#13357</a> depends on <a href="#/news/tickets/13355">#13355</a>, which depends on <a href="#/news/tickets/13353">#13353</a> / PR <a href="#/news/tickets/13354">#13354</a>. Sibling lane: <a href="#/news/tickets/13033">#13033</a> 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 <a href="#/news/tickets/13349">#13349</a>, <a href="#/news/tickets/13353">#13353</a>, <a href="#/news/tickets/13355">#13355</a>, <a href="#/news/tickets/13357">#13357</a>, <a href="#/news/tickets/13012">#13012</a>, <a href="#/news/tickets/13033">#13033</a>, <a href="#/news/tickets/13056">#13056</a>, <a href="#/news/tickets/13221">#13221</a>, <a href="#/news/tickets/13287">#13287</a>, 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 id="timeline-13361-1" class="neo-timeline-item event" data-record-id="timeline-13361-1"> <div id="timeline-13361-1-target" class="neo-timeline-badge" ><i class="fa-solid fa-link"></i></div> <div class="neo-timeline-body"> <a class="neo-timeline-user" href="https://github.com/tobiu" target="_blank">tobiu</a> referenced in commit <code><a href="https://github.com/neomjs/neo/commit/b759ab1" target="_blank">b759ab1</a></code> - "feat(agentos): live-mutate the first widget via bounded follow-up edits (#13361) (#13451) <span class="neo-timeline-date">on Jun 17, 2026, 1:10 PM</span> </div> </div> <div id="timeline-13361-2" class="neo-timeline-item event" data-record-id="timeline-13361-2"> <div id="timeline-13361-2-target" class="neo-timeline-badge" style="color: #8250df"><i class="fa-solid fa-circle-check"></i></div> <div class="neo-timeline-body"> <a class="neo-timeline-user" href="https://github.com/tobiu" target="_blank">tobiu</a> closed this issue <span class="neo-timeline-date">on Jun 17, 2026, 1:10 PM</span> </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-4383" aria-selected="false" tabIndex="-1"><img class="neo-list-icon avatar" id="neo-ssr-vnode-6321" src="https://github.com/neo-gpt.png?size=40"><span id="neo-ssr-vnode-6322">Description</span></li><li class="neo-list-item neo-event" id="neo-list-1__neo-record-4384" aria-selected="false" tabIndex="-1"><i class="neo-list-icon fa-solid fa-link" id="neo-ssr-vnode-6323"></i><span id="neo-ssr-vnode-6324">Referenced (tobiu)</span></li><li class="neo-list-item neo-event" id="neo-list-1__neo-record-4385" aria-selected="false" tabIndex="-1"><i class="neo-list-icon fa-solid fa-circle-check" id="neo-ssr-vnode-6325"></i><span id="neo-ssr-vnode-6326">Closed (tobiu)</span></li></ul></aside></div></div></div></div></div> </body> </html>