SaaS Authoring Trials
M20 measures the end-to-end authoring path after the SaaS authoring, corpus, guided UX, multi-service pattern, and trusted-handoff milestones.
The trial target is deterministic package evidence, not live-provider
execution. Trial runs use existing project.md briefs and checked-in
reference/intent.hcl files as the documented manual equivalent of a completed
guided authoring session, then run normal OpenUdon build, review, approval, and
dry-run gates in ignored local workdirs.
Trial Harness
Use ignored local output under .openudon-run/m20-trials:
mkdir -p .openudon-run/m20-trials/approvals
cp -R examples/eval/<fixture> .openudon-run/m20-trials/<fixture>
mkdir -p .openudon-run/m20-trials/<fixture>/workflows
cp .openudon-run/m20-trials/<fixture>/reference/intent.hcl \
.openudon-run/m20-trials/<fixture>/workflows/intent.hcl
go run ./cmd/icot lint --example ./examples/eval/<fixture>
go run ./cmd/openudon build --example ./.openudon-run/m20-trials/<fixture>
go run ./cmd/openudon approval-template \
--example ./.openudon-run/m20-trials/<fixture> \
--state approved_for_sandbox \
--reviewer "M20 Trial" \
> .openudon-run/m20-trials/approvals/<fixture>.json
go run ./cmd/openudon run \
--example ./.openudon-run/m20-trials/<fixture> \
--tier sandbox \
--approval .openudon-run/m20-trials/approvals/<fixture>.json \
--workdir .openudon-run/m20-trials/workdir-<fixture> \
--dry-run
Do not commit .openudon-run output or approval JSON. The committed evidence is
the matrix below plus any fixture/doc repairs promoted from the trial.
Trial Matrix
| Fixture | Service Family | Policy | iCoT Lint | Build/Assess | Approval Dry Run | Result |
|---|---|---|---|---|---|---|
slack-message-audit-log |
Slack | strict native | pass | pass | pass | Converges after fixing renderer input wording in project.md. |
gmail-send-audit-receipt |
Gmail | strict native | pass | pass | pass | Converges; good single-service side-effect demo. |
weather-toronto |
OpenWeatherMap | native/reference | pass | pass | pass | Converges; useful read-style credential binding demo. |
itops-slack-jira-issue-intake |
Slack/Jira | strict multi-service | pass | fail | not run | OpenAPI/security mapping gap: Authorization is not declared by getSlackMessage. |
itops-incident-response-archive |
Jira/Slack/Drive | strict multi-service | pass | fail | not run | OpenAPI/security mapping gap: Authorization is not declared by createIssue. |
order-fulfillment-chain |
Customer/Inventory/Order | strict multi-service | pass | fail | not run | OpenAPI/security mapping gap: Authorization is not declared by getCustomer. |
n8n-hubspot-deal-list |
HubSpot | advisory n8n-derived | pass | fail | not run | Copied OpenAPI/request mapping gap: limit is not declared by listDeals. |
n8n-airtable-record-get |
Airtable | advisory n8n-derived | pass | fail | not run | Copied OpenAPI/request mapping gap: baseId is not declared by getAirtableRecord. |
Gap Matrix
| Gap Class | Evidence | Follow-Up |
|---|---|---|
| Prompt/readiness | All selected briefs pass icot lint; no M20 blocking prompt/readiness gap was found. |
Keep current guided questions as the baseline for M21. |
| Function contract wording | slack-message-audit-log initially failed because Inputs: ok, channel, and ts did not parse as the explicit ts input. |
Fixed wording to Inputs: ok, channel, ts; keep terse comma-separated function inputs in strict fixtures. |
| OpenAPI security mapping | Slack/Jira, incident archive, and order fulfillment fail when reference intents bind Authorization but request placement does not expose it as an operation field. |
M21 should normalize security binding conventions in strict multi-service fixtures or improve security-field placement support. |
| Copied OpenAPI parameter shape | HubSpot and Airtable advisory fixtures fail because copied OpenAPI operation metadata does not expose the request fields used by the reference intent. | Keep advisory; graduate only after local OpenAPI slices and request mappings are normalized. |
| Review/handoff | Passing package trials have M19 review checks and trusted-runner dry-run evidence. | Reuse M19 evidence shape for promoted M21 fixtures. |
| Live-provider behavior | Not tested. | Remains local/manual release evidence only. |
Promotion Candidates
Immediate M21 candidates:
slack-message-audit-loggmail-send-audit-receiptweather-toronto
Repair-first M21 candidates:
itops-slack-jira-issue-intakeitops-incident-response-archiveorder-fulfillment-chain
Keep advisory until normalized:
n8n-hubspot-deal-listn8n-airtable-record-get
The main M21 implementation priority should be security/request-field normalization for strict multi-service packages before increasing fixture volume.
M21 Follow-Up
M21 repaired bearer security request placement so the strict multi-service
fixtures can build from their reference intents and pass sandbox dry-run gates.
weather-toronto also gained strict native authoring metadata as the first
trial-backed service-diversity promotion.