Lazyweb — Propose UI Changes
Propose changes against a structured diagram you build from the real code:
you supply the current diagram, annotate its elements, and supply a proposed
version; the user opens a lazyweb.com/proposal/<id>/ page, toggles Current ↔
Proposed to see before/after, and Accepts / Declines each suggestion; then
you apply the accepted ones.
This skill drives these Lazyweb MCP tools:
lazyweb_health — verify MCP connectivity when the surface is uncertain.
lazyweb_propose_ui_changes — store a proposal (current + proposed + annotations), get a review URL.
lazyweb_get_proposal_decision — poll the user's accept/decline verdicts.
Prerequisite: the Lazyweb MCP must be connected and current. If
lazyweb_propose_ui_changes isn't in the tool list, the skill pack/MCP is out
of date — tell the user to update (curl -fsSL https://www.lazyweb.com/install.sh | sh)
and restart their client.
MCP plan responses
Inspect every data-bearing tool result before applying its normal schema:
MCP_PRO_REQUIRED: relay the server message and returned intent-bound
upgrade_url to the user, then stop. Do not retry another data tool or fall
back to web/manual output.
FREE_REPORT_DAILY_LIMIT: relay the server message and returned intent-bound
upgrade_url to the user, then stop. Do not retry another data tool or fall
back to web/manual output.
- Successful
status: "locked_preview": relay display_to_user verbatim (or
the returned MCP text if that is all the client exposes), including the
preview and upgrade links. It is terminal: do not poll, retry another data
tool, reconstruct output, or fall back.
When to use
- The user wants to see and approve/reject a batch of changes before you make them.
- You want to explain how a system/flow works by annotating a diagram they can click.
- Changes span several places and a chat list would be hard to review.
When NOT to use
- A single trivial edit you can just make — don't ceremony it into a proposal.
- Pure design-from-screenshots work — use
lazyweb_generate_report / the design skills.
The data you build
A proposal = diagram (the current state, nodes + edges each with a stable
id, built from the REAL code) + proposed (a full copy of that diagram
with your changes applied) + annotations (one per suggestion, targeting
node/edge ids). The viewer shows Current from diagram and Proposed from
proposed, and lists the annotations to Accept/Decline.
{
"diagram": { /* the CURRENT sectioned diagram: actors, sections, nodes, edges —
each element with a stable id, grounded in the real code. */ },
"title": "Speed up repeat reports",
"summary": "Three changes to cut latency.",
"proposed": { /* the SAME sectioned diagram, edited: add/remove/modify nodes+edges.
Keep unchanged ids stable so Current↔Proposed line up. */ },
"annotations": [
{ "target": "a_tkt", // a node OR edge id IN THE DIAGRAM
"kind": "change", // change | add | remove | highlight | note
"title": "Cache identical re-runs",
"detail": "Return a cached result when the input hash is unchanged.",
"before": "always rebuilds", // optional
"after": "instant on cache hit" },
{ "target": "a_poll", "kind": "add", "title": "Send progress, not just pending" }
]
}
kind sets the badge color/label: change (orange), add (green),
remove (red), highlight (purple), note (blue). Defaults to note.
Steps
Build the current diagram from the real code. Sections, actors, nodes and
edges with stable ids, notes, and real data payloads — never invented
structure. Proposals target these ids.
Author the annotations. One per suggestion, each targeting a diagram
node/edge id. Clear title + detail; add before/after for concrete
changes; pick the right kind.
Build proposed. Copy the diagram and apply the changes you're
proposing — add/remove/modify nodes and edges — keeping unchanged ids stable
so the Current↔Proposed toggle aligns. This is the "after" the user previews.
Submit. lazyweb_propose_ui_changes({ diagram, title, summary, proposed, annotations }) → { proposal_id, proposal_url, ... }. On ok:false,
surface error/detail; fix any unknownTargets (ids not in the diagram).
Share the link. Give the user the proposal_url: they toggle Current ↔
Proposed and Accept/Decline each suggestion there. Don't paste the proposal
back into chat — the page is the review surface.
Get decisions. When they're done (or after a wait), poll
lazyweb_get_proposal_decision(proposal_id) until status is completed
(~20–30s between polls; don't hammer).
Apply. Make the change for every accepted suggestion; skip declined.
Confirm what you applied vs skipped.
Notes
- The review page is unlisted (UUID-gated) — share the URL only with the reviewer.
- Decisions are scoped to the submitting user.
- Keep diagrams + proposals product-agnostic and target strictly by
id; that's what
makes this reproducible across products.
1---2name: lazyweb-propose-ui-changes3description: Propose UI/flow changes (or explain context) on a STRUCTURED DIAGRAM that the user reviews and Accepts/Declines on a hosted lazyweb.com page, then apply the accepted ones. Use when the user wants a reviewable set of proposed changes to a product's UI, architecture, or flow — anything where you'd otherwise list suggestions in chat and want the user to approve/reject each before you act. Trigger on: "propose changes", "suggest UI changes for review", "let me review your suggestions", "annotate this flow/diagram", "create a proposal", "review and approve these changes", "explain this architecture/flow visually".4---56# Lazyweb — Propose UI Changes78Propose changes **against a structured diagram you build from the real code**:9you supply the current diagram, annotate its elements, and supply a **proposed**10version; the user opens a `lazyweb.com/proposal/<id>/` page, **toggles Current ↔11Proposed** to see before/after, and **Accepts / Declines** each suggestion; then12you apply the accepted ones.1314This skill drives these Lazyweb MCP tools:15- `lazyweb_health` — verify MCP connectivity when the surface is uncertain.16- `lazyweb_propose_ui_changes` — store a proposal (current + proposed + annotations), get a review URL.17- `lazyweb_get_proposal_decision` — poll the user's accept/decline verdicts.1819> **Prerequisite:** the Lazyweb MCP must be connected and current. If20> `lazyweb_propose_ui_changes` isn't in the tool list, the skill pack/MCP is out21> of date — tell the user to update (`curl -fsSL https://www.lazyweb.com/install.sh | sh`)22> and restart their client.2324### MCP plan responses2526Inspect every data-bearing tool result before applying its normal schema:2728- `MCP_PRO_REQUIRED`: relay the server message and returned intent-bound29 `upgrade_url` to the user, then stop. Do not retry another data tool or fall30 back to web/manual output.31- `FREE_REPORT_DAILY_LIMIT`: relay the server message and returned intent-bound32 `upgrade_url` to the user, then stop. Do not retry another data tool or fall33 back to web/manual output.34- Successful `status: "locked_preview"`: relay `display_to_user` verbatim (or35 the returned MCP text if that is all the client exposes), including the36 preview and upgrade links. It is terminal: do not poll, retry another data37 tool, reconstruct output, or fall back.3839## When to use40- The user wants to see and approve/reject a batch of changes **before** you make them.41- You want to explain how a system/flow works by annotating a diagram they can click.42- Changes span several places and a chat list would be hard to review.4344## When NOT to use45- A single trivial edit you can just make — don't ceremony it into a proposal.46- Pure design-from-screenshots work — use `lazyweb_generate_report` / the design skills.4748## The data you build4950A proposal = **`diagram`** (the current state, nodes + edges each with a stable51`id`, built from the REAL code) + **`proposed`** (a full copy of that diagram52with your changes applied) + **`annotations`** (one per suggestion, targeting53node/edge `id`s). The viewer shows Current from `diagram` and Proposed from54`proposed`, and lists the annotations to Accept/Decline.5556```jsonc57{58 "diagram": { /* the CURRENT sectioned diagram: actors, sections, nodes, edges —59 each element with a stable id, grounded in the real code. */ },60 "title": "Speed up repeat reports",61 "summary": "Three changes to cut latency.",62 "proposed": { /* the SAME sectioned diagram, edited: add/remove/modify nodes+edges.63 Keep unchanged ids stable so Current↔Proposed line up. */ },64 "annotations": [65 { "target": "a_tkt", // a node OR edge id IN THE DIAGRAM66 "kind": "change", // change | add | remove | highlight | note67 "title": "Cache identical re-runs",68 "detail": "Return a cached result when the input hash is unchanged.",69 "before": "always rebuilds", // optional70 "after": "instant on cache hit" },71 { "target": "a_poll", "kind": "add", "title": "Send progress, not just pending" }72 ]73}74```7576**`kind`** sets the badge color/label: `change` (orange), `add` (green),77`remove` (red), `highlight` (purple), `note` (blue). Defaults to `note`.7879## Steps80811. **Build the current diagram from the real code.** Sections, actors, nodes and82 edges with stable `id`s, `note`s, and real `data` payloads — never invented83 structure. Proposals **target these ids**.84852. **Author the annotations.** One per suggestion, each `target`ing a diagram86 node/edge `id`. Clear `title` + `detail`; add `before`/`after` for concrete87 changes; pick the right `kind`.88893. **Build `proposed`.** Copy the diagram and apply the changes you're90 proposing — add/remove/modify nodes and edges — **keeping unchanged ids stable**91 so the Current↔Proposed toggle aligns. This is the "after" the user previews.92934. **Submit.** `lazyweb_propose_ui_changes({ diagram, title, summary,94 proposed, annotations })` → `{ proposal_id, proposal_url, ... }`. On `ok:false`,95 surface `error`/`detail`; fix any `unknownTargets` (ids not in the diagram).96975. **Share the link.** Give the user the `proposal_url`: they toggle **Current ↔98 Proposed** and Accept/Decline each suggestion there. Don't paste the proposal99 back into chat — the page is the review surface.1001016. **Get decisions.** When they're done (or after a wait), poll102 `lazyweb_get_proposal_decision(proposal_id)` until `status` is `completed`103 (~20–30s between polls; don't hammer).1041057. **Apply.** Make the change for every `accepted` suggestion; skip `declined`.106 Confirm what you applied vs skipped.107108## Notes109- The review page is unlisted (UUID-gated) — share the URL only with the reviewer.110- Decisions are scoped to the submitting user.111- Keep diagrams + proposals product-agnostic and target strictly by `id`; that's what112 makes this reproducible across products.