Skip to content

feat(prototype): make the HTML mockup explore-directions' default host #8776

Description

@kyle-sexton

Part of #8773

Problem

/prototype:explore-directions builds variants on the real stack by default. Its intent selector marks sub-shape A (variants mounted inside an existing page behind ?variant=) as the default (plugins/prototype/skills/explore-directions/SKILL.md:75) and picks the self-contained HTML mockup only when there is no page to host it and "speed matters more than realism" (:77). The description says it "Runs on the real stack by default or as a self-contained HTML mockup" (:2).

The proposal: make the self-contained HTML mockup the default decision surface, including for developers, because any decider (developer, product owner, designer, or several) can open a file:// page with nothing running, and it needs no dev server. The real stack stays as an explicit override and as the place the winner is folded in.

Evidence

Verified on origin/main 31eafaa (prototype 0.14.0) with git show. The item cited "Prefer A" wording from 0.13.11; 0.14.0 replaced it with the intent-selector table but kept sub-shape A as the default.

The current default is deliberate. The skill argues for realism: "a parcel card that looks roomy on a bare route can push the order summary off screen on the real /shipments, with its header, its filters and forty parcels in transit" (:80-84), and "B costs a running app and buys a judgment made inside it; the mockup gives up that realism for a page that opens with nothing running" (:86-88). The anti-patterns table also guards against live API writes from real-stack variants (:365), a risk the mockup removes.

Inferred: grounding the mockup in the existing product's look (#8429, plus its comment on token mapping) would recover much of the realism the current default buys, which weakens the argument for keeping sub-shape A as the default. That depends on #8429 landing.

Decision needed

  1. Flip the default to the HTML mockup (the source item's recommendation). Sub-shape A and B become explicit overrides ("on the real stack", "in the app") and the fold-in path for the winner. Recommended only together with explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429, so a mockup of an existing app keeps the app's look.
  2. Keep sub-shape A as the default, and instead widen the mockup row's trigger to "a non-developer decides, or several people review". Smaller change; keeps the realism argument; leaves developers on the real stack.
  3. Ask once per run which host to use. Costs a question every run; rejected by the item as adding friction to the common case.

Proposed approach (for option 1)

  • SKILL.md: reorder the intent selector so the HTML mockup row is the default and sub-shape A/B rows are chosen on an explicit request for real-stack variants. Rewrite :80-88 to say when the real stack is still worth its cost (layout sensitive to live data volume, existing page chrome that the mockup cannot reproduce). Update the description at :2 and the Purpose paragraph at :42-45.
  • Keep the model auto-invoke gate unchanged (context/discipline.md:17-21): "default" means the default host once the skill runs; it does not let the model start a prototype unasked.
  • Keep the CSP and no-remote-fetch rules (SKILL.md:114-119) unchanged; this child adds a check that they hold.
  • Update docs/native-surfaces/records.json rows whose reason states the real-stack default (for example :1941, which says "ours builds switchable throwaway layout variants on the real stack").
  • Add or update evals in plugins/prototype/skills/explore-directions/evals/evals.json for the new default and the override.

Acceptance criteria

  • Invoking the skill with no host override and no running dev server produces a single self-contained HTML file; real-stack variants appear only on an explicit request. (Source check 1.)
  • The generated page carries the restrictive CSP meta tag and makes no network request when opened from file:// (verified in a browser network panel or a headless run). (Source check 2.)
  • With the model reaching for the skill unasked, the STOP-and-confirm gate still fires before any file is written.
  • The description, Purpose, intent selector and native-surfaces rows agree on which host is the default.
  • An eval case covers the default and one covers the real-stack override.

Constraints and gotchas

  • "Default" already means two things: "The HTML mockup stays the default" (SKILL.md:151, :279) is relative to the /design canvas offer, while sub-shape A is the default host (:75). Keep them distinct in the rewrite.
  • The anti-pattern at :365 (stub every write) still applies to the real-stack override.
  • explore-directions is a grandfathered emitter under the rendered-views convention, held to "their shipped ladder and medium only" (docs/conventions/rendered-views/README.md:552-558, ADR 0025). Changing which medium it produces by default is a change to that ladder; check the convention's content-class rules and say in the PR whether the skill stays grandfathered or adopts the convention.
  • prototype uses changelog fragments (scripts/fragment-plugins.txt:74): add one under .changes/prototype/; no plugin.json bump.
  • A description change shifts the skill listing; check it against the listing budget work in perf(skills): trim skill descriptions until the listing fits, then lower skillListingBudgetFraction #6846.
  • Coordinate with Concise skills rollout: prototype (2 skills, 2 model-invoked) #6589 (prototype skill rewrite).

Context

Source: local handoff item 2026-10-06-ui-mockup-review-mode.md, overlap 1 (replace the default) and overlap 3 (keep the auto-invoke gate). Related: #8429.

Activity

  1. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    priority: mediumReal value, no hard deadline; normal backlog flow.
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    on Oct 21, 2026
  2. github-actions commented on Oct 21, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: structural
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: #8429

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    1. Which host decision applies?
      Decided: Option 1, flip the default to the HTML mockup, blocked by explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429.
    2. Must explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429 land first?
      Decided: Yes.
    3. Grandfathered or adopt rendered-views?
      Decided: Stays grandfathered.

    [quote truncated; the full decision is at https://github.com//issues/8776#issuecomment-6424885146]

    The decision settles the open questions: flip the default host to the HTML mockup (option 1) once #8429 lands, keep the real stack as an explicit override, and keep explore-directions grandfathered under the rendered-views convention. The work is a bounded change to the skill, its evals, the native-surfaces rows and a changelog fragment. It is blocked by #8429.

    Automated triage, applied by the lanes App.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 21, 2026
  4. removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 25, 2026
  5. kyle-sexton commented on Oct 25, 2026

    @kyle-sexton
    MemberAuthor

    Released for re-triage under the owner's 2026-10-24 rule: an issue stops for a person only for an intent or vision question, a security call, a host or attended run, or spend outside prepaid credit. The hold label came off and intake triage runs again now; it re-applies a hold, with a numbered question, when one of those applies.

    To hold this issue again, add needs-human (or status: needs-decision) and say why in a comment.

  6. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Oct 25, 2026
  7. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  8. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: Option 1 once #​8429 lands: the self-contained HTML mockup becomes explore-directions' default host, with real-stack sub-shapes A and B as explicit overrides and the winner's fold-in path.

    Dependencies

    • #​8429: option 1 is only recommended together with it, so a mockup of an existing app keeps the app's look

    Related work

    Open questions

    1. Which host decision applies: flip the default to the HTML mockup (option 1), keep sub-shape A and widen the mockup trigger (option 2), or ask once per run (option 3)?
      RECOMMENDED: Option 2 for now; revisit option 1 after #​8429 lands. It is the smaller change and keeps the realism argument, but the owner must choose because the issue lists three options and picks none. Basis: plugins/prototype/skills/explore-directions/SKILL.md:75
    2. If option 1 is chosen, must #​8429 land before the default flips?
      RECOMMENDED: Yes. Without it a mockup of an existing app loses the realism that the current default buys (SKILL.md:80-88). Basis: 8429
    3. Does explore-directions stay grandfathered under the rendered-views convention after the default host changes, or adopt the convention?
      RECOMMENDED: Stay grandfathered and say so in the PR. A change of default host does not need the convention's content classes. Basis: docs/conventions/rendered-views/README.md:552-558

    Sources read

    • plugins/prototype/skills/explore-directions/SKILL.md:75: sub-shape A is marked (default) in the intent selector
    • plugins/prototype/skills/explore-directions/SKILL.md:117: CSP meta tag default-src 'none' on the HTML mockup
    • plugins/prototype/skills/explore-directions/SKILL.md:150-153: HTML mockup is the default relative to the /design canvas offer, a separate meaning of default
    • plugins/prototype/skills/explore-directions/SKILL.md:279: Routing says the HTML mockup stays the default and is built either way

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  9. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    Owner ledger: Q37 (.work/issue-triage-owner-sweep-1/interview-checklist.md:62) is marked deferred, "outside the pipeline focus; issue not touched". It decided nothing, so nothing below reverses it.

    Questions from intake's refinement (#8776 (comment)):

    1. Which host decision applies?
      Decided: Option 1, flip the default to the HTML mockup, blocked by explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429. The issue's title and its own criteria state that outcome; option 2 would keep sub-shape A as the default and so not meet it. The body recommends option 1 "only together with explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429", and explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429 is decided in this batch to keep the app's look on the mockup. The skill's realism argument (plugins/prototype/skills/explore-directions/SKILL.md:80-88, origin/main 68d3f2b) covers a page shown without its real chrome and without its live data volume. explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429 restores the chrome by building each variant from the app's own CSS and surrounding page; the mockup still binds synthetic data only (SKILL.md:108-113). In the body's words, grounding the mockup in the product's look would "recover much of the realism the current default buys", and the real stack stays an explicit override for layout that depends on live data volume, as the body's proposed approach says. Option 3 adds a question to every run, which the body rejects as friction.
    2. Must explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429 land first?
      Decided: Yes. Until it lands, the mockup substrate still forces a different look per variant (SKILL.md:134-138, :195), so flipping the default first would put existing-app work on the look the owner rejected in explore-directions: HTML mockups of an existing app's feature should keep the app's look #8429.
    3. Grandfathered or adopt rendered-views?
      Decided: Stays grandfathered. The convention holds current emitters "grandfathered on their shipped ladder and medium only" and lists prototype:explore-directions (docs/conventions/rendered-views/README.md:552-555). The HTML mockup is already a host on that shipped ladder (SKILL.md:77), so making it the default adds no medium.

    Blocked by: #8429.

    Acceptance criteria: the body's five criteria stand as written. One is added:

    • prototype:explore-directions remains on the grandfathered list in docs/conventions/rendered-views/README.md, and the pull request says so.
  10. melodic-automation-lanes commented on Oct 26, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #8429 is not closed by a listed human or a merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions