Status: Real /genpage capture (2026-05-21). Both layers fully green.
First real capture taken after the v2.2 planner-spec tightening landed.
Captured from a real /genpage session against
https://contosobapenv0001.crmtest.dynamics.com. Driven by
claude-sonnet-4-6 under the v2.1 plugin + v2.2 Phase 0.5 manifest generator
- v2.2 spec-tightening. Working dir was
D:/temp/recruitment-app/.
Prompt was the eval 11 prompt verbatim:
Build me three pages for a recruitment app: a candidate list page, an interview schedule page, and a hiring metrics dashboard. Use the contact and appointment entities.
This was the most complex flow yet: 3 parallel page-builders, PAGEREF cross-navigation resolution in Phase 6.5, new-app creation, and solution selection on a code-only flow (the new app triggered the metadata gate).
- Layer 1 fully clean (24 pass / 0 fail / 34 skip — all phase-specific expectations either pass or correctly skip).
- Layer 2 fully clean (34 pass / 0 fail / 2 skip).
- v2.2 planner-spec tightening works. The workflow-log records every
prereq command verbatim (
node --version,pac help,pac auth list,pac model list-tables,pac model list-languages,pac model list,pac solution list), everyAskUserQuestioncall with the answer, theEnterPlanMode calledmarker with the user response, and the fullpac model genpage uploadcommand with--promptand all flags echoed. - Multi-page parallel dispatch is recorded in the log: "Dispatched 3 genpage-page-builder agents in parallel".
- Phase 6.5 PAGEREF resolution is correctly recorded: filename → page-id
map, longest-key-first replacement, re-upload with
--page-idand a delta--prompt. - Phase 0.5 manifest generator ran with
--features charts(hiring metrics dashboard uses D3), and the capture script correctly skippedpackage.json+genpage.d.tsas scaffolding.
This capture surfaced 6 real-world patterns that the runner regexes were
too narrow to accept. Fixed in lib/assertions-layer-1.js and
lib/assertions-layer-2.js:
pac auth listactive environment reporting — accept Dataverse env URL near the auth-list output (real captures don't put the literal word "environment" before the URL).- New-or-edit question — accept implicit-new determination via plan's
## Pagessection (the planner can infer new from$ARGUMENTSwithout an explicit AskUserQuestion). newAppNeededplan detection — accept "App: create new:" wording in the## Environmentsection (the canonical phrasing per plan-schema).- Solution enumeration — accept
pac solution listas an alternative todataverse-request.js /solutions(functionally equivalent). - Multi-page parallel dispatch — accept singular "page-builder" alongside plural "page-builders".
- Xrm.Navigation.navigateTo with optional chaining + aliasing — accept
xrm?.Navigation?.navigateToandxrm.Navigation.navigateTo(with a(window as any).Xrmcast nearby), not just literalXrm.Navigation.navigateTo. (window as any).__cacheparen-cast pattern — accept alongside thewindow as unknownandwindow.__fooforms.
These relaxations only accept functionally-equivalent alternatives — they don't loosen the rules to admit drift. Each one came from observing a real agent output and confirming the alternative pattern satisfies the rule's intent.
| File | Source |
|---|---|
candidate-list.tsx |
Generated by page-builder A |
interview-schedule.tsx |
Generated by page-builder B (receives pageInput.contactId from candidate-list) |
hiring-metrics-dashboard.tsx |
Generated by page-builder C (resolved PAGEREF_ tokens in Phase 6.5) |
RuntimeTypes.ts |
Generated by pac model genpage generate-types --data-sources "contact,appointment" |
workflow-log.md |
Recorded during the run — command-verbatim format per v2.2 spec |
genpage-plan.md |
Written by genpage-planner agent |