Summary
Point ships 39 real automated tests for agent repair — not marketing screenshots. They live in the Point repository and run on every bun test. This page is the hub for the proof report, interactive comparison, and optional frontier-model benchmarks.
- 35 single-shot fixtures (typo fixes + feature-build wiring bugs)
- 4 repair-plan loop (check → fix → check again, CI only)
- 9 feature-build scenarios simulating AI auto-coding scaffolds
Executable proof report
Generated May 22, 2026, 3:14 AM from bun run proof:agent-repair in the Point repo. CI layers run without an LLM; live model runs use real APIs and verify with point check.
- CI verifiedCI: check-json sufficiency (single-shot agent loop, no LLM)pass
13 fixtures · real check-json → golden line → point check
- CI verifiedCI: repair-plan loop (check → fix → check again, no LLM)pass
1 multistep fixture(s) · simulates rushed auto-coding scaffold
- CI verifiedMeasured: check-json context size per fixturepass
unknown-field-rule: 1051 chars (~263 tok); label-unknown-field: 813 chars (~203 tok); calc-unknown-field: 907 chars (~227 tok); rule-stock-unknown-field: 936 chars (~234 tok); rule-user-unknown-field: 809 chars (~202 tok); missing-await: 747 chars (~187 tok); arity-mismatch: 755 chars (~189 tok); operator-type-mismatch: 672 chars (~168 tok); feature-dashboard-load: 963 chars (~241 tok); feature-pipeline-await: 807 chars (~202 tok); feature-notes-crud: 789 chars (~197 tok); feature-nav-routes: 849 chars (~212 tok); feature-guard-policy: 784 chars (~196 tok)
- EstimatedCompared: Point check-json vs illustrative TS paste heuristicpass
79–93% less context (avg 87%). TS paste sizes are heuristics, not logged agent traces.
- CI verifiedCI: multistep golden repairpass
feature-multistep-launch: 2/2 steps
- Live modelLive: frontier models — real API, point check verifierpass
78/78 runs pass point check · Point workflow 100% · TS workflow 100%
Model benchmark covers 13 single-shot fixtures only. The repair-plan loop is CI-only (1 fixture).
Reproduce: bun run proof:agent-repair
Full app benchmarks
Real multi-block Point apps (~84–105 lines) paired with a Next.js admin scaffold in benchmarks/next-dashboard/. Same product tasks — add search, fix wiring — compared side by side. TypeScript context size is measured from real scaffold files, not a char-count guess.
Dashboard — add search page
Add a /search page to the existing dashboard app: nav link, search action, search view with load data, and page wired into navigation.
- Point app
- 84 → 105 lines (+21)
- Point context
- ~203 tok check-json
- Measured Next scaffold
- ~1,093 tok
- Saved
- 81%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View search panel loads unknown action search items",
"path": "view.search panel",
"ref": "point://semantic/DashboardApp/view.search panel",
"severity": "error",
"span": {
"start": {
"line": 52,
"column": 1,
"offset": 1452
},
"end": {
"line": 52,
"column": 37,
"offset": 1488
}
},
"expected": [
"fetch items"
],
"actual": "search items",
"repair": "Declare action search items or fix the load data from action name.",
"relatedRefs": [
"point://semantic/DashboardApp/view.search panel"
]
}
]
}Next.js — measured next scaffold
Add a Search page to an existing Next.js admin app with sidebar nav, items list, and settings — new route, page component, data loader, and nav link.
Missing in broken scaffold: lib/searchItems.ts
// app/admin/layout.tsx
import { AdminNav } from "../../components/AdminNav";
export default function AdminLayout({ children }: { children: React.ReactNode }) {
return (
<div className="admin-shell">
<aside>
<AdminNav />
</aside>
<main>{children}</main>
</div>
);
}
// app/admin/settings/page.tsx
import { SettingsForm } from "../../../components/SettingsForm";
const defaultSettings = {
workspaceName: "Acme",
notificationsEnabled: true,
theme: "light",
};
export default function SettingsPage() {
return (
<section>
<h1>Settings</h1>
<p>Manage workspace preferences</p>
<SettingsForm settings={defaultSettings} onSettingsChange={() => undefined} />
</section>
);
}
// app/admin/items/page.tsx
import { ItemsList } from "../../../components/ItemsList";
import { fetchItems } from "../../../lib/items";
export default async function ItemsPage() {
const items = await fetchItems();
return (
<section>
<h1>Items</h1>
<p>Browse tracked items</p>
<ItemsList items={items} />
</section>
);
}
// app/admin/items/[id]/page.tsx
import { ItemDetail } from "../../../../components/ItemDetail";
exOld illustrative paste heuristic was ~5,500 tok — 80% larger than measured scaffold.
Point base → broken → golden
Base app
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Broken (agent mistake)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
link "Search" to "/search"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
view search panel
load data from action search items
when loading render "Searching..."
when error render "Search failed"
render "Search results"
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
page search page
layout app shell
title "Search"
description "Find items by title"
main render search panel()
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
path "/search" page search page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Golden (target)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
link "Search" to "/search"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
action search items
input query: Text
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
view search panel
load data from action search items
when loading render "Searching..."
when error render "Search failed"
when empty render "No matches"
each item in data render item.title
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
page search page
layout app shell
title "Search"
description "Find items by title"
main render search panel()
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
path "/search" page search page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Dashboard — wire search action
Fix the search panel wiring in a 100-line dashboard app — the page and nav exist but the view loads the wrong action name.
- Point app
- 105 → 105 lines (+0)
- Point context
- ~208 tok check-json
- Measured Next scaffold
- ~501 tok
- Saved
- 58%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View search panel loads unknown action search item",
"path": "view.search panel",
"ref": "point://semantic/DashboardApp/view.search panel",
"severity": "error",
"span": {
"start": {
"line": 58,
"column": 1,
"offset": 1559
},
"end": {
"line": 58,
"column": 36,
"offset": 1594
}
},
"expected": [
"fetch items",
"search items"
],
"actual": "search item",
"repair": "Declare action search item or fix the load data from action name.",
"relatedRefs": [
"point://semantic/DashboardApp/view.search panel"
]
}
]
}Next.js — measured next scaffold
Fix a SearchPage component that calls the wrong loader function in a Next.js admin app with sidebar, items CRUD, and settings.
// app/admin/layout.tsx
import { AdminNav } from "../../components/AdminNav";
export default function AdminLayout({ children }: { children: React.ReactNode }) {
return (
<div className="admin-shell">
<aside>
<AdminNav />
</aside>
<main>{children}</main>
</div>
);
}
// app/admin/search/page.tsx
import { SearchPanel } from "../../../components/SearchPanel";
export default async function SearchPage() {
return (
<section>
<h1>Search</h1>
<p>Find items by title</p>
<SearchPanel />
</section>
);
}
// components/AdminNav.tsx
import Link from "next/link";
const links = [
{ href: "/admin/settings", label: "Settings" },
{ href: "/admin/items", label: "Items" },
{ href: "/admin/search", label: "Search" },
];
export function AdminNav() {
return (
<nav className="admin-nav">
{links.map((link) => (
<Link key={link.href} href={link.href}>
{link.label}
</Link>
))}
<span>Dashboard</span>
</nav>
);
}
// components/SearchPanel.tsx
import { searchItem } from "../lib/searchItems";
export async function SearchPanel() {
const items = await searchItem("");
return <pOld illustrative paste heuristic was ~6,000 tok — 92% larger than measured scaffold.
Point base → broken → golden
Base app
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
link "Search" to "/search"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
action search items
input query: Text
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
view search panel
load data from action search items
when loading render "Searching..."
when error render "Search failed"
when empty render "No matches"
each item in data render item.title
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
page search page
layout app shell
title "Search"
description "Find items by title"
main render search panel()
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
path "/search" page search page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Broken (agent mistake)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
link "Search" to "/search"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
action search items
input query: Text
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
view search panel
load data from action search item
when loading render "Searching..."
when error render "Search failed"
render "Search results"
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
page search page
layout app shell
title "Search"
description "Find items by title"
main render search panel()
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
path "/search" page search page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Golden (target)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
link "Search" to "/search"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
action search items
input query: Text
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
view search panel
load data from action search items
when loading render "Searching..."
when error render "Search failed"
when empty render "No matches"
each item in data render item.title
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
page search page
layout app shell
title "Search"
description "Find items by title"
main render search panel()
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
path "/search" page search page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Notes — add detail page
Add a /notes/:id detail page to the notes app: get-note action, detail view, list links, and route wired into navigation.
- Point app
- 74 → 92 lines (+18)
- Point context
- ~202 tok check-json
- Measured Next scaffold
- ~820 tok
- Saved
- 75%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View note detail loads unknown action get note",
"path": "view.note detail",
"ref": "point://semantic/NotesApp/view.note detail",
"severity": "error",
"span": {
"start": {
"line": 41,
"column": 1,
"offset": 888
},
"end": {
"line": 41,
"column": 33,
"offset": 920
}
},
"expected": [
"create note",
"list notes"
],
"actual": "get note",
"repair": "Declare action get note or fix the load data from action name.",
"relatedRefs": [
"point://semantic/NotesApp/view.note detail"
]
}
]
}Next.js — measured next scaffold
Add a note detail route to a Next.js notes app with list, create form, and sidebar nav — new dynamic route, loader, and list links.
Missing in broken scaffold: lib/getNote.ts
// app/notes/layout.tsx
import { NotesNav } from "../../components/NotesNav";
export default function NotesLayout({ children }: { children: React.ReactNode }) {
return (
<div>
<aside>
<NotesNav />
</aside>
<main>{children}</main>
</div>
);
}
// app/notes/page.tsx
import { NotesList } from "../../../components/NotesList";
import { listNotes } from "../../../lib/notes";
export default async function NotesPage() {
const notes = await listNotes();
return (
<section>
<h1>Notes</h1>
<NotesList notes={notes} />
</section>
);
}
// app/notes/new/page.tsx
import { NoteCreateForm } from "../../../components/NoteCreateForm";
const draft = { title: "", body: "" };
export default function NewNotePage() {
return (
<section>
<h1>New note</h1>
<NoteCreateForm draft={draft} onDraftChange={() => undefined} />
</section>
);
}
// app/notes/[id]/page.tsx
import { NoteDetail } from "../../../components/NoteDetail";
export default async function NoteDetailPage({ params }: { params: { id: string } }) {
return (
<section>
<h1>Note detail</h1>
<NoteDetail id={params.id} />
</section>
);
}
Old illustrative paste heuristic was ~4,500 tok — 82% larger than measured scaffold.
Point base → broken → golden
Base app
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
render "Notes"
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Broken (agent mistake)
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
each note in data render link note.title to "/notes/" + note.id
view note detail
input id: Text
load data from action get note
when loading render "Loading note..."
when error render "Could not load note"
render "Note detail"
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
page note detail page
layout notes shell
input id: Text
title "Note detail"
description "Read a saved note"
main render note detail(id)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
path "/notes/:id" page note detail page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Golden (target)
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
action get note
input id: Text
output note: Note
touches none
return { id: id, title: "Note " + id, body: "Detail for " + id }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
each note in data render link note.title to "/notes/" + note.id
view note detail
input id: Text
render "Note detail for " + id
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
page note detail page
layout notes shell
input id: Text
title "Note detail"
description "Read a saved note"
main render note detail(id)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
path "/notes/:id" page note detail page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Dashboard — rename items to products
Rename the dashboard items surface to products across actions, views, pages, and navigation — the agent updated nav and action names but left stale view wiring.
- Point app
- 84 → 84 lines (+0)
- Point context
- ~201 tok check-json
- Measured Next scaffold
- ~479 tok
- Saved
- 58%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View items list loads unknown action fetch items",
"path": "view.items list",
"ref": "point://semantic/DashboardApp/view.items list",
"severity": "error",
"span": {
"start": {
"line": 39,
"column": 1,
"offset": 1073
},
"end": {
"line": 39,
"column": 36,
"offset": 1108
}
},
"expected": [
"list products"
],
"actual": "fetch items",
"repair": "Declare action fetch items or fix the load data from action name.",
"relatedRefs": [
"point://semantic/DashboardApp/view.items list"
]
}
]
}Next.js — measured next scaffold
Finish renaming an admin Items area to Products in a Next.js app — update list component imports, loader names, and page wiring.
// app/admin/layout.tsx
import { AdminNav } from "../../components/AdminNav";
export default function AdminLayout({ children }: { children: React.ReactNode }) {
return (
<div className="admin-shell">
<aside>
<AdminNav />
</aside>
<main>{children}</main>
</div>
);
}
// app/admin/settings/page.tsx
import { SettingsForm } from "../../../components/SettingsForm";
const defaultSettings = {
workspaceName: "Acme",
notificationsEnabled: true,
theme: "light",
};
export default function SettingsPage() {
return (
<section>
<h1>Settings</h1>
<p>Manage workspace preferences</p>
<SettingsForm settings={defaultSettings} onSettingsChange={() => undefined} />
</section>
);
}
// app/admin/products/page.tsx
import { ProductsList } from "../../../components/ProductsList";
export default async function ProductsPage() {
return (
<section>
<h1>Products</h1>
<ProductsList />
</section>
);
}
// components/AdminNav.tsx
import Link from "next/link";
const links = [
{ href: "/admin/settings", label: "Settings" },
{ href: "/admin/products", label: "Products" },
];
export function AdminNav() {
returnOld illustrative paste heuristic was ~5,000 tok — 90% larger than measured scaffold.
Point base → broken → golden
Base app
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Item
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Items" to "/items"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample items
output items: List<Item>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action fetch items
output items: List<Item>
touches none
return sample items()
view items list
load data from action fetch items
when loading render "Loading items..."
when error render "Could not load items"
when empty render "No items yet"
each item in data render link item.title to "/items/" + item.id
view item detail
input id: Text
modal "Item actions" when id != "" render "Manage actions for " + id
render "Item detail for " + id
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page items list page
layout app shell
title "Items"
description "Browse tracked items"
main render items list()
page item detail page
layout app shell
input id: Text
title "Item Detail"
description "Inspect a single item"
main render item detail(id)
navigation dashboard app
path "/settings" page settings page
path "/items" page items list page
path "/items/:id" page item detail page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Broken (agent mistake)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Product
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Products" to "/products"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample products
output products: List<Product>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action list products
output products: List<Product>
touches none
return sample products()
view items list
load data from action fetch items
when loading render "Loading products..."
when error render "Could not load products"
render "Products"
view product detail
input id: Text
modal "Product actions" when id != "" render "Manage actions for " + id
render "Product detail for " + id
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page products list page
layout app shell
title "Products"
description "Browse tracked products"
main render items list()
page product detail page
layout app shell
input id: Text
title "Product Detail"
description "Inspect a single product"
main render product detail(id)
navigation dashboard app
path "/settings" page settings page
path "/products" page products list page
path "/products/:id" page product detail page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Golden (target)
module DashboardApp
record WorkspaceSettings
workspace name: Text
notifications enabled: Bool
theme: Text
record Product
id: Text
title: Text
view dashboard nav
link "Settings" to "/settings"
link "Products" to "/products"
render "Dashboard"
view settings form
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
on change call on settings change
form
bind field "Workspace name" to settings.workspace name
bind checkbox "Email notifications" to settings.notifications enabled
tabs
tab "General" render "Theme: " + settings.theme
tab "Advanced" render "Notification settings apply workspace-wide"
modal "Notifications enabled" when settings.notifications enabled render "Email alerts are active for this workspace"
calculation sample products
output products: List<Product>
return [{ id: "alpha", title: "Alpha" }, { id: "beta", title: "Beta" }, { id: "gamma", title: "Gamma" }]
action list products
output products: List<Product>
touches none
return sample products()
view products list
load data from action list products
when loading render "Loading products..."
when error render "Could not load products"
when empty render "No products yet"
each product in data render link product.title to "/products/" + product.id
view product detail
input id: Text
modal "Product actions" when id != "" render "Manage actions for " + id
render "Product detail for " + id
layout app shell
slot sidebar render dashboard nav()
slot main render "Select a page from the sidebar"
page settings page
layout app shell
input settings: WorkspaceSettings
input on settings change: Handler<WorkspaceSettings>
title "Settings"
description "Manage workspace preferences"
main render settings form(settings, on settings change)
page products list page
layout app shell
title "Products"
description "Browse tracked products"
main render products list()
page product detail page
layout app shell
input id: Text
title "Product Detail"
description "Inspect a single product"
main render product detail(id)
navigation dashboard app
path "/settings" page settings page
path "/products" page products list page
path "/products/:id" page product detail page
bootstrap router
command dashboard demo
output result: Text
return "Dashboard navigation ready"
Ops — add chart + datagrid + enqueue form
Upgrade a simple ops job list into a full dashboard: combined load action, bar chart, datagrid with sort/filter/pagination, enqueue form with toast + submit, and /enqueue page in navigation.
- Point app
- 41 → 79 lines (+38)
- Point context
- ~210 tok check-json
- TS heuristic
- ~6,500 tok
- Saved
- 97%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View ops dashboard loads unknown action fetch ops panel",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 42,
"column": 1,
"offset": 899
},
"end": {
"line": 42,
"column": 40,
"offset": 938
}
},
"expected": [
"fetch ops dashboard",
"list jobs"
],
"actual": "fetch ops panel",
"repair": "Declare action fetch ops panel or fix the load data from action name.",
"relatedRefs": [
"point://semantic/OpsApp/view.ops dashboard"
]
}
]
}Next.js — ts heuristic
Add a React ops dashboard with bar chart, sortable/filterable data grid, paginated rows, and an enqueue form with toast feedback — new loader action, pages, and nav links.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
view ops nav
link "Dashboard" to "/"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
view jobs list
load data from action list jobs
when loading render "Loading jobs..."
when error render "Could not load jobs"
when empty render "No jobs yet"
each job in data render job.name + " — " + job.status
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Job status overview"
main render jobs list()
navigation ops app
path "/" page dashboard page
bootstrap router
command ops demo
output result: Text
return "Ops list ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view jobs list
load data from action list jobs
when loading render "Loading jobs..."
when error render "Could not load jobs"
when empty render "No jobs yet"
each job in data render job.name + " — " + job.status
view ops dashboard
load data from action fetch ops panel
when loading render "Loading dashboard..."
when error render "Dashboard failed"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard scaffold ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Metrics — add SSE live feed
Wire a push metrics dashboard: stream action, sse route with event record, subscribe view with connecting/disconnected guards, and home page rendering the live feed.
- Point app
- 24 → 47 lines (+23)
- Point context
- ~178 tok check-json
- TS heuristic
- ~4,000 tok
- Saved
- 96%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-sse-subscribe-route",
"message": "Unknown sse route metric ticks in subscribe to sse metric ticks",
"path": "view.live pulse feed",
"ref": "point://semantic/MetricsApp/view.live pulse feed",
"severity": "error",
"span": {
"start": {
"line": 21,
"column": 1,
"offset": 573
},
"end": {
"line": 21,
"column": 32,
"offset": 604
}
},
"repair": "Declare sse route metric ticks or fix the subscribe to sse name.",
"expected": [
"metric pulses"
]
}
]
}Next.js — ts heuristic
Add server-sent events to a Next.js metrics shell — EventSource client, stream handler route, connecting/error UI states, and home page wiring.
Point base → broken → golden
Base app
module MetricsApp view metrics nav link "Home" to "/" render "Metrics" layout metrics shell slot sidebar render metrics nav() slot main render "Metrics" page home page layout metrics shell title "Metrics" description "Static placeholder until live feed is wired" main render "Add an SSE push feed next" navigation metrics app path "/" page home page bootstrap router command metrics demo output result: Text return "Metrics shell ready"
Broken (agent mistake)
module MetricsApp
external point std process
stream lines raw(command: Text, args: List<Text>, env: List<Text>): Text from "@hatchingpoint/point/std/process" as processStreamLines
record Metric Pulse
value: Text
action stream metric pulses
output line: Text
touches process
yield stream lines raw("sh", ["-c", "i=0; while [ $i -lt 6 ]; do echo pulse-$i; i=$((i+1)); sleep 0.1; done"], [])
sse route metric pulses
path "/sse/metrics"
event Metric Pulse
on connect stream from action stream metric pulses
on disconnect return none
view live pulse feed
subscribe to sse metric ticks
when connecting render muted "Connecting to SSE feed…"
when disconnected render danger "Feed ended"
each pulse in messages render pulse.value
view metrics nav
link "Home" to "/"
render "Metrics"
layout metrics shell
slot sidebar render metrics nav()
slot main render "Metrics"
page home page
layout metrics shell
title "Metrics"
description "Live SSE push feed"
main render live pulse feed()
navigation metrics app
path "/" page home page
bootstrap router
command metrics demo
output result: Text
return "SSE metrics feed ready at /sse/metrics"
Golden (target)
module MetricsApp
external point std process
stream lines raw(command: Text, args: List<Text>, env: List<Text>): Text from "@hatchingpoint/point/std/process" as processStreamLines
record Metric Pulse
value: Text
action stream metric pulses
output line: Text
touches process
yield stream lines raw("sh", ["-c", "i=0; while [ $i -lt 6 ]; do echo pulse-$i; i=$((i+1)); sleep 0.1; done"], [])
sse route metric pulses
path "/sse/metrics"
event Metric Pulse
on connect stream from action stream metric pulses
on disconnect return none
view live pulse feed
subscribe to sse metric pulses
when connecting render muted "Connecting to SSE feed…"
when disconnected render danger "Feed ended"
each pulse in messages render pulse.value
view metrics nav
link "Home" to "/"
render "Metrics"
layout metrics shell
slot sidebar render metrics nav()
slot main render "Metrics"
page home page
layout metrics shell
title "Metrics"
description "Live SSE push feed"
main render live pulse feed()
navigation metrics app
path "/" page home page
bootstrap router
command metrics demo
output result: Text
return "SSE metrics feed ready at /sse/metrics"
Ops — fix chart label field on dashboard
Fix the ops dashboard chart wiring — the bar chart uses label field title but Job Metric records expose label and value.
- Point app
- 79 → 79 lines (+0)
- Point context
- ~166 tok check-json
- TS heuristic
- ~6,000 tok
- Saved
- 97%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "invalid-chart-field",
"message": "View ops dashboard chart label field \"title\" is not on JobMetric",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 40,
"column": 1,
"offset": 871
},
"end": {
"line": 40,
"column": 66,
"offset": 936
}
},
"repair": "Use label field label.",
"expected": [
"label",
"value"
]
}
]
}Next.js — ts heuristic
Fix MetricsChart dataKey in a Next.js ops dashboard — chart expects label field but component passes title from Metric type.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field title value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Ops — fix datagrid sort column on dashboard
Fix the ops dashboard datagrid sort column — sort by title but columns are name, status, and score.
- Point app
- 79 → 79 lines (+0)
- Point context
- ~180 tok check-json
- TS heuristic
- ~6,000 tok
- Saved
- 97%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "invalid-datagrid-sort-column",
"message": "View ops dashboard datagrid sort by column must appear in columns list",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 41,
"column": 1,
"offset": 937
},
"end": {
"line": 41,
"column": 97,
"offset": 1033
}
},
"repair": "Add title to the columns list or fix sort by.",
"expected": [
"name",
"status",
"score"
]
}
]
}Next.js — ts heuristic
Fix JobsGrid sortBy in a Next.js ops dashboard — datagrid columns are name/status/score but sort uses title.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by title filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Ops — fix datagrid filter column on dashboard
Fix the ops dashboard datagrid filter column — filter by title but columns are name, status, and score.
- Point app
- 79 → 79 lines (+0)
- Point context
- ~181 tok check-json
- TS heuristic
- ~6,000 tok
- Saved
- 97%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "invalid-datagrid-filter-column",
"message": "View ops dashboard datagrid filter by column must appear in columns list",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 41,
"column": 1,
"offset": 937
},
"end": {
"line": 41,
"column": 98,
"offset": 1034
}
},
"repair": "Add title to the columns list or fix filter by.",
"expected": [
"name",
"status",
"score"
]
}
]
}Next.js — ts heuristic
Fix JobsGrid filterColumn in a Next.js ops dashboard — datagrid columns are name/status/score but filter uses title.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by title page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Ops — fix datagrid page size on dashboard
Fix the ops dashboard datagrid page size — page size 0 must be a positive integer.
- Point app
- 79 → 79 lines (+0)
- Point context
- ~163 tok check-json
- TS heuristic
- ~6,000 tok
- Saved
- 97%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "invalid-datagrid-page-size",
"message": "View ops dashboard datagrid page size must be a positive integer",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 41,
"column": 1,
"offset": 937
},
"end": {
"line": 41,
"column": 97,
"offset": 1033
}
},
"repair": "Use page size 10 or another positive number.",
"expected": 10
}
]
}Next.js — ts heuristic
Fix JobsGrid pageSize in a Next.js ops dashboard — pagination size must be greater than zero.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 0
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Ops — wire load data before live refresh
Fix the ops dashboard live refresh wiring — refresh every is present but load data from action is missing.
- Point app
- 79 → 79 lines (+0)
- Point context
- ~235 tok check-json
- TS heuristic
- ~6,000 tok
- Saved
- 96%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "refresh-without-load",
"message": "View ops dashboard uses refresh every without load data from action, on mount call, or load data from fetch",
"path": "view.ops dashboard",
"ref": "point://semantic/OpsApp/view.ops dashboard",
"severity": "error",
"span": {
"start": {
"line": 35,
"column": 1,
"offset": 677
},
"end": {
"line": 35,
"column": 27,
"offset": 703
}
},
"expected": [
"load data from action fetch ops dashboard",
"load data from action list jobs"
],
"repair": "Add load data from action <name> (or on mount call, or load data from fetch GET ...) before refresh every.",
"relatedRefs": [
"point://semantic/OpsApp/view.ops dashboard"
]
}
]
}Next.js — ts heuristic
Fix live dashboard polling in a Next.js ops app — setInterval refresh exists but data loader hook is missing.
Point base → broken → golden
Base app
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Broken (agent mistake)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
render "Jobs dashboard"
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Golden (target)
module OpsApp
record Job Row
name: Text
status: Text
score: Int
record Job Metric
label: Text
value: Int
record Ops Dashboard
jobs: List<Job Row>
metrics: List<Job Metric>
record Enqueue Body
name: Text
view ops nav
link "Dashboard" to "/"
link "Enqueue" to "/enqueue"
render "Ops"
action list jobs
output jobs: List<Job Row>
touches none
return [{ name: "sync", status: "ok", score: 95 }, { name: "import", status: "warn", score: 72 }]
action fetch ops dashboard
output dashboard: Ops Dashboard
touches none
return { jobs: await list jobs(), metrics: [{ label: "Jobs", value: 12 }, { label: "Errors", value: 3 }] }
view ops dashboard
load data from action fetch ops dashboard
refresh every 15 seconds
when loading render "Loading dashboard..."
when error render "Dashboard failed"
when empty render "No jobs in queue"
chart bar from data.metrics label field label value field value
datagrid row in data.jobs columns name, status, score sort by score filter by name page size 6
view enqueue job form
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
on change call on draft change
form
bind field "Job name" to draft.name
toast on success "Job enqueued"
toast on error "Enqueue failed"
submit "Enqueue" POST "/api/jobs" body draft then navigate "/"
layout ops shell
slot sidebar render ops nav()
slot main render "Ops console"
page dashboard page
layout ops shell
title "Ops dashboard"
description "Chart + datagrid overview"
main render ops dashboard()
page enqueue page
layout ops shell
input draft: Enqueue Body
input on draft change: Handler<Enqueue Body>
title "Enqueue"
description "Add a job to the queue"
main render enqueue job form(draft, on draft change)
navigation ops app
path "/" page dashboard page
path "/enqueue" page enqueue page
bootstrap router
command ops demo
output result: Text
return "Ops dashboard ready"
Notes — wire detail page load action
Fix the note detail view load wiring — the view calls fetch note but the action is named get note.
- Point app
- 92 → 95 lines (+3)
- Point context
- ~209 tok check-json
- Measured Next scaffold
- ~820 tok
- Saved
- 75%
Point — agent sees check-json
{
"schemaVersion": "point.core.check.v1",
"ok": false,
"diagnostics": [
{
"code": "unknown-load-action",
"message": "View note detail loads unknown action fetch note",
"path": "view.note detail",
"ref": "point://semantic/NotesApp/view.note detail",
"severity": "error",
"span": {
"start": {
"line": 47,
"column": 1,
"offset": 1024
},
"end": {
"line": 47,
"column": 35,
"offset": 1058
}
},
"expected": [
"create note",
"get note",
"list notes"
],
"actual": "fetch note",
"repair": "Declare action fetch note or fix the load data from action name.",
"relatedRefs": [
"point://semantic/NotesApp/view.note detail"
]
}
]
}Next.js — measured next scaffold
Fix NoteDetail loader in a Next.js notes app — component imports fetchNote but action is getNote.
Missing in broken scaffold: lib/getNote.ts
// app/notes/layout.tsx
import { NotesNav } from "../../components/NotesNav";
export default function NotesLayout({ children }: { children: React.ReactNode }) {
return (
<div>
<aside>
<NotesNav />
</aside>
<main>{children}</main>
</div>
);
}
// app/notes/page.tsx
import { NotesList } from "../../../components/NotesList";
import { listNotes } from "../../../lib/notes";
export default async function NotesPage() {
const notes = await listNotes();
return (
<section>
<h1>Notes</h1>
<NotesList notes={notes} />
</section>
);
}
// app/notes/new/page.tsx
import { NoteCreateForm } from "../../../components/NoteCreateForm";
const draft = { title: "", body: "" };
export default function NewNotePage() {
return (
<section>
<h1>New note</h1>
<NoteCreateForm draft={draft} onDraftChange={() => undefined} />
</section>
);
}
// app/notes/[id]/page.tsx
import { NoteDetail } from "../../../components/NoteDetail";
export default async function NoteDetailPage({ params }: { params: { id: string } }) {
return (
<section>
<h1>Note detail</h1>
<NoteDetail id={params.id} />
</section>
);
}
Old illustrative paste heuristic was ~4,500 tok — 82% larger than measured scaffold.
Point base → broken → golden
Base app
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
action get note
input id: Text
output note: Note
touches none
return { id: id, title: "Note " + id, body: "Detail for " + id }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
each note in data render link note.title to "/notes/" + note.id
view note detail
input id: Text
render "Note detail for " + id
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
page note detail page
layout notes shell
input id: Text
title "Note detail"
description "Read a saved note"
main render note detail(id)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
path "/notes/:id" page note detail page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Broken (agent mistake)
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
action get note
input id: Text
output note: Note
touches none
return { id: id, title: "Note " + id, body: "Detail for " + id }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
each note in data render link note.title to "/notes/" + note.id
view note detail
input id: Text
load data from action fetch note
when loading render "Loading note..."
when error render "Could not load note"
render "Note detail for " + id
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
page note detail page
layout notes shell
input id: Text
title "Note detail"
description "Read a saved note"
main render note detail(id)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
path "/notes/:id" page note detail page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Golden (target)
module NotesApp
record Note
id: Text
title: Text
body: Text
record Create Note Input
title: Text
body: Text
calculation sample notes
output notes: List<Note>
return [{ id: "n1", title: "Hello", body: "World" }, { id: "n2", title: "Draft", body: "Work in progress" }]
action list notes
output notes: List<Note>
touches none
return sample notes()
action create note
input input: Create Note Input
output note: Note
touches none
return { id: "new", title: input.title, body: input.body }
action get note
input id: Text
output note: Note
touches none
return { id: id, title: "Note " + id, body: "Detail for " + id }
view notes nav
link "Notes" to "/notes"
link "New note" to "/notes/new"
render "Notes app"
view notes list
load data from action list notes
when loading render "Loading notes..."
when error render "Could not load notes"
when empty render "No notes yet"
each note in data render link note.title to "/notes/" + note.id
view note detail
input id: Text
load data from action get note
when loading render "Loading note..."
when error render "Could not load note"
render "Note detail for " + id
view note create form
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
on change call on draft change
form
bind field "Title" to draft.title
bind field "Body" to draft.body
render "Create a note"
layout notes shell
slot sidebar render notes nav()
slot main render "Select a notes page"
page notes list page
layout notes shell
title "Notes"
description "Browse saved notes"
main render notes list()
page note create page
layout notes shell
input draft: Create Note Input
input on draft change: Handler<Create Note Input>
title "New note"
description "Create a note"
main render note create form(draft, on draft change)
page note detail page
layout notes shell
input id: Text
title "Note detail"
description "Read a saved note"
main render note detail(id)
navigation notes app
path "/notes" page notes list page
path "/notes/new" page note create page
path "/notes/:id" page note detail page
bootstrap router
command notes demo
output result: Text
return "Notes app ready"
Reproduce: bun run benchmark:agent-app, bun test tests/agent-app-benchmark.test.ts tests/next-dashboard-scaffold.test.ts in the Point repo. Next.js scaffolds live in benchmarks/next-dashboard/.
Live model eval (optional)
Full-app fixtures use multi-edit JSON for feature-add and single-line fixes for app-repair. Run with API keys, then sync results here.
bun run benchmark:agent-app-models && cd ../LandingPage && bun run sync:agent-app-model-results
CI verified — no LLM
39/39 fixtures pass39 fixtures · 9 feature-build · 4 repair-plan loop · check-json ~170–260 tok vs TS paste · 78–92% less context.
bun run proof:agent-repair
Full CI suite: bun test tests/agent-repair-sufficiency.test.ts tests/agent-repair-multistep.test.ts && bun run benchmark:agent-repair
Live model benchmark
Point 100% · TS 100%May 22, 2026, 3:16 AM · gpt-4.1, claude-opus-4-6, claude-sonnet-4-6 on 13 fixtures (35 single-shot, 4 CI-only loop). Success = point check passes.
Latest proof run: 78/78 API runs pass point check.
- Claude Opus 4.6Point 13/13 · TS 13/13
- Claude Sonnet 4.6Point 13/13 · TS 13/13
- GPT-4.1Point 13/13 · TS 13/13
AI auto-coding scenarios
These fixtures simulate a coding agent that scaffolded a real multi-block feature — views, pipelines, routing, guards — then left one wiring bug. CI proves check-json alone is enough to fix it without repasting the whole scaffold.
Feature — dashboard items list
Build a mini dashboard app with sidebar nav, items list view with loading states, layout, page, and client routing.
- Diagnostic
missing-await- check-json
- ~278 tok
- TS paste
- ~3,500 tok
- Saved
- 92%
Feature — document ingest pipeline
Build a document ingest pipeline with URL policy, fetch/parse/store actions, and retry on fetch.
- Diagnostic
missing-await- check-json
- ~202 tok
- TS paste
- ~2,450 tok
- Saved
- 92%
Feature — notes list app
Build a notes CRUD shell with list action, loading view, layout, page, and navigation.
- Diagnostic
unknown-load-action- check-json
- ~197 tok
- TS paste
- ~2,125 tok
- Saved
- 91%
Feature — settings app routes
Build a settings app with layout, settings/profile pages, nav links, and client routing.
- Diagnostic
unknown-nav-page- check-json
- ~212 tok
- TS paste
- ~1,550 tok
- Saved
- 86%
Feature — guarded file write pipeline
Build a guarded file-write pipeline with output guard, URL policy, write action, and policy-gated pipeline step.
- Diagnostic
unknown-policy- check-json
- ~196 tok
- TS paste
- ~2,275 tok
- Saved
- 91%
Feature-build fixtures alone: 86–92% less context than illustrative TS paste (avg 90%).
Real agent loop: check → fix → check again
When an auto-coding agent rushes a feature, you often get multiple errors. Point's documented loop uses check-json (or repair-plan) each turn — never repasting the whole repo. CI simulates this with golden line repairs only (no LLM).
Feature — launch app (2-step repair plan)
Build a launch readiness app with scoring rule, status label, and summary calculation — agent left two wiring bugs.
- Turn 1:
check-json→unknown-field→ patch line →point check - Turn 2:
check-json→operator-type-mismatch→ patch line →point check - Turn 3:
point checkpasses — same gate as production CI
2 fixes · first turn still only ~268 tokens of context
Feature — cart pricing (2-step repair plan)
Build a cart line-total rule and discount band label — agent left a field typo and a string comparison bug.
- Turn 1:
check-json→unknown-field→ patch line →point check - Turn 2:
check-json→operator-type-mismatch→ patch line →point check - Turn 3:
point checkpasses — same gate as production CI
2 fixes · first turn still only ~227 tokens of context
Feature — notes list app (2-step repair plan)
Build a notes list view with client routing — agent wired the wrong action name and typo'd the page in navigation.
- Turn 1:
check-json→unknown-load-action→ patch line →point check - Turn 2:
check-json→unknown-nav-page→ patch line →point check - Turn 3:
point checkpasses — same gate as production CI
2 fixes · first turn still only ~197 tokens of context
Feature — document ingest pipeline (2-step repair plan)
Build a document ingest pipeline with URL policy — agent forgot await on fetch and typo'd the policy name.
- Turn 1:
check-json→missing-await→ patch line →point check - Turn 2:
check-json→unknown-policy→ patch line →point check - Turn 3:
point checkpasses — same gate as production CI
2 fixes · first turn still only ~205 tokens of context
Interactive compare
Primary fixture: tests/fixtures/agent-repair/unknown-field-broken.point. Green labels = CI verified. Gray = estimated TS paste size. Step-by-step walkthrough →
Without Point
TypeScript + agent paste
Estimated workflow- 1tsc error only
No list of valid field names.
- 2Paste ~3,000 tokens
Component, lib, tests — agent searches for the right line.
- 3Guess & retry
Wrong fix → another turn with the same paste.
error TS2339: Property 'unknownField' does not exist on type 'LaunchSignals'. at launchReadinessScore (lib/math.ts:18:15)
With Point
check-json → patch → check
CI verified- 1~263 token diagnostic
ref,expected,repair, line number. - 2One-line fix
Pick from expected: has bundle id, submitted for review, has passing tests
- 3point check passes
Same gate the Point repo runs in CI.
add 30 when signals.has bundle id
Golden fix from CI fixture
Reproduce CI proof: bun run proof:agent-repair
Model benchmark
Live API runs on 35 single-shot fixtures only. The repair-plan loop is proven in CI without an LLM.
Generated May 22, 2026, 3:16 AM on 13 single-shot CI fixtures with real API calls. Success = applied fix passes point check (same gate as CI).
| Model | Point context | Point fixes | TS context | TS fixes |
|---|---|---|---|---|
| Claude Opus 4.6anthropic | ~209 tok | 13/13 | ~1,842 tok | 13/13 |
| Claude Sonnet 4.6anthropic | ~209 tok | 13/13 | ~1,842 tok | 13/13 |
| GPT-4.1openai | ~209 tok | 13/13 | ~1,842 tok | 13/13 |
Per-fixture breakdown
| Model | Fixture | Point | TS paste |
|---|---|---|---|
| Claude Opus 4.6 | Rule — unknown field | pass | pass |
| Claude Opus 4.6 | Label — unknown field | pass | pass |
| Claude Opus 4.6 | Calculation — unknown field | pass | pass |
| Claude Opus 4.6 | Rule — inventory field typo | pass | pass |
| Claude Opus 4.6 | Rule — user record typo | pass | pass |
| Claude Opus 4.6 | Action — missing await | pass | pass |
| Claude Opus 4.6 | View — load data instead of direct action call | fail | fail |
| Claude Opus 4.6 | Route — middleware input unavailable | fail | fail |
| Claude Opus 4.6 | Middleware — header record mismatch | fail | fail |
| Claude Opus 4.6 | Auth — legacy JWT helper typo | fail | fail |
| Claude Opus 4.6 | Pipeline — step output type mismatch | fail | fail |
| Claude Opus 4.6 | Record — float money field lint | fail | fail |
| Claude Opus 4.6 | Label — missing variant case | fail | fail |
| Claude Opus 4.6 | Label — outcome dispatch typo (Payment Outcome) | fail | fail |
| Claude Opus 4.6 | Calculation — on failure return type mismatch | fail | fail |
| Claude Opus 4.6 | View — invalid bind target | fail | fail |
| Claude Opus 4.6 | Calculation — arity mismatch | pass | pass |
| Claude Opus 4.6 | Label — operator type mismatch | pass | pass |
| Claude Opus 4.6 | Feature — dashboard items list | pass | pass |
| Claude Opus 4.6 | Feature — document ingest pipeline | pass | pass |
| Claude Opus 4.6 | Feature — notes list app | pass | pass |
| Claude Opus 4.6 | Feature — settings app routes | pass | pass |
| Claude Opus 4.6 | Feature — guarded file write pipeline | pass | pass |
| Claude Opus 4.6 | View — unknown load action with refresh | fail | fail |
| Claude Opus 4.6 | View — invalid refresh interval | fail | fail |
| Claude Opus 4.6 | View — table link column missing from columns | fail | fail |
| Claude Opus 4.6 | View — terminal unknown stream route | fail | fail |
| Claude Opus 4.6 | View — datagrid sort column missing from columns | fail | fail |
| Claude Opus 4.6 | View — datagrid filter column missing from columns | fail | fail |
| Claude Opus 4.6 | View — chart field not on record | fail | fail |
| Claude Opus 4.6 | View — datagrid page size must be positive | fail | fail |
| Claude Opus 4.6 | View — bind select target must be record.field | fail | fail |
| Claude Opus 4.6 | View — toast requires form submit | fail | fail |
| Claude Opus 4.6 | View — unknown sse subscribe route | fail | fail |
| Claude Opus 4.6 | View — bind textarea target must be record.field | fail | fail |
| Claude Opus 4.6 | Feature — launch app (2-step repair plan) | fail | fail |
| Claude Opus 4.6 | Feature — cart pricing (2-step repair plan) | fail | fail |
| Claude Opus 4.6 | Feature — notes list app (2-step repair plan) | fail | fail |
| Claude Opus 4.6 | Feature — document ingest pipeline (2-step repair plan) | fail | fail |
| Claude Sonnet 4.6 | Rule — unknown field | pass | pass |
| Claude Sonnet 4.6 | Label — unknown field | pass | pass |
| Claude Sonnet 4.6 | Calculation — unknown field | pass | pass |
| Claude Sonnet 4.6 | Rule — inventory field typo | pass | pass |
| Claude Sonnet 4.6 | Rule — user record typo | pass | pass |
| Claude Sonnet 4.6 | Action — missing await | pass | pass |
| Claude Sonnet 4.6 | View — load data instead of direct action call | fail | fail |
| Claude Sonnet 4.6 | Route — middleware input unavailable | fail | fail |
| Claude Sonnet 4.6 | Middleware — header record mismatch | fail | fail |
| Claude Sonnet 4.6 | Auth — legacy JWT helper typo | fail | fail |
| Claude Sonnet 4.6 | Pipeline — step output type mismatch | fail | fail |
| Claude Sonnet 4.6 | Record — float money field lint | fail | fail |
| Claude Sonnet 4.6 | Label — missing variant case | fail | fail |
| Claude Sonnet 4.6 | Label — outcome dispatch typo (Payment Outcome) | fail | fail |
| Claude Sonnet 4.6 | Calculation — on failure return type mismatch | fail | fail |
| Claude Sonnet 4.6 | View — invalid bind target | fail | fail |
| Claude Sonnet 4.6 | Calculation — arity mismatch | pass | pass |
| Claude Sonnet 4.6 | Label — operator type mismatch | pass | pass |
| Claude Sonnet 4.6 | Feature — dashboard items list | pass | pass |
| Claude Sonnet 4.6 | Feature — document ingest pipeline | pass | pass |
| Claude Sonnet 4.6 | Feature — notes list app | pass | pass |
| Claude Sonnet 4.6 | Feature — settings app routes | pass | pass |
| Claude Sonnet 4.6 | Feature — guarded file write pipeline | pass | pass |
| Claude Sonnet 4.6 | View — unknown load action with refresh | fail | fail |
| Claude Sonnet 4.6 | View — invalid refresh interval | fail | fail |
| Claude Sonnet 4.6 | View — table link column missing from columns | fail | fail |
| Claude Sonnet 4.6 | View — terminal unknown stream route | fail | fail |
| Claude Sonnet 4.6 | View — datagrid sort column missing from columns | fail | fail |
| Claude Sonnet 4.6 | View — datagrid filter column missing from columns | fail | fail |
| Claude Sonnet 4.6 | View — chart field not on record | fail | fail |
| Claude Sonnet 4.6 | View — datagrid page size must be positive | fail | fail |
| Claude Sonnet 4.6 | View — bind select target must be record.field | fail | fail |
| Claude Sonnet 4.6 | View — toast requires form submit | fail | fail |
| Claude Sonnet 4.6 | View — unknown sse subscribe route | fail | fail |
| Claude Sonnet 4.6 | View — bind textarea target must be record.field | fail | fail |
| Claude Sonnet 4.6 | Feature — launch app (2-step repair plan) | fail | fail |
| Claude Sonnet 4.6 | Feature — cart pricing (2-step repair plan) | fail | fail |
| Claude Sonnet 4.6 | Feature — notes list app (2-step repair plan) | fail | fail |
| Claude Sonnet 4.6 | Feature — document ingest pipeline (2-step repair plan) | fail | fail |
| GPT-4.1 | Rule — unknown field | pass | pass |
| GPT-4.1 | Label — unknown field | pass | pass |
| GPT-4.1 | Calculation — unknown field | pass | pass |
| GPT-4.1 | Rule — inventory field typo | pass | pass |
| GPT-4.1 | Rule — user record typo | pass | pass |
| GPT-4.1 | Action — missing await | pass | pass |
| GPT-4.1 | View — load data instead of direct action call | fail | fail |
| GPT-4.1 | Route — middleware input unavailable | fail | fail |
| GPT-4.1 | Middleware — header record mismatch | fail | fail |
| GPT-4.1 | Auth — legacy JWT helper typo | fail | fail |
| GPT-4.1 | Pipeline — step output type mismatch | fail | fail |
| GPT-4.1 | Record — float money field lint | fail | fail |
| GPT-4.1 | Label — missing variant case | fail | fail |
| GPT-4.1 | Label — outcome dispatch typo (Payment Outcome) | fail | fail |
| GPT-4.1 | Calculation — on failure return type mismatch | fail | fail |
| GPT-4.1 | View — invalid bind target | fail | fail |
| GPT-4.1 | Calculation — arity mismatch | pass | pass |
| GPT-4.1 | Label — operator type mismatch | pass | pass |
| GPT-4.1 | Feature — dashboard items list | pass | pass |
| GPT-4.1 | Feature — document ingest pipeline | pass | pass |
| GPT-4.1 | Feature — notes list app | pass | pass |
| GPT-4.1 | Feature — settings app routes | pass | pass |
| GPT-4.1 | Feature — guarded file write pipeline | pass | pass |
| GPT-4.1 | View — unknown load action with refresh | fail | fail |
| GPT-4.1 | View — invalid refresh interval | fail | fail |
| GPT-4.1 | View — table link column missing from columns | fail | fail |
| GPT-4.1 | View — terminal unknown stream route | fail | fail |
| GPT-4.1 | View — datagrid sort column missing from columns | fail | fail |
| GPT-4.1 | View — datagrid filter column missing from columns | fail | fail |
| GPT-4.1 | View — chart field not on record | fail | fail |
| GPT-4.1 | View — datagrid page size must be positive | fail | fail |
| GPT-4.1 | View — bind select target must be record.field | fail | fail |
| GPT-4.1 | View — toast requires form submit | fail | fail |
| GPT-4.1 | View — unknown sse subscribe route | fail | fail |
| GPT-4.1 | View — bind textarea target must be record.field | fail | fail |
| GPT-4.1 | Feature — launch app (2-step repair plan) | fail | fail |
| GPT-4.1 | Feature — cart pricing (2-step repair plan) | fail | fail |
| GPT-4.1 | Feature — notes list app (2-step repair plan) | fail | fail |
| GPT-4.1 | Feature — document ingest pipeline (2-step repair plan) | fail | fail |
Model responses and failure details
Claude Opus 4.6
- Context
- ~263 tokens
- Latency
- 2431 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~3,000 tokens
- Latency
- 2514 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~203 tokens
- Latency
- 1915 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~1,050 tokens
- Latency
- 2280 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~227 tokens
- Latency
- 2131 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~1,700 tokens
- Latency
- 2272 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~234 tokens
- Latency
- 3345 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~1,350 tokens
- Latency
- 2749 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~202 tokens
- Latency
- 2584 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~975 tokens
- Latency
- 2541 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~187 tokens
- Latency
- 1842 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~1,275 tokens
- Latency
- 21622 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~189 tokens
- Latency
- 5671 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~1,900 tokens
- Latency
- 2514 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~168 tokens
- Latency
- 2347 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~800 tokens
- Latency
- 1836 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~241 tokens
- Latency
- 2090 ms
- Check
- point check passed
render data from fetch items
check passed (alternate valid fix)
- Context
- ~3,500 tokens
- Latency
- 3120 ms
- Check
- point check passed
render data
check passed (alternate valid fix)
- Context
- ~202 tokens
- Latency
- 2200 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~2,450 tokens
- Latency
- 2570 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~197 tokens
- Latency
- 2163 ms
- Check
- point check passed
load data from action list notes
- Context
- ~2,125 tokens
- Latency
- 2088 ms
- Check
- point check passed
load data from action list notes
- Context
- ~212 tokens
- Latency
- 1695 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~1,550 tokens
- Latency
- 1596 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~196 tokens
- Latency
- 2758 ms
- Check
- point check passed
require policy allowed path
- Context
- ~2,275 tokens
- Latency
- 2814 ms
- Check
- point check passed
require policy allowed path
Claude Sonnet 4.6
- Context
- ~263 tokens
- Latency
- 1697 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~3,000 tokens
- Latency
- 1848 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~203 tokens
- Latency
- 2657 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~1,050 tokens
- Latency
- 2469 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~227 tokens
- Latency
- 1726 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~1,700 tokens
- Latency
- 1803 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~234 tokens
- Latency
- 1581 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~1,350 tokens
- Latency
- 1859 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~202 tokens
- Latency
- 1615 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~975 tokens
- Latency
- 1645 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~187 tokens
- Latency
- 1734 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~1,275 tokens
- Latency
- 1692 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~189 tokens
- Latency
- 1482 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~1,900 tokens
- Latency
- 1620 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~168 tokens
- Latency
- 1966 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~800 tokens
- Latency
- 1807 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~241 tokens
- Latency
- 1348 ms
- Check
- point check passed
render data
check passed (alternate valid fix)
- Context
- ~3,500 tokens
- Latency
- 2062 ms
- Check
- point check passed
render data
check passed (alternate valid fix)
- Context
- ~202 tokens
- Latency
- 1644 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~2,450 tokens
- Latency
- 1613 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~197 tokens
- Latency
- 1655 ms
- Check
- point check passed
load data from action list notes
- Context
- ~2,125 tokens
- Latency
- 1314 ms
- Check
- point check passed
load data from action list notes
- Context
- ~212 tokens
- Latency
- 2145 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~1,550 tokens
- Latency
- 1896 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~196 tokens
- Latency
- 1513 ms
- Check
- point check passed
require policy allowed path
- Context
- ~2,275 tokens
- Latency
- 1769 ms
- Check
- point check passed
require policy allowed path
GPT-4.1
- Context
- ~263 tokens
- Latency
- 1547 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~3,000 tokens
- Latency
- 814 ms
- Check
- point check passed
add 30 when signals.has bundle id
- Context
- ~203 tokens
- Latency
- 975 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~1,050 tokens
- Latency
- 1386 ms
- Check
- point check passed
when user.active return user.name
- Context
- ~227 tokens
- Latency
- 860 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~1,700 tokens
- Latency
- 950 ms
- Check
- point check passed
annual price is input.monthly price * 12
- Context
- ~234 tokens
- Latency
- 805 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~1,350 tokens
- Latency
- 807 ms
- Check
- point check passed
add 50 when item.quantity > 0
- Context
- ~202 tokens
- Latency
- 984 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~975 tokens
- Latency
- 947 ms
- Check
- point check passed
add 10 when user.active
- Context
- ~187 tokens
- Latency
- 507 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~1,275 tokens
- Latency
- 689 ms
- Check
- point check passed
return await fetch item(id)
- Context
- ~189 tokens
- Latency
- 646 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~1,900 tokens
- Latency
- 581 ms
- Check
- point check passed
summary is listing status(listing score(signals))
- Context
- ~168 tokens
- Latency
- 551 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~800 tokens
- Latency
- 787 ms
- Check
- point check passed
when score >= 90 return "A"
- Context
- ~241 tokens
- Latency
- 538 ms
- Check
- point check passed
render data.items
check passed (alternate valid fix)
- Context
- ~3,500 tokens
- Latency
- 840 ms
- Check
- point check passed
render data.items
check passed (alternate valid fix)
- Context
- ~202 tokens
- Latency
- 810 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~2,450 tokens
- Latency
- 922 ms
- Check
- point check passed
step fetched is await fetch document(url)
- Context
- ~197 tokens
- Latency
- 630 ms
- Check
- point check passed
load data from action list notes
- Context
- ~2,125 tokens
- Latency
- 682 ms
- Check
- point check passed
load data from action list notes
- Context
- ~212 tokens
- Latency
- 858 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~1,550 tokens
- Latency
- 946 ms
- Check
- point check passed
path "/profile" page profile page
- Context
- ~196 tokens
- Latency
- 1167 ms
- Check
- point check passed
require policy allowed path
- Context
- ~2,275 tokens
- Latency
- 776 ms
- Check
- point check passed
require policy allowed path
Latest live run: Point 100% · TS paste 100% on 13 fixtures × 3 models. Repair-plan loop (4 fixture) is CI-only.
Each model receives either check-json only (Point) or TS paste + tsc error + full .point file (TypeScript). Success = applied fixedLine passes point check (same gate as CI).
All CI fixtures (39)
| Case | Kind | Mode | Diagnostic | check-json | TS paste | Saved | CI | Models | Walkthrough |
|---|---|---|---|---|---|---|---|---|---|
| Rule — unknown fieldFix a typo in an existing launch readiness rule. | Typo | Single-shot | unknown-field | ~263 tok | ~3,000 tok | 91% | pass | 6/6 | Open → |
| Label — unknown fieldFix a typo in a user status label. | Typo | Single-shot | unknown-field | ~210 tok | ~1,050 tok | 80% | pass | 6/6 | Open → |
| Calculation — unknown fieldFix a typo in a pricing calculation. | Typo | Single-shot | unknown-field | ~227 tok | ~1,700 tok | 87% | pass | 6/6 | Open → |
| Rule — inventory field typoFix a typo in an inventory scoring rule. | Typo | Single-shot | unknown-field | ~234 tok | ~1,350 tok | 83% | pass | 6/6 | Open → |
| Rule — user record typoFix a typo in a user points rule. | Typo | Single-shot | unknown-field | ~209 tok | ~975 tok | 79% | pass | 6/6 | Open → |
| Action — missing awaitFix a missing await in a small async action. | Typo | Single-shot | missing-await | ~187 tok | ~1,275 tok | 85% | pass | 6/6 | Open → |
| View — load data instead of direct action callFix a view that calls an action directly instead of using the load data binding. | Typo | Single-shot | missing-await | ~274 tok | ~3,000 tok | 91% | pass | CI only | Open → |
| Route — middleware input unavailableFix middleware wired on a GET items route — agent declared body middleware but the route only exposes query params. | Typo | Single-shot | middleware-input-unavailable | ~224 tok | ~1,600 tok | 86% | pass | CI only | Open → |
| Middleware — header record mismatchFix auth middleware on an items route — agent typed middleware headers differently from the route input record. | Typo | Single-shot | middleware-input-type-mismatch | ~228 tok | ~1,300 tok | 82% | pass | CI only | Open → |
| Auth — legacy JWT helper typoFix auth middleware on a protected route — agent called a nonexistent legacyJwtCheck helper instead of std/auth auth ok. | Typo | Single-shot | unknown-function | ~263 tok | ~1,200 tok | 78% | pass | CI only | Open → |
| Pipeline — step output type mismatchFix document ingest pipeline wiring — agent passed fetched Text body into a parse step that expects an Int page count. | Typo | Single-shot | pipeline-step-type-mismatch | ~187 tok | ~1,950 tok | 90% | pass | CI only | Open → |
| Record — float money field lintFix cart line item pricing record — agent used Float for a money-like unit price field. | Typo | Single-shot | float-money-field | ~228 tok | ~1,025 tok | 78% | pass | CI only | Open → |
| Label — missing variant caseFix order status label dispatch — agent typo'd a variant branch name and left Pending uncovered. | Typo | Single-shot | missing-variant-case | ~219 tok | ~1,400 tok | 84% | pass | CI only | Open → |
| Label — outcome dispatch typo (Payment Outcome)Fix payment headline label — agent misspelled the Succeeded branch on an outcome variant (types named ending with " Outcome"). | Typo | Single-shot | action-outcome-not-exhaustive | ~235 tok | ~1,350 tok | 83% | pass | CI only | Open → |
| Calculation — on failure return type mismatchFix margin calculation fallback — agent returned a string from on failure return but output is integer cents. | Typo | Single-shot | calculation-on-failure-type-mismatch | ~185 tok | ~1,550 tok | 88% | pass | CI only | Open → |
| View — invalid bind targetFix settings form bindings — agent bound the field label to the input record instead of input.field. | Typo | Single-shot | invalid-view-bind-target | ~171 tok | ~1,200 tok | 86% | pass | CI only | Open → |
| Calculation — arity mismatchFix a wrong argument count in a widget calculation. | Typo | Single-shot | arity-mismatch | ~189 tok | ~1,900 tok | 90% | pass | 6/6 | Open → |
| Label — operator type mismatchFix a numeric comparison typo in a score label. | Typo | Single-shot | operator-type-mismatch | ~168 tok | ~800 tok | 79% | pass | 6/6 | Open → |
| Feature — dashboard items listBuild a mini dashboard app with sidebar nav, items list view with loading states, layout, page, and client routing. | Feature | Single-shot | missing-await | ~278 tok | ~3,500 tok | 92% | pass | 6/6 | Open → |
| Feature — document ingest pipelineBuild a document ingest pipeline with URL policy, fetch/parse/store actions, and retry on fetch. | Feature | Single-shot | missing-await | ~202 tok | ~2,450 tok | 92% | pass | 6/6 | Open → |
| Feature — notes list appBuild a notes CRUD shell with list action, loading view, layout, page, and navigation. | Feature | Single-shot | unknown-load-action | ~197 tok | ~2,125 tok | 91% | pass | 6/6 | Open → |
| Feature — settings app routesBuild a settings app with layout, settings/profile pages, nav links, and client routing. | Feature | Single-shot | unknown-nav-page | ~212 tok | ~1,550 tok | 86% | pass | 6/6 | Open → |
| Feature — guarded file write pipelineBuild a guarded file-write pipeline with output guard, URL policy, write action, and policy-gated pipeline step. | Feature | Single-shot | unknown-policy | ~196 tok | ~2,275 tok | 91% | pass | 6/6 | Open → |
| View — unknown load action with refreshFix a view load data action name typo while keeping refresh every. | Typo | Single-shot | unknown-load-action | ~204 tok | ~1,800 tok | 89% | pass | CI only | Open → |
| View — invalid refresh intervalFix a refresh every interval that must be a positive integer. | Typo | Single-shot | invalid-refresh-interval | ~219 tok | ~1,600 tok | 86% | pass | CI only | Open → |
| View — table link column missing from columnsFix a table where link column is not listed in columns. | Typo | Single-shot | invalid-table-link-column | ~172 tok | ~1,450 tok | 88% | pass | CI only | Open → |
| View — terminal unknown stream routeFix terminal subscribe to stream name typo. | Typo | Single-shot | unknown-stream-subscribe-route | ~177 tok | ~1,525 tok | 88% | pass | CI only | Open → |
| View — datagrid sort column missing from columnsFix a datagrid where sort by column is not listed in columns. | Typo | Single-shot | invalid-datagrid-sort-column | ~176 tok | ~1,475 tok | 88% | pass | CI only | Open → |
| View — datagrid filter column missing from columnsFix a datagrid where filter by column is not listed in columns. | Typo | Single-shot | invalid-datagrid-filter-column | ~179 tok | ~1,475 tok | 88% | pass | CI only | Open → |
| View — chart field not on recordFix a chart label or value field name to match the record. | Typo | Single-shot | invalid-chart-field | ~166 tok | ~1,400 tok | 88% | pass | CI only | Open → |
| View — datagrid page size must be positiveFix datagrid page size to a positive integer. | Typo | Single-shot | invalid-datagrid-page-size | ~165 tok | ~1,350 tok | 88% | pass | CI only | Open → |
| View — bind select target must be record.fieldFix bind select target to draft.field with options list. | Typo | Single-shot | invalid-view-bind-target | ~167 tok | ~1,450 tok | 88% | pass | CI only | Open → |
| View — toast requires form submitAdd submit action after toast lines in a form view. | Typo | Single-shot | toast-without-submit | ~178 tok | ~1,300 tok | 86% | pass | CI only | Open → |
| View — unknown sse subscribe routeFix subscribe to sse route name typo. | Typo | Single-shot | unknown-sse-subscribe-route | ~175 tok | ~1,400 tok | 88% | pass | CI only | Open → |
| View — bind textarea target must be record.fieldFix bind textarea target to draft.field. | Typo | Single-shot | invalid-view-bind-target | ~164 tok | ~1,400 tok | 88% | pass | CI only | Open → |
| Feature — launch app (2-step repair plan)Build a launch readiness app with scoring rule, status label, and summary calculation — agent left two wiring bugs. | Feature | Repair-plan loop | unknown-field | ~268 tok | ~2,875 tok | 91% | pass | CI only | Open → |
| Feature — cart pricing (2-step repair plan)Build a cart line-total rule and discount band label — agent left a field typo and a string comparison bug. | Feature | Repair-plan loop | unknown-field | ~227 tok | ~1,800 tok | 87% | pass | CI only | Open → |
| Feature — notes list app (2-step repair plan)Build a notes list view with client routing — agent wired the wrong action name and typo'd the page in navigation. | Feature | Repair-plan loop | unknown-load-action | ~197 tok | ~2,450 tok | 92% | pass | CI only | Open → |
| Feature — document ingest pipeline (2-step repair plan)Build a document ingest pipeline with URL policy — agent forgot await on fetch and typo'd the policy name. | Feature | Repair-plan loop | missing-await | ~205 tok | ~2,150 tok | 90% | pass | CI only | Open → |
Run in the Point repo: bun run proof:agent-repair
