@uipath/skills 1.199.0 → 1.200.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CODEOWNERS +14 -8
- package/README.md +18 -3
- package/assets/skill-status.json +9 -1
- package/assets/uip-catalog-snapshot.json +227 -21
- package/package.json +11 -2
- package/scripts/npm-package-lifecycle.mjs +46 -0
- package/skills/uipath-admin/SKILL.md +5 -1
- package/skills/uipath-admin/references/audit-commands.md +1 -1
- package/skills/uipath-admin/references/audit-workflow-guide.md +9 -0
- package/skills/uipath-agents/SKILL.md +2 -2
- package/skills/uipath-agents/references/lowcode/capabilities/context/index.md +7 -0
- package/skills/uipath-agents/references/lowcode/capabilities/integration-service/integration-service.md +5 -6
- package/skills/uipath-agents/references/lowcode/critical-rules/critical-rules.md +1 -1
- package/skills/uipath-agents/references/lowcode/evaluations/evaluation-sets.md +5 -0
- package/skills/uipath-agents/references/lowcode/project-lifecycle.md +3 -3
- package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +3 -2
- package/skills/uipath-api-workflow/SKILL.md +2 -1
- package/skills/uipath-api-workflow/references/cli-reference.md +3 -3
- package/skills/uipath-coded-apps/SKILL.md +3 -2
- package/skills/uipath-coded-apps/assets/fixtures/governance-dashboard-starter-kit.tar.gz +0 -0
- package/skills/uipath-coded-apps/assets/templates/web-app-template.md +1 -1
- package/skills/uipath-coded-apps/references/create-web-app.md +60 -48
- package/skills/uipath-coded-apps/references/dashboards/CAPABILITY.md +2 -2
- package/skills/uipath-coded-apps/references/dashboards/plugins/build/impl.md +2 -2
- package/skills/uipath-coded-apps/references/dashboards/primitives/tier-resolution.md +16 -16
- package/skills/uipath-coded-apps/references/oauth-scopes.md +28 -272
- package/skills/uipath-coded-apps/references/sdk/action-center.md +26 -243
- package/skills/uipath-coded-apps/references/sdk/agents.md +20 -130
- package/skills/uipath-coded-apps/references/sdk/conversational-agent.md +52 -706
- package/skills/uipath-coded-apps/references/sdk/data-fabric.md +20 -237
- package/skills/uipath-coded-apps/references/sdk/feedback.md +4 -139
- package/skills/uipath-coded-apps/references/sdk/governance-traces.md +7 -55
- package/skills/uipath-coded-apps/references/sdk/governance.md +4 -44
- package/skills/uipath-coded-apps/references/sdk/imports.md +77 -35
- package/skills/uipath-coded-apps/references/sdk/maestro.md +29 -406
- package/skills/uipath-coded-apps/references/sdk/orchestrator.md +30 -324
- package/skills/uipath-coded-apps/references/sdk/pagination.md +9 -67
- package/skills/uipath-coded-apps/references/sdk/traces.md +8 -43
- package/skills/uipath-functions/SKILL.md +23 -23
- package/skills/uipath-governance/SKILL.md +5 -4
- package/skills/uipath-governance/references/cli-cheatsheet.md +2 -1
- package/skills/uipath-governance/references/compliance-pack/coverage/impl.md +143 -58
- package/skills/uipath-governance/references/compliance-pack/restore/impl.md +61 -0
- package/skills/uipath-human-in-the-loop/SKILL.md +4 -2
- package/skills/uipath-insights/SKILL.md +17 -18
- package/skills/uipath-ixp/SKILL.md +12 -7
- package/skills/uipath-ixp/references/cli-reference.md +71 -9
- package/skills/uipath-ixp/references/improve-prompts-guide.md +23 -9
- package/skills/uipath-ixp/references/label-documents-guide.md +33 -5
- package/skills/uipath-maestro-bpmn/SKILL.md +15 -14
- package/skills/uipath-maestro-bpmn/references/cli-conventions.md +15 -6
- package/skills/uipath-maestro-bpmn/references/structural-bpmn.md +18 -17
- package/skills/uipath-maestro-case/SKILL.md +46 -33
- package/skills/uipath-maestro-case/assets/templates/sdd-template.md +77 -37
- package/skills/uipath-maestro-case/assets/templates/sdd-viewer.html +0 -2
- package/skills/uipath-maestro-case/references/bindings-and-expressions.md +3 -1
- package/skills/uipath-maestro-case/references/bindings-v2-sync.md +2 -2
- package/skills/uipath-maestro-case/references/brownfield.md +15 -5
- package/skills/uipath-maestro-case/references/case-commands.md +19 -3
- package/skills/uipath-maestro-case/references/case-editing-operations.md +24 -21
- package/skills/uipath-maestro-case/references/case-schema.md +38 -16
- package/skills/uipath-maestro-case/references/connector-trigger-common.md +15 -8
- package/skills/uipath-maestro-case/references/evals/evals.json +35 -18
- package/skills/uipath-maestro-case/references/implementation.md +86 -71
- package/skills/uipath-maestro-case/references/phase-0-interview.md +92 -23
- package/skills/uipath-maestro-case/references/phased-execution.md +70 -55
- package/skills/uipath-maestro-case/references/placeholder-tasks.md +5 -5
- package/skills/uipath-maestro-case/references/planning.md +57 -9
- package/skills/uipath-maestro-case/references/plugins/case/impl-json.md +7 -5
- package/skills/uipath-maestro-case/references/plugins/case/planning.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/impl-json.md +5 -5
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/impl-json.md +41 -5
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/planning.md +27 -3
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/impl-json.md +6 -6
- package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/planning.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/impl-json.md +20 -7
- package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/planning.md +37 -4
- package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +24 -13
- package/skills/uipath-maestro-case/references/plugins/sla/planning.md +9 -3
- package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +4 -0
- package/skills/uipath-maestro-case/references/plugins/stages/planning.md +4 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/action/impl-json.md +3 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/action/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/case-management/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/planning.md +2 -0
- package/skills/uipath-maestro-case/references/plugins/tasks/create-inline-common.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/tasks/process/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/process/planning.md +6 -4
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/impl-json.md +3 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/rpa/planning.md +4 -2
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/impl-json.md +4 -3
- package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/planning.md +4 -0
- package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +17 -14
- package/skills/uipath-maestro-case/references/plugins/triggers/event/planning.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +13 -10
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +18 -16
- package/skills/uipath-maestro-case/references/plugins/triggers/timer/planning.md +2 -2
- package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +1 -1
- package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +11 -9
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +6 -2
- package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +19 -1
- package/skills/uipath-maestro-case/references/registry-discovery.md +3 -3
- package/skills/uipath-maestro-case/references/sdd-generation-rules.md +155 -51
- package/skills/uipath-maestro-case/references/sla-response-shapes.md +74 -0
- package/skills/uipath-maestro-flow/SKILL.md +4 -3
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +3 -0
- package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +10 -17
- package/skills/uipath-maestro-flow/references/author/references/editing-operations.md +1 -1
- package/skills/uipath-maestro-flow/references/author/references/greenfield.md +8 -6
- package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +1 -1
- package/skills/uipath-maestro-flow/references/author/references/plugins/agent/impl.md +4 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/agentic-process/impl.md +3 -7
- package/skills/uipath-maestro-flow/references/author/references/plugins/api-workflow/impl.md +5 -8
- package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +11 -4
- package/skills/uipath-maestro-flow/references/author/references/plugins/flow/impl.md +3 -7
- package/skills/uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md +14 -17
- package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +60 -13
- package/skills/uipath-maestro-flow/references/author/references/plugins/queue/impl.md +2 -14
- package/skills/uipath-maestro-flow/references/author/references/plugins/rpa/impl.md +4 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/script/impl.md +3 -0
- package/skills/uipath-maestro-flow/references/author/references/plugins/subflow/impl.md +5 -9
- package/skills/uipath-maestro-flow/references/author/references/plugins/transform/impl.md +13 -0
- package/skills/uipath-maestro-flow/references/shared/action-nodes.md +2 -2
- package/skills/uipath-maestro-flow/references/shared/file-format.md +16 -12
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +3 -3
- package/skills/uipath-planner/SKILL.md +1 -1
- package/skills/uipath-planner/references/non-pdd-lane-guide.md +1 -1
- package/skills/uipath-platform/SKILL.md +1 -1
- package/skills/uipath-platform/references/data-fabric/bulk-import.md +10 -27
- package/skills/uipath-platform/references/data-fabric/choice-sets.md +7 -64
- package/skills/uipath-platform/references/data-fabric/data-fabric.md +76 -267
- package/skills/uipath-platform/references/data-fabric/entity-schema.md +23 -99
- package/skills/uipath-platform/references/data-fabric/file-attachments.md +5 -28
- package/skills/uipath-platform/references/data-fabric/filter-platform-contract.md +2 -2
- package/skills/uipath-platform/references/data-fabric/records-query.md +11 -32
- package/skills/uipath-platform/references/integration-service/reference-resolution.md +6 -2
- package/skills/uipath-platform/references/licensing/consumables-report.md +18 -0
- package/skills/uipath-platform/references/licensing/licensing.md +1 -1
- package/skills/uipath-platform/references/orchestrator/run-jobs.md +9 -2
- package/skills/uipath-platform/references/orchestrator/setup-environment.md +9 -0
- package/skills/uipath-platform/references/traces/feedback.md +4 -1
- package/skills/uipath-process-mining/SKILL.md +97 -0
- package/skills/uipath-process-mining/references/app-types.md +66 -0
- package/skills/uipath-process-mining/references/data-model.md +130 -0
- package/skills/uipath-process-mining/references/lifecycle-and-rbac.md +67 -0
- package/skills/uipath-process-mining/references/model-editing.md +112 -0
- package/skills/uipath-process-mining/references/pre-flight.md +119 -0
- package/skills/uipath-process-mining/references/querying.md +66 -0
- package/skills/uipath-process-mining/references/transformations.md +80 -0
- package/skills/uipath-process-mining/references/uip-pm-cli.md +145 -0
- package/skills/uipath-review/SKILL.md +23 -18
- package/skills/uipath-review/references/agents/agent-grading-rubric.md +1 -1
- package/skills/uipath-review/references/agents/agent-review-checklist.md +0 -4
- package/skills/uipath-review/references/agents/agents-coded-rules.md +1 -10
- package/skills/uipath-review/references/agents/agents-lowcode-rules.md +3 -6
- package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +62 -14
- package/skills/uipath-review/references/agents/guardrails/guardrails-review.md +60 -4
- package/skills/uipath-review/references/review-workflow-guide.md +3 -2
- package/skills/uipath-review/references/rule-catalog-workflow.md +4 -5
- package/skills/uipath-rpa/.maintenance/pattern-card-maintenance.md +20 -0
- package/skills/uipath-rpa/SKILL.md +57 -55
- package/skills/uipath-rpa/agents/uipath-project-discovery-agent.md +75 -19
- package/skills/uipath-rpa/assets/codedworkflow-template.md +245 -11
- package/skills/uipath-rpa/references/cli-reference.md +229 -6
- package/skills/uipath-rpa/references/coded/codedworkflow-reference.md +158 -2
- package/skills/uipath-rpa/references/coded/integration-service-guide.md +6 -5
- package/skills/uipath-rpa/references/coded/operations-guide.md +273 -5
- package/skills/uipath-rpa/references/coded-vs-xaml-guide.md +3 -3
- package/skills/uipath-rpa/references/common-pattern-card.md +303 -0
- package/skills/uipath-rpa/references/data-manipulation-guide.md +18 -3
- package/skills/uipath-rpa/references/debugging.md +0 -2
- package/skills/uipath-rpa/references/environment-setup.md +309 -1
- package/skills/uipath-rpa/references/error-handling-guide.md +1 -1
- package/skills/uipath-rpa/references/execution-maps-guide.md +110 -0
- package/skills/uipath-rpa/references/is-connector-xaml-guide.md +58 -4
- package/skills/uipath-rpa/references/legacy/activity-docs/Excel.md +1 -1
- package/skills/uipath-rpa/references/legacy/activity-docs/_DU-PROCESS.md +0 -2
- package/skills/uipath-rpa/references/legacy/activity-docs/_INDEX.md +2 -2
- package/skills/uipath-rpa/references/legacy/activity-docs/_PATTERNS.md +1 -1
- package/skills/uipath-rpa/references/legacy/activity-docs/_REFRAMEWORK.md +2 -7
- package/skills/uipath-rpa/references/legacy/cli-reference.md +599 -0
- package/skills/uipath-rpa/references/legacy/error-handling-guide.md +2 -2
- package/skills/uipath-rpa/references/legacy/legacy-mode-guide.md +16 -16
- package/skills/uipath-rpa/references/legacy/project-organization-guide.md +2 -2
- package/skills/uipath-rpa/references/legacy/selector-guide.md +163 -1
- package/skills/uipath-rpa/references/legacy/testing-guide.md +246 -3
- package/skills/uipath-rpa/references/legacy/xaml-basics-and-rules.md +267 -2
- package/skills/uipath-rpa/references/library-authoring-guide.md +4 -3
- package/skills/uipath-rpa/references/testing-guide.md +2 -28
- package/skills/uipath-rpa/references/trigger-pattern-guide.md +1 -1
- package/skills/uipath-rpa/references/xaml/canvas-layout-guide.md +140 -33
- package/skills/uipath-rpa/references/xaml/common-pitfalls.md +57 -240
- package/skills/uipath-rpa/references/xaml/csharp-activity-binding-guide.md +42 -2
- package/skills/uipath-rpa/references/xaml/long-running-workflow-guide.md +1 -1
- package/skills/uipath-rpa/references/xaml/xaml-basics-and-rules.md +194 -228
- package/skills/uipath-solution/references/activate-and-manage.md +22 -0
- package/skills/uipath-solution/references/develop-solution.md +26 -2
- package/skills/uipath-solution/references/pack-and-deploy.md +43 -9
- package/skills/uipath-test/SKILL.md +4 -4
- package/skills/uipath-test/references/playwright-first-mile-guide.md +5 -4
- package/skills/uipath-test/references/publish-and-link-guide.md +2 -2
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/click-silent-no-op.md +5 -5
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/playbooks/queue-operation-failed.md +20 -4
- package/skills/uipath-troubleshoot/references/activity-packages/classic-activities/summary.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/csv-activities/playbooks/read-csv-file-not-found.md +12 -0
- package/skills/uipath-troubleshoot/references/activity-packages/mail-activities/playbooks/send-outlook-mail-failures.md +12 -1
- package/skills/uipath-troubleshoot/references/activity-packages/system-activities/playbooks/get-asset-activity-bug-silent-failure.md +2 -1
- package/skills/uipath-troubleshoot/references/activity-packages/terminal-activities/playbooks/terminal-session-connection-failed.md +5 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/click-silent-no-op.md +5 -5
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/dependency-version-conflict.md +27 -6
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/napplicationcard-view-generation-failed.md +10 -0
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/scope-container-wrong-page.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/summary.md +1 -1
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/overview.md +4 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-auth-401-403.md +44 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-connection-failure.md +2 -1
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-content-type-rejected.md +37 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/http-request-proxy-blocked.md +39 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/package-version-mismatch.md +42 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/playbooks/securestring-misuse-analyzer.md +41 -0
- package/skills/uipath-troubleshoot/references/activity-packages/web-activities/summary.md +5 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-null-reference.md +14 -1
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/connector-runtime-exception.md +2 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/is-activities-prerelease-not-found.md +39 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/playbooks/response-content-too-large.md +41 -0
- package/skills/uipath-troubleshoot/references/products/integration-service/summary.md +9 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/console-conflict-login-to-console.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/credential-store-unavailable.md +42 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/executor-start-transient-rerun.md +49 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-consecutive-system-exceptions.md +47 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-faulted-session-timeout.md +19 -19
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-output-too-large.md +47 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/job-stopped-generic-exit-code.md +55 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/known-issue-robot-defect.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/platform-incident-correlation.md +45 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/screen-capture-handle-invalid.md +43 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-license-quota.md +43 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/serverless-time-limit-exceeded.md +34 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/playbooks/workstation-in-use-machine-slots.md +40 -0
- package/skills/uipath-troubleshoot/references/products/orchestrator/summary.md +13 -1
- package/version-manifest.json +2 -2
- package/skills/uipath-maestro-bpmn/validator/README.md +0 -224
- package/skills/uipath-maestro-bpmn/validator/model.mjs +0 -419
- package/skills/uipath-maestro-bpmn/validator/package.json +0 -17
- package/skills/uipath-maestro-bpmn/validator/rules.mjs +0 -1403
- package/skills/uipath-maestro-bpmn/validator/samples/invalid-conditional-and-variable.bpmn +0 -25
- package/skills/uipath-maestro-bpmn/validator/samples/valid-baseline.bpmn +0 -52
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.0.bpmn +0 -157
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/A.2.1.bpmn +0 -333
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.1.0.bpmn +0 -598
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/B.2.0.bpmn +0 -1709
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.2.0.bpmn +0 -564
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.3.0.bpmn +0 -671
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.4.0.bpmn +0 -1045
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.5.0.bpmn +0 -1176
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.6.0.bpmn +0 -670
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/C.7.0.bpmn +0 -466
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Can_Parse_Complex_Process_With_Task_Gateway_BoundaryEvent_etc.bpmn +0 -74
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExclusiveGatewayDefaultFlow.bpmn +0 -32
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/ExternalAgentWorkflow.bpmn +0 -62
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Golden_Scenario.initial.bpmn +0 -361
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/InclusiveJoinRouteAwayBranch.bpmn +0 -62
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_AsyncExecution_And_Create_CorrectModel.bpmn +0 -74
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_ExtractionValidation_And_Create_CorrectModel.bpmn +0 -35
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_FileUpload_And_Create_CorrectModel.bpmn +0 -33
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_IXP_Extraction_JobAttachment_And_Create_CorrectModel.bpmn +0 -35
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/Parse_SubProcess_With_Multiple_Element_Types.bpmn +0 -76
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartEventWithOutputs.bpmn +0 -36
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/StartGatewayEnd.bpmn +0 -44
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all elements.bpmn +0 -516
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/all_sequence_flow_types.bpmn +0 -173
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/demo.bpmn +0 -181
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-collapsed.bpmn +0 -126
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-001-expanded.bpmn +0 -122
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/expected-findings/subprocess-example-003-collapsed_deeply-nested.bpmn +0 -438
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.1.0.bpmn +0 -87
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/A.3.0.bpmn +0 -165
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ApiWorkflow.bpmn +0 -39
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnNestedSubProcessTests.bpmn +0 -102
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnTimerBoundaryEvents.bpmn +0 -160
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithCatchAllErrorEventSubProcess.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/BpmnXmlWithSpecificErrorEventSubProcess.bpmn +0 -46
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/CaseManagementWithConstantIdentifier.bpmn +0 -218
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorBoundary.bpmn +0 -78
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ErrorPropagationInEventSubprocess.bpmn +0 -340
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/EventBasedGatewayFirstCatcherWins.bpmn +0 -56
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Example-EventBasedGateway.bpmn +0 -117
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewayConditional.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveGatewaySharedEndEvent.bpmn +0 -45
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ExclusiveWithParallelGateway.bpmn +0 -68
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/FourScriptTasks.bpmn +0 -84
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/HitlTaskOnly.bpmn +0 -55
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/InclusiveGatewayForkJoin.bpmn +0 -69
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_BPMN_Elements_And_Create_CorrectModel.bpmn +0 -20
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_HttpRequest_ServiceTask_And_Create_Correct_Model.bpmn +0 -34
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_MessageBoundaryEvent_And_Create_CorrectModel.bpmn +0 -87
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Script_Task_V2_And_Create_Correct_Model.bpmn +0 -31
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/Parse_Sets_Containers_Properly.bpmn +0 -129
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/ScriptWritesVariableThenGatewayBranches.bpmn +0 -59
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/boundaryevent.bpmn +0 -30
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/collapsed-subprocess.bpmn +0 -83
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/connectable-types.bpmn +0 -85
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/extensions-orchestrator-start-job.bpmn +0 -80
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/multiparticipantpool.bpmn +0 -77
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/nestedsubprocess.bpmn +0 -36
- package/skills/uipath-maestro-bpmn/validator/test/fixtures/known-good/simple.bpmn +0 -59
- package/skills/uipath-maestro-bpmn/validator/test/integration.test.mjs +0 -146
- package/skills/uipath-maestro-bpmn/validator/test/model-helpers.mjs +0 -42
- package/skills/uipath-maestro-bpmn/validator/test/ported-rule-tests.mjs +0 -983
- package/skills/uipath-maestro-bpmn/validator/test/run-tests.mjs +0 -530
- package/skills/uipath-maestro-bpmn/validator/uipath-moddle.v1.json +0 -715
- package/skills/uipath-maestro-bpmn/validator/validate-bpmn.mjs +0 -164
- package/skills/uipath-review/references/agents/agents-common-rules.md +0 -32
- package/skills/uipath-rpa/assets/before-after-hooks-template.md +0 -115
- package/skills/uipath-rpa/assets/helper-utility-template.md +0 -22
- package/skills/uipath-rpa/assets/testcase-template.md +0 -92
- package/skills/uipath-rpa/references/coded/coding-guidelines.md +0 -255
- package/skills/uipath-rpa/references/coded/inspect-package-guide.md +0 -80
- package/skills/uipath-rpa/references/coded/third-party-packages-guide.md +0 -67
- package/skills/uipath-rpa/references/connector-capabilities.md +0 -79
- package/skills/uipath-rpa/references/legacy/activity-docs/Testing.md +0 -95
- package/skills/uipath-rpa/references/legacy/activity-docs/UIAutomation.md +0 -159
- package/skills/uipath-rpa/references/legacy/common-pitfalls.md +0 -318
- package/skills/uipath-rpa/references/legacy/discovery-workflow.md +0 -147
- package/skills/uipath-rpa/references/legacy/environment-setup.md +0 -78
- package/skills/uipath-rpa/references/legacy/project-structure.md +0 -206
- package/skills/uipath-rpa/references/legacy/test-data-guide.md +0 -142
- package/skills/uipath-rpa/references/legacy/validation-and-fixing.md +0 -154
- package/skills/uipath-rpa/references/project-structure-guide.md +0 -168
- package/skills/uipath-rpa/references/project-structure.md +0 -135
- package/skills/uipath-rpa/references/publishing-guide.md +0 -80
- package/skills/uipath-rpa/references/validation-guide.md +0 -170
- package/skills/uipath-rpa/references/xaml/csharp-expression-pitfalls.md +0 -43
- package/skills/uipath-rpa/references/xaml/flowchart-guide.md +0 -113
- package/skills/uipath-rpa/references/xaml/workflow-guide.md +0 -258
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# SDD Generation Rules
|
|
2
2
|
|
|
3
|
-
Content-quality contract for Phase 0's `sdd.md`. The interview in [phase-0-interview.md](phase-0-interview.md) owns the **conversation flow** (Listen / Sketch / Confirm / Build start). This file owns the **content rules** the in-memory case model must satisfy before the confirmation is presented — and therefore before `sdd.md` renders from it. Where older wording says "Approve" or "the Approve summary", read the §Confirm checkpoint and its `Decisions I
|
|
3
|
+
Content-quality contract for Phase 0's `sdd.md`. The interview in [phase-0-interview.md](phase-0-interview.md) owns the **conversation flow** (Listen / Sketch / Confirm / Build start). This file owns the **content rules** the in-memory case model must satisfy before the confirmation is presented — and therefore before `sdd.md` renders from it. Where older wording says "Approve" or "the Approve summary", read the §Confirm checkpoint and its `Decisions I Made` table.
|
|
4
4
|
|
|
5
5
|
Phase 1 trusts `sdd.md` as written (SKILL.md Rule 2). These rules make that trust safe.
|
|
6
6
|
|
|
7
7
|
## Mental model: stages, secondary stages, tasks
|
|
8
8
|
|
|
9
|
-
Reason the case shape from the process the user describes — **do not reach for the template first.** The template renders a shape you already decided; it does not decide it for you. Build the model in this order: stages → tasks → types →
|
|
9
|
+
Reason the case shape from the process the user describes — **do not reach for the template first.** The template renders a shape you already decided; it does not decide it for you. Build the model in this order: stages → tasks → types → sweep other paths. Each concept below is a question to ask of the user's process, not a slot to fill.
|
|
10
10
|
|
|
11
11
|
**Stage** — a phase the case works through: a bounded milestone with an *entry* (when it starts), *tasks* (the work done inside it), and a *completion/exit* (when it's done and where the case goes next). Stages are the backbone; they run in sequence (or parallel), wired by **entry/exit conditions** (the case has no edges — transitions are condition-driven). Derive one stage per milestone the user names ("intake", "underwriting", "funding"). Ask: *what is the case working toward right now, and what makes that done?* A stage that "marks the case complete" is on the main flow (`isRequired: true`).
|
|
12
12
|
|
|
@@ -16,11 +16,56 @@ Reason the case shape from the process the user describes — **do not reach for
|
|
|
16
16
|
- **Entered by its own condition**, never by an edge — but the entry shape depends on the lane's trigger:
|
|
17
17
|
- **(a) Mid-stage interrupt** — user-launched (`user-selected-stage`, paired with a `wait-for-user` exit) or external (`wait-for-connector`). Fires *while the origin is still active* and genuinely interrupts it.
|
|
18
18
|
- **(b) Decision/signal divert** — the **origin** stage carries a **gated diverting exit** (`Marks Stage Complete: No`, `IF` on the decision/signal, `exitToStageId` → this lane), and this lane's `selected-stage-exited(origin) + IF` entry **matches** it. Fires when the origin *exits* — a divert-and-return, NOT a true mid-stage interrupt. The secondary lane still carries `Interrupting: Yes`; a variable-driven mid-stage interrupt is not expressible without a connector, so a decision- or signal-gated lane MUST use shape (b). See [§ Logical integrity step 5](#logical-integrity--stage-graph).
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
19
|
+
- **(c) SLA status response (`enter-stage` only)** — `sla-status-change` references the target SLA rule, plus one of its at-risk escalation rules when the status is at-risk. It can fire while any stage in that SLA's scope is active. Interrupting or not depends on what the response does to active work — see § SLA response model. The other SLA response that creates work, `start-task`, is **not** a secondary-stage shape at all: it is a task-entry rule inside the breached stage, so it never reaches this list.
|
|
20
|
+
- **Every secondary-stage entry is interrupting — one carve-out.** Set the stage-level `Interrupting` field to `Yes` and set every Stage Entry Conditions row for that secondary stage to `Interrupting: Yes`. A secondary stage with `Interrupting: No` is misclassified; make it a regular parallel stage or an `adhoc` task instead. **Carve-out:** when an `sla-status-change` response is *parallel oversight* — the breached work keeps running, nothing is paused, taken over, or rerouted — the stage-level `Interrupting` field **and** that entry row both read `No` (§ SLA response model). Never render `Interrupting: Yes` on the stage while its only entry row reads `No`; that contradiction is a blocking render error. The lane stays `stageType: secondary`, `isRequired: false`, and out of the happy-path completion set; do NOT promote it to a regular stage, which would make it required for case completion. This carve-out is scoped to `sla-status-change` only: `wait-for-connector`, `user-selected-stage`, and diverting `selected-stage-exited` rows are always `Yes`.
|
|
21
|
+
- **Exits by intent** — returning/rework lanes use `return-to-origin` to route back to the origin stage; terminal lanes use `exit-only` plus a root case-exit row. Neither shape uses a new edge. Both shapes require `Interrupting: Yes` on the stage and every entry row, except the non-diverting `sla-status-change` oversight row carved out above.
|
|
21
22
|
|
|
22
23
|
Ask: *does this work belong at one fixed point (regular stage), or could it happen at several points / only on a condition (secondary stage)?* "Handle rejected application", "escalate on SLA breach", "rework loop" → secondary. Returning work uses `return-to-origin`; terminal rejection/withdrawal/cancel work uses `exit-only` plus a case-exit row. Pull these out of the main flow; do not string them inline as ordinary stages.
|
|
23
24
|
|
|
25
|
+
**Global-event normalization.** When an external status event (for example, a withdrawal received from a portal) or an SLA status change may happen at any point **and requires case work/routing**, define it once on the destination response, not once per primary stage. Use `wait-for-connector` for the external event and `sla-status-change` for a case/stage SLA response that enters a stage. Do **not** add the same task or exit rule to every primary stage: a true interrupting secondary-stage entry exits whichever stage is active. A recoverable lane returns with `return-to-origin`; a terminal lane uses `exit-only` plus a root case-exit rule.
|
|
26
|
+
|
|
27
|
+
**SLA response model.** Two SLA scopes exist: **case** and **stage**. Separate the clock from the response, and pick the response from the source — not from the scope. Emit-side contract (rule JSON, task-vs-stage entry, CLI-verified shapes): [sla-response-shapes.md](sla-response-shapes.md).
|
|
28
|
+
|
|
29
|
+
| Response | Choose when the source says | Shape | Interrupting |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `notify-only` | notify / alert / email / page a person or group | SLA escalation notification only — no stage, no task | n/a |
|
|
32
|
+
| `start-task` | local work inside the **same** breached stage: reminder, reassignment, manager check, extra approval, follow-up | the follow-up task lives in the breached stage and carries the `sla-status-change` rule on **its own task-entry** row, referencing that stage's own SLA. **No stage-entry row, no new stage** — a stage-entry rule would re-enter the stage and re-run its other tasks | `—` (a task entry interrupts nothing) |
|
|
33
|
+
| `enter-stage` | ownership change, escalation lane, recovery, or a visible lifecycle step | a separate stage carries the `sla-status-change` entry | `Yes` when the response takes over, pauses, exits, or reroutes active work; `No` for parallel oversight while work continues |
|
|
34
|
+
| `exit-stage` | the current stage should end, fail, or route away | stage-exit row | per exit semantics |
|
|
35
|
+
| `exit-case` | the whole case should close, cancel, fail, or reach an alternate terminal outcome | §1.4a case-exit row | per exit semantics |
|
|
36
|
+
|
|
37
|
+
A **case**-level SLA response that changes the graph enters a separate stage. A **stage**-level SLA response may either start a task in the breached stage (`start-task`, a task-entry rule) or route to a separate stage (`enter-stage`, a stage-entry rule that may interrupt or not).
|
|
38
|
+
|
|
39
|
+
**`start-task` vs `enter-stage` is decided by WHERE the work lives — not by whether it interrupts.** `enter-stage` can itself be non-interrupting, so "the team keeps working" does not point to either one. Ask instead: does the source put the follow-up **inside the breached stage's own work**, or does it hand the case to a **separate lane**?
|
|
40
|
+
|
|
41
|
+
| Source wording | Response | What you author |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| "as part of the assessment", "inside the review", "the assessor/reviewer keeps working and also does X", a named task for a manager or peer | `start-task` | one task in the breached stage, carrying `sla-status-change` as its **task-entry** row against that stage's own SLA. **No new stage, and no stage-entry row.** |
|
|
44
|
+
| "hand it to", "a lane/team takes it over", "escalate into <Lane>", "a director tracks it", a named *stage* or lane | `enter-stage` | a separate stage carrying the `sla-status-change` entry row |
|
|
45
|
+
|
|
46
|
+
A named **task** ("raise a Senior Assessor Check approval") is never a reason to mint a stage. If the `Target` you are about to write is the name of a task rather than a stage that the source describes as its own lane, the response is `start-task`, the `Target` cell holds that task name, and the task goes in the breached stage.
|
|
47
|
+
|
|
48
|
+
**Status rides on the escalation reference.** A breach response references the SLA alone — an absent escalation reference *is* how a breach rule is stored. An at-risk response also names one concrete at-risk escalation on that SLA, which must exist: an SLA with no at-risk escalation cannot carry an at-risk response. Never author the Case Designer's `any`-escalation shorthand — released `validate` rejects it as a missing escalation.
|
|
49
|
+
|
|
50
|
+
**Action-task SLA** is not a case/stage `slaRules[]` entry: configure the action task's own timer/SLA fields, and add `sla-status-change` case behavior only when the missed task must change the case graph.
|
|
51
|
+
|
|
52
|
+
**No stated response → default:** at-risk `notify-only` to the owning persona/group; breached `notify-only` to the next escalation tier. Do not invent a stage, task, or routing change unless the source says the breach creates work or changes routing.
|
|
53
|
+
|
|
54
|
+
Expose every choice in the **SLA Response Map** (`Scope | SLA | Status | Response | Target | Interrupting | Rationale`). Never hide breach behavior inside SLA duration text.
|
|
55
|
+
|
|
56
|
+
**Other-path sweep.** Before Phase 0 confirmation, actively look beyond the primary flow. Consider rework / needs-info loops; rejection, withdrawal, and cancellation; SLA escalation; external-system failure; manual override or worker-selected side work; optional side work; and terminal outcomes that differ from successful completion. Do not force every item into a secondary stage: choose the smallest faithful model, such as a secondary stage, terminal case exit, non-completing case exit, task-level branch, `adhoc` task, or SLA notification-only row. Clear source signals are modeled by best assumption and disclosed in the confirmation's **Other Paths Considered** table. When the source has no signal at all, Phase 0 asks one bounded question before confirmation; if the user chooses primary-flow-only, record that as an intentional decision and do not invent a path.
|
|
57
|
+
|
|
58
|
+
**Case execution patterns.** Classify these before choosing rule types:
|
|
59
|
+
|
|
60
|
+
| Pattern | Signal | Case model |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| Strict sequence | "then", "after", "before", direct prerequisite | consecutive single-task sets; every task uses `runs-sequentially` |
|
|
63
|
+
| Parallel after predecessor | "after A, do B and C", both independent | one next task set containing B and C; do not create duplicate `selected-tasks-completed("A")` task entries |
|
|
64
|
+
| Race | confirmation vs timeout/cancellation/withdrawal | listener and clock active while the obligation is pending; downstream work gated by the winning fact |
|
|
65
|
+
| Optional side work | "may", "can manually", "if needed" and no required downstream dependency | `adhoc`, `Required: No`, not selected by required/fan-in rules |
|
|
66
|
+
|
|
67
|
+
For any non-start stage/task entry, identify its concrete producer before the Case Review: source stage exit/completion, source task completion, connector event detail, paired `wait-for-user`, or SLA scope/display name/status/escalation intent. A rule without a producer is a design defect, even if the rule name is schema-valid.
|
|
68
|
+
|
|
24
69
|
**Task** — one unit of work inside a stage, owned by a *persona* (a human role) or by the *system* (automation / AI / API). It has an entry condition (when it runs within the stage), inputs, outputs, and a **type** that says *how* the work gets done. One verb in the user's description ≈ one task. Ask: *who or what performs this, and how?* The "how" answer is the task type — see [§ Choosing the task type](#choosing-the-task-type).
|
|
25
70
|
|
|
26
71
|
Once stages, secondary stages, and tasks are reasoned, the [§ Render contract](#render-contract) below turns each decision into exact cells. Reason first; render second.
|
|
@@ -32,10 +77,10 @@ The case, each stage, and each task move through a lifecycle gated by **rules**
|
|
|
32
77
|
| Gate | What it answers | Legal rule types (CLI) |
|
|
33
78
|
|---|---|---|
|
|
34
79
|
| **Case entry** | how does a case instance begin? | No case-entry condition object — a **trigger** starts the case; the root stage carries `case-entered`. |
|
|
35
|
-
| **Stage entry** | when does this stage activate? | `case-entered` (root only) · `selected-stage-completed` · `selected-stage-exited` · `wait-for-connector` · `user-selected-stage` |
|
|
80
|
+
| **Stage entry** | when does this stage activate? | `case-entered` (root only) · `selected-stage-completed` · `selected-stage-exited` · `wait-for-connector` · `user-selected-stage` · `sla-status-change` |
|
|
36
81
|
| **Stage completion** (`Marks Stage Complete: Yes`) | when is the stage done, on the main flow, a returning lane, or a terminal secondary lane? | `required-tasks-completed` · `wait-for-connector`; exit `type`: `exit-only` / `wait-for-user` / `return-to-origin` |
|
|
37
82
|
| **Stage exit** (`Marks Stage Complete: No`) | early hand-off / route without completing | `selected-tasks-completed` · `wait-for-connector`; exit `type`: `exit-only` / `wait-for-user` |
|
|
38
|
-
| **Task entry** | when does this task start inside its stage? | `current-stage-entered` (stage-started/default tasks) · `selected-tasks-completed` · `wait-for-connector` · `adhoc` · `runs-sequentially` |
|
|
83
|
+
| **Task entry** | when does this task start inside its stage? | `current-stage-entered` (stage-started/default tasks) · `selected-tasks-completed` · `wait-for-connector` · `sla-status-change` (the `start-task` SLA response) · `adhoc` · `runs-sequentially` |
|
|
39
84
|
| **Task completion / exit** | — | A task has **no** exit/completion condition. It completes when its own work finishes; downstream stages/tasks key off that via `required-tasks-completed` / `selected-tasks-completed`. |
|
|
40
85
|
| **Case completion** (`Marks Case Complete: Yes`) | when does the case close successfully? | `required-stages-completed` · `wait-for-connector` |
|
|
41
86
|
| **Case exit** (`Marks Case Complete: No`) | alternate disposition (cancel / route out) | `selected-stage-completed` · `selected-stage-exited` · `wait-for-connector` |
|
|
@@ -43,20 +88,21 @@ The case, each stage, and each task move through a lifecycle gated by **rules**
|
|
|
43
88
|
How to reason with these:
|
|
44
89
|
|
|
45
90
|
- **`required-*` vs `selected-*`.** `required-tasks-completed` / `required-stages-completed` = "all items flagged required are done" (the `isRequired` flow). `selected-tasks-completed` / `selected-stage-completed` / `selected-stage-exited` = "these *specific named* items." Pairing rule (Key Rule 4): `Marks Complete: Yes` pairs only with `required-*`; `selected-*` is for `No` (routing / early exit / alternate disposition). A `Yes` + `selected-*` pair is a schema error.
|
|
46
|
-
- **Secondary stage** uses **stage-entry + stage-exit rules only, never edges** (true of every stage — edges retired). Its entry rules are always interrupting (`isInterrupting: true`). Returning exits use the canonical completion shape `return-to-origin` + `Marks Stage Complete: Yes` + `required-tasks-completed` to rejoin the flow they left; terminal exits use `exit-only` + `Marks Stage Complete: Yes` plus a root case-exit row. **For a decision/signal-routed lane, the routing lives on the *origin* stage:** a gated diverting exit (`Marks Stage Complete: No`, `IF` on the decision/signal, `exitToStageId` → the lane), with the origin's completion exit gated by the inverse `IF` so the two paths are mutually exclusive
|
|
47
|
-
- **Task-entry mode is exclusive.** Use `current-stage-entered` only for stage-started/default tasks. Event-triggered tasks carry the explicit event rule (`wait-for-connector` with connector configuration), adhoc tasks carry only `adhoc`, and sequential tasks carry only `runs-sequentially`; do not add `current-stage-entered` to those tasks just because they are first in a stage. For sequential chains, the first task's `runs-sequentially` means current-stage-entered, and later tasks use it as the preceding-task-completed trigger. `wait-for-connector` makes a gate pause for an inbound connector callback — its `conditionExpression` gates on **case state** only (no `event` payload; in-rule extract-then-gate is unsupported at runtime — gate a downstream condition instead); `adhoc` lets a *task* fire manually from the case app (task-entry only — never a stage-entry rule).
|
|
91
|
+
- **Secondary stage** uses **stage-entry + stage-exit rules only, never edges** (true of every stage — edges retired). Its entry rules are always interrupting (`isInterrupting: true`). Returning exits use the canonical completion shape `return-to-origin` + `Marks Stage Complete: Yes` + `required-tasks-completed` to rejoin the flow they left; terminal exits use `exit-only` + `Marks Stage Complete: Yes` plus a root case-exit row. **For a decision/signal-routed lane, the routing lives on the *origin* stage:** a gated diverting exit (`Marks Stage Complete: No`, `IF` on the decision/signal, `exitToStageId` → the lane), with the origin's completion exit gated by the inverse `IF` so the two paths are mutually exclusive. **For a global connector/SLA event, routing lives only on the destination secondary stage:** no per-origin exit rule is needed. See [§ Logical integrity step 5](#logical-integrity--stage-graph).
|
|
92
|
+
- **Task-entry mode is exclusive.** Use `current-stage-entered` only for stage-started/default tasks. Event-triggered tasks carry the explicit event rule (`wait-for-connector` with connector configuration), adhoc tasks carry only `adhoc`, and sequential tasks carry only `runs-sequentially`; do not add `current-stage-entered` to those tasks just because they are first in a stage. For sequential chains, the first task's `runs-sequentially` means current-stage-entered, and later tasks use it as the preceding-task-completed trigger. `wait-for-connector` makes a gate pause for an inbound connector callback — its `conditionExpression` gates on **case state** only (no `event` payload; in-rule extract-then-gate is unsupported at runtime — gate a downstream condition instead); `adhoc` lets a *task* fire manually from the case app (task-entry only — never a stage-entry rule). A `start-task` SLA response is event-triggered: the task carries `sla-status-change` as its only entry rule, never alongside `current-stage-entered`.
|
|
93
|
+
- **Thresholded role / work gates are executable, not descriptive.** A source rule like "Credit Analyst only over $5M; otherwise Underwriter" must produce a rule, task-entry condition, recipient expression, or computed owner field that references both the threshold and the gated actor/work. Preserve the reviewer-facing phrase close to the expression in the SDD, for example `Credit Analyst route when loanAmount > 5000000`. A persona row alone, or a generic note that does not tie `Credit Analyst` to `>$5M`, is not a modeled gate.
|
|
48
94
|
|
|
49
|
-
**Frontend task-mode mapping.** The UI's `sequential`, `event-triggered`, and `manually-triggered` choices are not interchangeable: sequential means the task-only `runs-sequentially` rule; event-triggered means an explicit event/condition rule (use `wait-for-connector` for an external connector callback); manually-triggered means an `adhoc`-only task with `isRequired: false`. `adhoc` decides how the task starts; it does not decide the task type. A manually triggered task may still be `action`, `agent`, `api-workflow`, `process`, etc. Do not infer one mode from `data.tasks` lanes, and do not add a second entry rule that changes the selected mode.
|
|
95
|
+
**Frontend task-mode mapping.** The UI's `sequential`, `event-triggered`, and `manually-triggered` choices are not interchangeable: sequential means the task-only `runs-sequentially` rule; event-triggered means an explicit event/condition rule (use `wait-for-connector` for an external connector callback); manually-triggered means an `adhoc`-only task with `isRequired: false`. `adhoc` decides how the task starts; it does not decide the task type. A manually triggered task may still be `action`, `agent`, `api-workflow`, `process`, etc. Do not infer one mode from `data.tasks` lanes, and do not add a second entry rule that changes the selected mode. Downstream plans preserve the confirmed SDD mode and rule exactly: a singleton `parallel` + `current-stage-entered` task stays that way, while `sequential` + `runs-sequentially` requires an explicit order or dependency in the source.
|
|
50
96
|
- **`user-selected-stage`** (stage entry) starts a stage on demand by a user rather than by flow. The CLI validator requires it to pair with a `wait-for-user` stage exit elsewhere: a `wait-for-user` exit with no `user-selected-stage` entry — or a `user-selected-stage` entry with no `wait-for-user` exit — fails `validate`.
|
|
51
97
|
|
|
52
98
|
Exact cell formats live in [§ Stage content rules](#stage-content-rules) and [§ Task content rules](#task-content-rules) — this table is the conceptual map of *which rule belongs where*.
|
|
53
99
|
|
|
54
100
|
### Triggers, connectors, variables — how the case meets the world
|
|
55
101
|
|
|
56
|
-
**Trigger** — how a case instance is *born* (`TriggerNode`, `case
|
|
102
|
+
**Trigger** — how a case instance is *born* (`TriggerNode`, `uipath.case.trigger`, field `data.inputs.serviceType`):
|
|
57
103
|
|
|
58
104
|
- `None` → **Manual**: a user or API call starts the case.
|
|
59
|
-
- `
|
|
105
|
+
- `timer` → **Timer**: a schedule starts it. (SDD author token: `Intsvc.TimerTrigger`.)
|
|
60
106
|
- `Intsvc.EventTrigger` → **Connector Event**: an external system fires it.
|
|
61
107
|
|
|
62
108
|
One trigger is the root; additional triggers are secondary. Reason: *what makes a new case appear?* A portal signup, inbound form, or schedule is NEVER Manual — assume the event/timer trigger per the playbook and disclose the decision the moment such a source is named.
|
|
@@ -113,7 +159,7 @@ When signals conflict, apply this priority — top wins:
|
|
|
113
159
|
6. **Inferred defaults** per the assumption playbook in [phase-0-interview.md § Sketch](phase-0-interview.md#sketch--best-assumption-every-field).
|
|
114
160
|
7. **General-practice fallback.**
|
|
115
161
|
|
|
116
|
-
When a higher tier overrides a lower one, apply it and surface it in the confirmation's `Decisions I
|
|
162
|
+
When a higher tier overrides a lower one, apply it and surface it in the confirmation's `Decisions I Made` table with provenance `(source: <higher-tier>-override)`.
|
|
117
163
|
|
|
118
164
|
## Choosing the task type
|
|
119
165
|
|
|
@@ -173,6 +219,8 @@ Reason the shape first — [§ Mental model](#mental-model-stages-secondary-stag
|
|
|
173
219
|
|
|
174
220
|
Phase 1 reads `sdd.md` as written (Rule 2). The following three sections define **what each case / stage / task element MUST contain** before the model may render to `sdd.md`. Every block specifies required vs optional cells, allowed values, source of truth, and the fallback when a value is missing — in Phase 0, "Ask" fallbacks are settled by playbook assumption first and the one clarifying call only when no assumption is defensible.
|
|
175
221
|
|
|
222
|
+
**Template shape is part of the render contract.** A valid model is not enough if the written file collapses into a prose summary. The rendered `sdd.md` must preserve the structure in `assets/templates/sdd-template.md`: title, table of contents, Section 1/2/3/4 headings, case metadata/triggers/variables, the SLA Response Map when any SLA is configured (§1.2b), one full stage block per modeled stage, one full task detail block per modeled task, personas/app views, and integration/resource inventory. The compact Phase 0 confirmation is not an SDD substitute.
|
|
223
|
+
|
|
176
224
|
**Allowed `—`** (cells the user did not touch and Phase 1 can default safely): case-level Description, variable defaults, persona scope notes, app-view detail, secondary-stage description, optional `IF` conditionExpressions, business calendars on timers.
|
|
177
225
|
|
|
178
226
|
**Allowed `<UNRESOLVED>`** (gaps Phase 1 / post-build can resolve): registry IDs (`taskTypeId`, `connectionId`, `actionAppId`, `agentId`, `processOrchestrationId`) when Resolve was skipped or returned 0 matches. Pair every `<UNRESOLVED>` with a review item (§Review items).
|
|
@@ -190,34 +238,41 @@ Defines what `sdd.md` Section 1 (Case Definition) must contain.
|
|
|
190
238
|
| Case Name | yes | PascalCase identifier (e.g., `MortgageLoanOrigination`) | Block Approve. Ask. |
|
|
191
239
|
| Description | optional | One prose sentence | `—` |
|
|
192
240
|
| Identifier prefix | yes | UPPER, 2-4 chars (e.g., `MLO`) | Default mechanically from PascalCase first letters; record in source ledger. |
|
|
193
|
-
| Priority | optional | `Low` / `Medium` / `High` / `Critical` | Default `Medium`; record in source ledger. |
|
|
194
241
|
| Case SLA | conditional | Duration (e.g., `5 business days`) | `—` when case has no SLA; otherwise block Approve. |
|
|
195
242
|
| SLA Type | conditional | `time-based` (single unconditional duration) / `condition-based` (one or more conditionExpression-keyed overrides + a default time-based row) | Default `time-based` when Case SLA set with no per-condition overrides. The FE persists `condition-based` whenever ≥ 1 `slaRules[]` entry carries a non-empty `conditionExpression` (see PO.Frontend `CaseManagementSlaProperties.tsx:27-30`). `condition-based` requires populating the §Variable SLA Rules table; `time-based` omits it. |
|
|
243
|
+
| SLA Title | conditional | Non-empty root-unique SLA rule title, no `:` | Omit the row when Case SLA is `—` (never render `—` here). Else default `SLA Rule 1` and record in source ledger; a title a `sla-status-change` references must be concrete (§ Logical integrity step 6). |
|
|
196
244
|
| Case App | optional | `Enabled` / `Disabled` — whether the in-product Case App UI is on (`metadata.caseAppEnabled`). | Default `Disabled`; record in source ledger. |
|
|
197
245
|
| Task-output passing | optional | `Direct` / `Shared` — `metadata.caseDirectlyPassTaskOutputs`. `Direct` passes a task's outputs straight to downstream tasks (default). | Default `Direct`. |
|
|
198
246
|
|
|
199
|
-
**PO.Frontend validation parity.** Before Approve, apply the same name and SLA checks that the Case App applies
|
|
247
|
+
**PO.Frontend validation parity plus safe generated names.** Before Approve, apply the same name and SLA checks that the Case App applies, then apply the skill's stricter safe-display-name contract to anything the skill generates or carries into Case Designer display/title fields.
|
|
200
248
|
|
|
201
249
|
| Surface | Required checks |
|
|
202
250
|
|---|---|
|
|
203
|
-
| Stage label | Non-empty; unique across stages;
|
|
204
|
-
| Task display name |
|
|
205
|
-
|
|
|
206
|
-
|
|
|
251
|
+
| Stage label | Non-empty; unique across stages; safe display characters only. A non-Case-Manager stage also cannot reuse the reserved default Case Manager stage label when a Case Manager stage exists. |
|
|
252
|
+
| Task display name | Safe display characters only for materialized tasks. |
|
|
253
|
+
| Rule display name | Safe display characters only for entry, exit, task-entry, and case-exit condition display names. |
|
|
254
|
+
| SLA rule title (`displayName`) | Non-empty; unique within the root or stage target; safe display characters only. |
|
|
255
|
+
| Escalation title (`displayName`) | Non-empty; unique across escalations on the target; safe display characters only. |
|
|
207
256
|
| SLA duration | `count > 0`; when `unit: min`, `15 ≤ count ≤ 1000`. Supported units are `min`, `h`, `d`, `w`, and `m`. |
|
|
208
257
|
| Conditional SLA | Every non-default SLA rule has a non-empty expression/condition. |
|
|
209
258
|
| Escalation payload | Every escalation has at least one recipient; an `at-risk` escalation has an `atRiskPercentage` value. |
|
|
210
259
|
|
|
211
|
-
|
|
260
|
+
Safe display characters are letters, numbers, spaces, hyphen (`-`), and underscore (`_`) only. Do not generate colons (`:`), periods (`.`), slashes, backslashes, quotes, parentheses, ampersands, commas, semicolons, emoji, or other symbols in stage/task/rule/SLA/escalation display names. Repair unsafe generated or user-carried display names mechanically by replacing runs of disallowed characters with one space, collapsing spaces, and trimming. Preserve words and casing. If the result is empty or collides, pick a safe qualifier or numeric suffix and disclose it in the Case Review.
|
|
261
|
+
|
|
262
|
+
These are blocking authoring errors, not optional style warnings. Do not normalize external registry or tenant lookup names (Action App titles, process names, connector names, API names, queue/bucket names); those are matching keys. Keep separate safe Case Designer display names when a lookup name contains punctuation.
|
|
263
|
+
|
|
264
|
+
The same rule governs **numeric** violations: never silently clamp, round, or substitute an out-of-range value to satisfy validation. A minute-based SLA authored below 15 or above 1000 is not repaired to the nearest legal bound — surface the violation and Ask for a replacement duration (or a different `unit`), naming the original value. This applies whether the value came from the interview or from an SDD supplied on disk: rewriting a user-authored duration to pass validation is a silent requirements change, not a fix.
|
|
212
265
|
|
|
213
266
|
### 1.2 Case-level SLA escalation
|
|
214
267
|
|
|
215
268
|
Required when Case SLA is set. Always renders with both rows; no `—` allowed in any cell.
|
|
216
269
|
|
|
217
|
-
| Threshold | Trigger | Recipient |
|
|
218
|
-
|
|
219
|
-
| At-risk | `<pct>%` of case SLA (defaults below) | `UserGroup: <owner-group>` or `User: <name>` |
|
|
220
|
-
| Breached | 100% of case SLA | One tier up — leadership group; Compliance for regulation-driven cases |
|
|
270
|
+
| Threshold | Trigger | Recipient | Display Name |
|
|
271
|
+
|---|---|---|---|
|
|
272
|
+
| At-risk | `<pct>%` of case SLA (defaults below) | `UserGroup: <owner-group>` or `User: <name>` | Non-empty root-unique escalation title, no `:` |
|
|
273
|
+
| Breached | 100% of case SLA | One tier up — leadership group; Compliance for regulation-driven cases | Non-empty root-unique escalation title, no `:` |
|
|
274
|
+
|
|
275
|
+
`Display Name` defaults to `Escalation Rule {N}` only when no `sla-status-change` entry references that escalation.
|
|
221
276
|
|
|
222
277
|
**Default thresholds** when user did not name them:
|
|
223
278
|
|
|
@@ -227,6 +282,24 @@ Required when Case SLA is set. Always renders with both rows; no `—` allowed i
|
|
|
227
282
|
|
|
228
283
|
**Default recipients:** at-risk → stage/case owner persona's user group; breached → leadership group. Record substitutions in source ledger with reason `default applied — user did not name recipient`.
|
|
229
284
|
|
|
285
|
+
### 1.2b SLA Response Map
|
|
286
|
+
|
|
287
|
+
Required whenever **any** SLA is configured — case, stage, or `action` task. One row per `(Scope, SLA, Status)`; render the table per [`sdd-template.md` § SLA Response Map](../assets/templates/sdd-template.md). Columns: `Scope | SLA | Status | Response | Target | Interrupting | Rationale`.
|
|
288
|
+
|
|
289
|
+
| Field | Required? | Value |
|
|
290
|
+
|---|---|---|
|
|
291
|
+
| Scope | yes | `case`, `stage: <StageName>`, or `task: <TaskName>` |
|
|
292
|
+
| SLA | yes | the target's `SLA Title` (or a Variable SLA Rules `Display Name`) |
|
|
293
|
+
| Status | yes | `At-Risk` or `Breached` — one row each |
|
|
294
|
+
| Response | yes | `notify-only` \| `start-task` \| `enter-stage` \| `exit-stage` \| `exit-case` (§ SLA response model) |
|
|
295
|
+
| Target | yes | `—` for `notify-only`; the **task name** for `start-task` (the task lives in the breached stage); the stage name for `enter-stage`; the exit row it produces for `exit-stage` / `exit-case` |
|
|
296
|
+
| Interrupting | yes | `—` for `notify-only` and for every `start-task` (it is a task-entry rule, and a task entry interrupts nothing); otherwise `Yes`/`No`, matching the `Interrupting` cell of the stage-entry row it produces. `start-task` is never `Yes` or `No`. |
|
|
297
|
+
| Rationale | yes | why this response fits the source |
|
|
298
|
+
|
|
299
|
+
**Closure both ways (blocking):** every non-`notify-only` row has its matching rule elsewhere in the SDD (an `sla-status-change` **task-entry** row for `start-task`, an `sla-status-change` **stage-entry** row for `enter-stage`, a stage-exit row, or a §1.4a case-exit row), and every `sla-status-change` entry row in the SDD — task or stage scope — has a row here. A mismatch between this map's `Interrupting` cell and the produced entry row's `Interrupting` cell is a blocking error.
|
|
300
|
+
|
|
301
|
+
**Default:** no stated response → both statuses `notify-only`, `Target` and `Interrupting` `—`. Never invent a stage, task, or routing change to fill this table.
|
|
302
|
+
|
|
230
303
|
### 1.3 Triggers
|
|
231
304
|
|
|
232
305
|
≥ 1 trigger required. One row per triggering event. Number triggers sequentially starting at **T02** (T01 reserved for the case file). The T-number is the reference key used by Case Variables rows whose value comes from this trigger's payload (§1.5).
|
|
@@ -238,7 +311,7 @@ Required when Case SLA is set. Always renders with both rows; no `—` allowed i
|
|
|
238
311
|
| Source | conditional | Connector or system for `Intsvc.EventTrigger`; schedule expression for `Intsvc.TimerTrigger`; `Manual` literal for `Manual` |
|
|
239
312
|
| Configuration | conditional | User-stated intent only — see Configuration rules below. `Intsvc.EventTrigger` MUST have a concrete operation phrase. |
|
|
240
313
|
|
|
241
|
-
> **`Manual` is not a `serviceType`.** The
|
|
314
|
+
> **`Manual` is not a `serviceType`.** The on-disk serviceType enum (`data.inputs.serviceType`) is `None` / `Intsvc.EventTrigger` / `timer` — the SDD's `Intsvc.TimerTrigger` author token maps to on-disk `serviceType: "timer"`. A manual trigger carries **no** `serviceType` in `caseplan.json` (absence = manual — see [`plugins/triggers/manual/impl-json.md`](plugins/triggers/manual/impl-json.md)). Author `Manual` in the SDD; never emit `serviceType: "Manual"`.
|
|
242
315
|
|
|
243
316
|
**Configuration cell — what to write (user intent only, business terms):**
|
|
244
317
|
|
|
@@ -257,12 +330,7 @@ Required when Case SLA is set. Always renders with both rows; no `—` allowed i
|
|
|
257
330
|
|
|
258
331
|
> Variable mapping (which trigger payload field populates which case variable) is declared in **§1.5 Case Variables** via the `sourceTriggers` / `sourceFields` columns — NOT in this table. The Triggers table only identifies and configures each trigger; payload extraction is owned by Case Variables.
|
|
259
332
|
|
|
260
|
-
> **Tenant object starts are not Manual.** If the user says a case starts when a
|
|
261
|
-
> tenant case-entity / data-object record is created, record an
|
|
262
|
-
> `Intsvc.EventTrigger` row with the object name as Source. Missing tenant
|
|
263
|
-
> provisioning, absent local registry data, or unresolved connection details
|
|
264
|
-
> become an unresolved event trigger / placeholder later; they are never a reason
|
|
265
|
-
> to change the SDD trigger type to `Manual`.
|
|
333
|
+
> **Tenant object starts are not Manual.** If the user says a case starts when a tenant case-entity / data-object record is created, record an `Intsvc.EventTrigger` row with the object name as Source. Missing tenant provisioning, absent local registry data, or unresolved connection details become an unresolved event trigger / placeholder later; they are never a reason to change the SDD trigger type to `Manual`.
|
|
266
334
|
|
|
267
335
|
Unresolved `Intsvc.EventTrigger` resolution (`connectionId` / `activityTypeId` missing) → `high`-severity review item.
|
|
268
336
|
|
|
@@ -365,10 +433,13 @@ The trailing `` `{stage_id}` `` (e.g., `` `stage-intake` ``) MUST appear so read
|
|
|
365
433
|
|---|---|---|
|
|
366
434
|
| Type | yes | `Stage` |
|
|
367
435
|
| Stage Kind | optional | `primary` (default — omit the line) / `secondary` (emits `data.stageType: "secondary"`; replaces the old `ExceptionStage` type) |
|
|
436
|
+
| Design Rationale | yes | One concrete sentence explaining why this is primary/secondary and why its entry/exit behavior fits the requirement. For global-event lanes, name the event and state that one interrupting entry replaces per-stage duplication. For an SLA-entered lane, name the SLA, the chosen response, and why it interrupts or does not. |
|
|
368
437
|
| Description | yes (primary) / optional (secondary) | One prose sentence |
|
|
369
438
|
| Required for case completion | yes | `Yes` (primary, default) / `No` (secondary stages always `No`) |
|
|
370
|
-
| Interrupting | secondary stages only | `Yes` — secondary stages are interrupting lanes.
|
|
371
|
-
| Stage SLA | yes when stage has SLA | Default duration + `time-based` or `condition-based
|
|
439
|
+
| Interrupting | secondary stages only | `Yes` — secondary stages are interrupting lanes. `No` only on an `sla-status-change` parallel-oversight row (§ mental model carve-out). Otherwise, if the work should not interrupt, model it as a regular stage/parallel path or an `adhoc` task. |
|
|
440
|
+
| Stage SLA | yes when stage has SLA | Default duration + `time-based` or `condition-based` + `SLA Title` (non-empty, stage-unique, no `:`), plus conditional-rule and escalation tables |
|
|
441
|
+
|
|
442
|
+
When the source says every primary phase/stage has an SLA target, every named primary stage MUST render its own `#### Stage SLA` block. Use deterministic titles when the user did not supply names: `**SLA Title:** <Stage Name> SLA`, at-risk display name `<Stage Name> SLA at risk`, and breach display name `<Stage Name> SLA breached`. Any `sla-status-change("<Stage Name>",...)` row for that stage must use those exact strings; a title declared on another stage or only in prose does not resolve.
|
|
372
443
|
|
|
373
444
|
### Stage Entry Conditions table
|
|
374
445
|
|
|
@@ -376,7 +447,11 @@ The trailing `` `{stage_id}` `` (e.g., `` `stage-intake` ``) MUST appear so read
|
|
|
376
447
|
|
|
377
448
|
| WHEN | IF | Interrupting | Display Name |
|
|
378
449
|
|---|---|---|---|
|
|
379
|
-
| `case-entered` (root only) / `selected-stage-completed("<Stage>")` / `selected-stage-exited("<Stage>")` / `wait-for-connector` / `user-selected-stage` | optional `conditionExpression` | `Yes` for every secondary-stage entry row; `No` for regular-stage entry | optional |
|
|
450
|
+
| `case-entered` (root only) / `selected-stage-completed("<Stage>")` / `selected-stage-exited("<Stage>")` / `wait-for-connector` / `user-selected-stage` / `sla-status-change("<SLA target>","<SLA Title>")` (breach) / `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")` (at-risk) | optional `conditionExpression` | `Yes` for every secondary-stage entry row, except an `sla-status-change` parallel-oversight row (`No`); `No` for regular-stage entry | optional |
|
|
451
|
+
|
|
452
|
+
`sla-status-change` args are specified in [sdd-template.md](../assets/templates/sdd-template.md) § Stage Entry Conditions; closure is enforced by § Logical integrity step 6.
|
|
453
|
+
|
|
454
|
+
`user-selected-stage` is valid only when another stage has a `wait-for-user` exit that exposes this target to the user. It is not the rule for deterministic rejection, approval, send-back, or SLA routing. Use decision facts plus guarded stage entry/exit rows for deterministic routes.
|
|
380
455
|
|
|
381
456
|
### Stage Completion Conditions table (`Marks Stage Complete: Yes`)
|
|
382
457
|
|
|
@@ -413,10 +488,10 @@ Render when the Stage SLA type is `condition-based`. Each expression-keyed overr
|
|
|
413
488
|
|
|
414
489
|
Always rendered when Stage SLA is set. Concrete cells in both rows; never `—`.
|
|
415
490
|
|
|
416
|
-
| Threshold | Trigger | Recipient |
|
|
417
|
-
|
|
418
|
-
| At-risk | `<pct>%` of stage SLA (defaults below) | `UserGroup: <owner-group>` / `User: <name>` |
|
|
419
|
-
| Breached | 100% of stage SLA | Leadership group; Compliance for regulation-driven stages |
|
|
491
|
+
| Threshold | Trigger | Recipient | Display Name |
|
|
492
|
+
|---|---|---|---|
|
|
493
|
+
| At-risk | `<pct>%` of stage SLA (defaults below) | `UserGroup: <owner-group>` / `User: <name>` | Non-empty stage-unique escalation title, no `:` |
|
|
494
|
+
| Breached | 100% of stage SLA | Leadership group; Compliance for regulation-driven stages | Non-empty stage-unique escalation title, no `:` |
|
|
420
495
|
|
|
421
496
|
**Defaults** when user did not name them (mirror §1.2):
|
|
422
497
|
|
|
@@ -451,12 +526,22 @@ When a stage's real work is split across **mutually-exclusive conditional tasks*
|
|
|
451
526
|
|
|
452
527
|
The convergence task is the stage's only `Required: Yes` task, so `required-tasks-completed` resolves deterministically whichever branch ran — including the no-branch case. (Worked example from a shipping SDD: an Exception-Resolution stage with per-reason-code action tasks + a `Persist exception resolution` api-workflow convergence task carrying exactly the three rows above.)
|
|
453
528
|
|
|
454
|
-
**Re-entry safety (`return-to-origin` loops).** A task in a stage that an exception lane returns to via `return-to-origin`
|
|
529
|
+
**Re-entry safety (`return-to-origin` loops).** A task in a stage that an exception lane returns to via `return-to-origin` re-runs on re-entry unless flagged `Run Only Once: Yes`. Classify the loop before setting that flag:
|
|
530
|
+
|
|
531
|
+
| Re-entry type | Signal | `Run Only Once` default | State handling |
|
|
532
|
+
|---|---|---|---|
|
|
533
|
+
| New attempt / resubmission | corrected, revised, fixed, resubmitted, retry, re-review, revalidate, appeal, counter-proposal | `No` for request/review/decision/validation producer tasks that must produce a fresh result | Reset live routing variables to a neutral value before the attempt, or write results to attempt-scoped/latest variables |
|
|
534
|
+
| Re-evaluate existing fact | exception lane changes a fact and returns only so the origin can continue routing | `Yes` only on producer tasks whose prior output must be preserved | Preserve the fact deliberately and document which downstream rule re-reads it |
|
|
535
|
+
| Optional repeat work | user may repeat work, but required flow does not depend on it | Usually `adhoc` or non-required | Do not let required flow depend on the optional task |
|
|
536
|
+
|
|
537
|
+
If the requirement says corrected work is resubmitted through a review or decision, the review/request/decision producer tasks must run again on stage re-entry. Do not mark all of them `Run Only Once: Yes`. A stale terminal value such as `SendBack`, `Rejected`, or `NeedsCorrection` must not remain live at re-entry unless the design intentionally re-evaluates that existing fact.
|
|
455
538
|
|
|
456
539
|
## Task content rules
|
|
457
540
|
|
|
458
541
|
Defines per-task detail blocks. Every task opens with an **Entry Condition** block. Additional blocks depend on task type.
|
|
459
542
|
|
|
543
|
+
Every task also declares **Design Rationale**: one concrete sentence explaining why the selected task type fits the actor/work and why the selected activation mode fits the timing. For sequential tasks, name the ordering/dependency evidence; for parallel tasks, state that the work is independent. This rationale is persisted into the matching task and task-entry T-entries in `tasks.md`.
|
|
544
|
+
|
|
460
545
|
### Entry Condition block (every task)
|
|
461
546
|
|
|
462
547
|
```
|
|
@@ -470,14 +555,17 @@ Defines per-task detail blocks. Every task opens with an **Entry Condition** blo
|
|
|
470
555
|
| Rule | When to use |
|
|
471
556
|
|---|---|
|
|
472
557
|
| `current-stage-entered` | Ungated stage-started task that should start when its stage is entered. Do not add this row to event-triggered (`wait-for-connector`), manually triggered (`adhoc`), or sequential (`runs-sequentially`) tasks. When a task intentionally has multiple entry rows and one is stage-started, render this row first. |
|
|
473
|
-
| `selected-tasks-completed("<Task>")` | Explicit sibling gate, fan-in, branch convergence, or conditional handoff where this task should start only after named sibling task(s) complete. Multiple tasks comma-separated inside the parens. Do not use it merely to express the next step in a simple top-to-bottom task list; use `runs-sequentially` for that UI mode. |
|
|
558
|
+
| `selected-tasks-completed("<Task>")` | Explicit sibling gate, fan-in, branch convergence, or conditional handoff where this task should start only after named non-adhoc sibling task(s) complete. Multiple tasks comma-separated inside the parens. Do not use it merely to express the next step in a simple top-to-bottom task list; use `runs-sequentially` for that UI mode. Never select a task whose entry rule is `adhoc`, and never select a task from another stage. |
|
|
474
559
|
| `wait-for-connector` | Async connector callback. Pair with `conditionExpression` to gate on **case state** (`vars.X`); the event payload is not accessible (no `event` namespace). **In-rule extract-then-gate (extract + same-rule `=js:vars.caseVar` gate) does NOT work at runtime** — case-backend evaluates the gate before the extract populates the case var. To condition on payload content: extract `response.field -> caseVar` on the connector rule and place the case-state gate on a DOWNSTREAM stage-entry / task-entry condition. |
|
|
560
|
+
| `sla-status-change("<SLA target>","<SLA Title>")` (breach) / `sla-status-change("<SLA target>","<SLA Title>","<At-Risk Escalation Display Name>")` (at-risk) | The **`start-task` SLA response**: this task fires when the referenced SLA changes status. Reference the containing stage's own SLA for a stage-scoped response, or `"root"` for a case-scoped one. This is the canonical `start-task` shape — the task activates on the SLA event directly, so the stage is not re-entered and its other tasks do not re-run. Never author the equivalent as a stage-entry row. See [sla-response-shapes.md](sla-response-shapes.md). |
|
|
475
561
|
| `adhoc` | Manual fire from the case app. Optional gating expression. Task-entry only; set `Required: No`. It is an activation mode, not a task type. |
|
|
476
562
|
| `runs-sequentially` | Tasks that should run top-to-bottom in their stage declaration order. The frontend toggle writes this as the task's only entry rule; it is not represented by a lane. |
|
|
477
563
|
|
|
478
564
|
Multiple entry conditions render as multiple rows (DNF outer-OR). When `current-stage-entered` is among them, render it first.
|
|
479
565
|
|
|
480
|
-
**Sequential normalization rule.** When
|
|
566
|
+
**Sequential normalization rule.** When the requirement states order/dependency (`then`, `after`, `before`, `in order`, an upstream output prerequisite) for a contiguous set of tasks in one stage, author **each task in that ordered task-set run** with exactly one `runs-sequentially` Entry Condition row. This includes the first task set: do not write `current-stage-entered` for the first item and `selected-tasks-completed("<previous>")` for later items. A strict chain uses consecutive single-task sets; independent siblings after the same predecessor share the same later task set and also use `runs-sequentially`. A missing data binding does not erase stated ordering. Use parallel `current-stage-entered` tasks only when the work is explicitly independent and starts with the stage; use `selected-tasks-completed` for fan-in/non-immediate dependencies. Break an ordered run at tasks that are `adhoc`, condition-gated, intentionally dependent on non-immediate sibling task(s), or whose **entry rule** is `wait-for-connector`. A task merely **typed** `wait-for-connector` does not break the run: when it must arm only after a predecessor creates the obligation, it stays in the ordered task set with `runs-sequentially` and keeps its connector event in its own `data`.
|
|
567
|
+
|
|
568
|
+
**Parallel-after-predecessor rule.** When two or more independent tasks start after the same immediate predecessor task or predecessor task set, put them in the same next task set, mark each `Activation Mode: parallel-after-predecessor`, and give each the `runs-sequentially` entry rule. Do not author duplicate event-driven task entries with identical `selected-tasks-completed("<previous>")` rules. Use `selected-tasks-completed` only for true fan-in, branch convergence, condition-result routing, non-immediate dependencies, or explicit authored gates. For race patterns such as payment confirmation vs payment deadline, start the listener and clock while the payment obligation is pending, then gate downstream success work on the confirmation fact rather than on completion of the whole parallel set.
|
|
481
569
|
|
|
482
570
|
### `action` task — required cells
|
|
483
571
|
|
|
@@ -584,9 +672,9 @@ These four runnable types share a single render block. The SDD surfaces both por
|
|
|
584
672
|
|
|
585
673
|
| Task type | Registry source | Identity field in `registry-resolved.json` |
|
|
586
674
|
|---|---|---|
|
|
587
|
-
| `process` | `
|
|
675
|
+
| `process` | `processOrchestration-index.json` | `processOrchestrationId` |
|
|
588
676
|
| `agent` | `agent-index.json` | `agentId` (+ version) |
|
|
589
|
-
| `rpa` |
|
|
677
|
+
| `rpa` | `process-index.json` | `processOrchestrationId` for RPA processes |
|
|
590
678
|
| `api-workflow` | `api-index.json` | `apiWorkflowId` (+ endpoint) |
|
|
591
679
|
|
|
592
680
|
Unresolved registry identity → `high`-severity review item (§Review items). The SDD shows the runnable name + In/Out bindings; the identity flows through the audit trail.
|
|
@@ -738,11 +826,11 @@ Pattern X1 is preferred unless an actual connector emits the close event. When t
|
|
|
738
826
|
8. **Forbidden body vocabulary.** No occurrence in any narrative cell of: `Pattern C`, `bridge`, `companion`, `inputOutputs[]`, `=jsonString:` (outside connector `Operation Configuration` cells), `groupOperator`, `essentialConfiguration` (as prose), `savedFilterTrees`, `dispatcher`, `Phase 2 validator`, `Phase 3 dispatcher`, `Q10 II`, `Finding #N`, `io-binding`, `aliased into / from / back into`, `reassign`, `originalVar`, `auto-mint`. These are skill-internal terms — see [sdd-template.md § Output Rules](../assets/templates/sdd-template.md).
|
|
739
827
|
9. **Resolved-resource I/O completeness** (§Resolved-resource I/O completeness). For each task resolved to a live resource (contract present in `tasks/registry-resolved.json`): every **required** declared input has a non-empty `Binding` row OR `<UNRESOLVED>` + a paired `high` review item; every Outputs `-> caseVar` row's `Field` exists verbatim in the resolved output contract. An upstream-output-fed input (whole-value `<-` or `vars.$xref(...)`) satisfies coverage with NO §1.5 row — do not flag it as a missing variable. Skip tasks whose type-specific identity (`Resource Identity` or `Action App ID`) is `<UNRESOLVED>` (no contract).
|
|
740
828
|
|
|
741
|
-
Any failure → fix in the model before presenting the confirmation (lineage defects are the agent's, not the user's); a genuinely unfixable item becomes a
|
|
829
|
+
Any failure → fix in the model before presenting the confirmation (lineage defects are the agent's, not the user's); a genuinely unfixable item becomes a row in the confirmation's `Review Flags` table.
|
|
742
830
|
|
|
743
831
|
## Review items
|
|
744
832
|
|
|
745
|
-
A review item is a structured gap escalation. Phase 0 emits one whenever a field could not be fully resolved but Phase 1 needs the context. In Phase 0 they live in the in-memory model and surface as
|
|
833
|
+
A review item is a structured gap escalation. Phase 0 emits one whenever a field could not be fully resolved but Phase 1 needs the context. In Phase 0 they live in the in-memory model and surface as rows in the confirmation's `Review Flags` table — never in the `sdd.md` body (per [sdd-template.md § Output Rules](../assets/templates/sdd-template.md)); Phase 1 persists them into `tasks/registry-resolved.json` under the matching task's `review_items[]` array when it writes that file.
|
|
746
834
|
|
|
747
835
|
Shape:
|
|
748
836
|
|
|
@@ -764,7 +852,7 @@ Severity:
|
|
|
764
852
|
| **medium** | Phase 1 can default with a prompt. | Missing SLA escalation recipient (default = owner group); missing variable default; ambiguous recipient (persona name without group resolution). |
|
|
765
853
|
| **low** | Cosmetic. | Missing case-level description; missing secondary-stage description; stylistic placeholder. |
|
|
766
854
|
|
|
767
|
-
**Confirmation gate behavior.** When any `high` review items exist, they appear
|
|
855
|
+
**Confirmation gate behavior.** When any `high` review items exist, they appear in the confirmation's `Review Flags` table and the Build option is relabeled `Build despite N flagged items` (count populated). User must pick it — silently building past `high` items is forbidden. Medium and low items surface in the same table as advisory rows and need no acknowledgment.
|
|
768
856
|
|
|
769
857
|
## Domain fidelity
|
|
770
858
|
|
|
@@ -792,12 +880,13 @@ Phase 0's narrative cells (Description, persona names, stage names, task names,
|
|
|
792
880
|
|
|
793
881
|
Beyond schema-pairing checks (§Finalization step 1), the case must be a connected graph. **Edges are retired — these condition-based checks are the SOLE reachability guard; there is no edge graph to fall back on.** A malformed or missing entry condition is the only thing that can orphan a stage, so this walk is load-bearing.
|
|
794
882
|
|
|
795
|
-
1. **Every stage reachable from a trigger.** Walk forward from each trigger
|
|
883
|
+
1. **Every stage reachable from a trigger.** Walk forward from each trigger/SLA source through Stage Entry Conditions (`case-entered` from root, `selected-stage-completed`, `selected-stage-exited`, `wait-for-connector`, `sla-status-change`) — condition-only, no edges. Every primary stage's id must be reached. Unreachable stage → blocking error (orphan stage).
|
|
796
884
|
2. **Every stage exits.** Every primary stage must have either (a) a completion row (`Marks Stage Complete: Yes`) whose completion is consumed by a downstream stage's Entry Condition or a case-exit, OR (b) another primary stage whose Entry Condition references it (`selected-stage-completed`/`selected-stage-exited`), OR (c) feed a secondary stage. A stage no other stage (or case-exit) keys off → blocking error (terminal-loop stage).
|
|
797
885
|
3. **Every case-exit row references a stage that exists.** No dangling `Required Stages` references.
|
|
798
886
|
4. **Every `Required Stages` cell in §1.4 names ≥ 1 primary stage with `Required for case completion: Yes`.** Otherwise the case can never complete.
|
|
799
|
-
5. **Secondary stages must have ≥1 interrupting entry condition, each DISTINCT, chosen by trigger source.** Map the lane's *trigger* to the rule: a gate decision → `selected-stage-completed` / `selected-stage-exited` (+ `IF` on the decision var); a person launches it → `user-selected-stage
|
|
800
|
-
6. **Every
|
|
887
|
+
5. **Secondary stages must have ≥1 interrupting entry condition, each DISTINCT, chosen by trigger source.** Map the lane's *trigger* to the rule: a gate decision → `selected-stage-completed` / `selected-stage-exited` (+ `IF` on the decision var); a person launches it → `user-selected-stage` paired with an upstream `wait-for-user` exit; an external event → `wait-for-connector`; an SLA response that enters this lane → `sla-status-change` referencing the SLA (plus an at-risk escalation only for an at-risk response; a breach references the SLA alone). Warning-only SLA escalation stays a notification. `adhoc` is task-entry only — never a stage entry. Every secondary-stage entry row carries `Interrupting: Yes`. Two secondary stages whose entry rules are identical (same rule type + selector fields + `conditionExpression`) fail `validate` (`CASE_MGMT_SECONDARY_STAGE_ENTRY_RULES_DUPLICATE`) — give each a distinct event/SLA selector or expression guard. Terminal lanes (Rejected / Withdrawn) exit `exit-only` and declare a §1.4a case-exit (`marks-case-complete: false`); return lanes (Escalation / Customer Comms) exit `return-to-origin`. **Global events:** one `wait-for-connector` or `sla-status-change` entry on the destination secondary stage covers every active origin; do not repeat a task or exit rule across primary stages. **Decision-reachable lanes:** when any decision button's Behavior (or the user's stated intent) names a secondary stage as a destination ("route to / send to / escalate via the X lane"), that lane's entry conditions MUST include a `selected-stage-completed` / `selected-stage-exited` rule with an `IF` on the deciding variable's value. A lane described as decision-reachable but entered ONLY via `wait-for-connector` (no decision-keyed entry) is unreachable from its stated source → blocking error. A `wait-for-connector` entry may coexist as a separate trigger, but cannot be the lane's only entry when a decision is supposed to reach it. **Only a `selected-stage-completed`/`selected-stage-exited` lane entry requires a matching origin diverting exit.** On the *origin* stage add a **gated diverting exit** (`Marks Stage Complete: No`, WHEN `selected-tasks-completed("<decider task>")`, `IF =js:(<signal> === <exception-value>)`, `exit-only`, `exitToStageId` → the lane) **and** gate the origin's completion exit with the inverse `IF` (`=js:(<signal> !== <exception-value>)`) so the two are mutually exclusive. Without the diverting exit the decision path either **dual-fires** (ungated completion → the next stage *and* the lane both enter) or **deadlocks** (gated completion with no alternative exit). `selected-stage-exited` fires *after* the origin exits, so this is a **divert-and-return, not a true mid-stage interrupt** — a genuine mid-stage interrupt needs `user-selected-stage`, `wait-for-connector`, or `sla-status-change` (mental-model shapes (a)/(c)). Missing origin diverting exit, or a completion exit not mutually exclusive with it → blocking error.
|
|
888
|
+
6. **Every `sla-status-change` entry resolves.** For each row: the target is `root` or an existing stage, that target has an SLA configured (§1.1 + §1.2, or its `#### Stage SLA` block), and every title the row actually supplies matches a row declared on **that** target. A two-arg breach row supplies only the SLA title and is complete as written — its missing escalation is not a miss. Any real miss — SLA absent, title left `—`/defaulted, typo, or an at-risk escalation borrowed from another target — cannot resolve to `slaId` (or, for at-risk, `escalationId`), leaves the lane unreachable, and is a **blocking error**. A notification-only escalation needs no entry rule.
|
|
889
|
+
7. **Every secondary stage is interrupting, except a non-diverting SLA oversight row.** Set the stage-level `Interrupting` field and every secondary-stage entry row to `Yes`. If the user describes work that can run alongside the main flow without interrupting it, do not mark it secondary; model it as a regular parallel stage/path or as an `adhoc` task in the active stage. A secondary stage with `Interrupting: No` is a blocking classification error **unless** that row is an `sla-status-change` response the source describes as parallel oversight (the breached work continues; nothing is paused, taken over, or rerouted) — then `No` is correct on that row and the lane still stays `isRequired: No` and out of the completion set. Do not promote such a lane to a regular stage: that would make it required for case completion. Every non-SLA secondary entry row stays `Yes`.
|
|
801
890
|
|
|
802
891
|
**Worked example — decision/signal-routed return exception (AP Review → SLA Escalation).** The origin "AP Review" routes to the exception lane "SLA Escalation" on a `requiresEscalation` decision, then returns:
|
|
803
892
|
|
|
@@ -837,7 +926,9 @@ Phase 0's job is to surface execution-readiness gaps, not just schema validity.
|
|
|
837
926
|
When Phase 0 defaults or infers a value, record provenance so Phase 1 and downstream auditors can trace it. The ledger has two surfaces:
|
|
838
927
|
|
|
839
928
|
1. **Inline in `sdd.md`** — italic source attribution after the value: `Manual _(source: user-stated)_`. Omit attribution when the kind is `user-stated`.
|
|
840
|
-
2. **Confirmation `Decisions I
|
|
929
|
+
2. **Confirmation `Decisions I Made` table** — see [phase-0-interview.md § Confirm](phase-0-interview.md#confirm--the-single-checkpoint).
|
|
930
|
+
|
|
931
|
+
**Design rationale is durable, not chat-only.** Provenance says *where a value came from*; rationale says *why the design choice fits*. Persist the latter in each stage/task `Design Rationale` field and in each case/stage SLA rationale field. The confirmation may summarize those reasons, but it is not their sole storage. Phase 1 copies the rationale to each matching `tasks.md` T-entry so an implementer can review the choice without the original conversation.
|
|
841
932
|
|
|
842
933
|
Provenance kinds:
|
|
843
934
|
|
|
@@ -862,6 +953,8 @@ Phase 0 runs these checks **once, against the in-memory case model, before prese
|
|
|
862
953
|
- Case-exit `Yes` + `selected-stage-*` → error
|
|
863
954
|
- Stage-exit `Yes` + `selected-tasks-completed` → error
|
|
864
955
|
2. **Render-contract check.** Every required cell in §Case content rules, §Stage content rules, §Task content rules has a concrete value (no banned `—` / `<UNRESOLVED>`).
|
|
956
|
+
2a. **Template-shape check.** The exact rendered `sdd.md` text must pass [phase-0-interview.md § Template conformance gate](phase-0-interview.md#template-conformance-gate--before-sddmd-is-written): `# SDD — {Case Name}`, `## Table of Contents`, `## Section 1: Case Definition`, `## Section 2: Stages & Tasks`, `## Section 3: Personas & App Views`, `## Section 4: Integrations`, required Section 1 subsections, one complete stage block per stage, one complete task block per task, personas/app views, and integrations. Each task block must contain the exact marker `**Task envelope**` before the Required / Run Only Once / Skip Condition table; `**Task envelope:**` with a colon is a render failure. Secondary-stage task headings must use numeric `Task S{K}.{M}` form, never lettered prefixes such as `Task R.1`, `Task W.1`, `Task CC.1`, or `Task ESC.1`. Missing headings, missing full detail blocks, or top-level summary replacements (`## Source`, `## Case Objective`, `## Stages`, `## Task Plan`, etc.) are blocking render failures. This check runs before Write; if it fails after Write is observed, stop and repair before Phase 1.
|
|
957
|
+
2b. **Safe display-name check.** Every generated or carried Case Designer display/title field for stages, tasks, rule names, SLA rules, and escalation rules uses only letters, numbers, spaces, hyphen, and underscore. Repair unsafe punctuation mechanically and disclose changed names in the Case Review. Do not normalize external resource lookup names.
|
|
865
958
|
3. **Decision-task button check.** Every `action` task with `is_decision: Yes` has ≥ 2 buttons; every button's `Maps To` LHS references a declared §1.5 variable (by `Name`) or `taskOutcome`.
|
|
866
959
|
4. **Recipient encoding check.** Every `action` task recipient uses one of the five typed prefixes (`Email:` / `User:` / `UserGroup:` / `Role:` / `Expression:`) — no bare strings.
|
|
867
960
|
5. **Connector-id check.** Every `wait-for-connector` / `execute-connector-activity` **task** has concrete `Connection ID` AND `Activity Type ID`. Every `wait-for-connector` **condition rule** (in any scope — stage-entry / stage-exit / case-exit / task-entry) has a `Connector Rule Detail` block resolving to a concrete `Connector Key` AND `Event Operation` (and `Connection ID` when not a tenant-default). Missing identity → paired `high`-severity review item.
|
|
@@ -870,6 +963,8 @@ Phase 0 runs these checks **once, against the in-memory case model, before prese
|
|
|
870
963
|
8. **Alt-disposition coverage.** If ≥ 1 secondary stage exists, Section 1.4a is non-empty OR a `high`-severity review item is open.
|
|
871
964
|
9. **Review-items high-severity acknowledgment.** Approve adds the explicit follow-up when `high` items exist.
|
|
872
965
|
10. **Source-ledger check.** Every non-`user-stated` and non-`verbatim` field has provenance.
|
|
966
|
+
10a. **Design-rationale check.** Every stage explains its kind and routing choice; every task explains its type and activation/sequencing choice; every configured case/stage SLA explains its thresholds, recipients, and any notify-only or graph-changing response. Missing rationale is a blocking render-contract error because Phase 1 must preserve it.
|
|
967
|
+
10b. **SLA Response Map closure** (§1.2b). If any SLA is configured, the map exists with one row per `(Scope, SLA, Status)` and every `Response` drawn from the closed set. Every non-`notify-only` row has its matching `sla-status-change` entry / stage-exit / case-exit rule in the model, every `sla-status-change` entry has a map row, and each pair's `Interrupting` values agree. A `notify-only` row that minted a stage or task, or a bare SLA with no map row, is a blocking error.
|
|
873
968
|
11. **File-In-arg caller-obligation surfacing.** When ≥ 1 §1.5 row has `Category: In` AND `Type: file`, the Approve summary MUST include a `Caller obligation` block:
|
|
874
969
|
|
|
875
970
|
```
|
|
@@ -883,7 +978,8 @@ Phase 0 runs these checks **once, against the in-memory case model, before prese
|
|
|
883
978
|
|
|
884
979
|
This is informational, not blocking. But missing it suppresses a known integration gotcha.
|
|
885
980
|
|
|
886
|
-
12. **Stage-graph connectivity check.** Run the §Logical integrity stage-graph checks (every stage reachable, every stage exits, every Required Stages cell points to existing primary stages, every secondary stage has ≥ 1 entry condition, and every secondary stage / secondary-stage entry row has `Interrupting: Yes`). Any failure → blocking error.
|
|
981
|
+
12. **Stage-graph connectivity check.** Run the §Logical integrity stage-graph checks (every stage reachable, every stage exits, every Required Stages cell points to existing primary stages, every secondary stage has ≥ 1 entry condition, every `sla-status-change` entry names an SLA rule declared on the target it points at — plus an at-risk escalation on that same target only when the row is at-risk — and every secondary stage / secondary-stage entry row has `Interrupting: Yes`). Any failure → blocking error.
|
|
982
|
+
12a. **Entry-producer/reference check.** Every non-start stage/task entry names a concrete producer/reference: `selected-stage-*` names an existing upstream stage whose exit/completion can occur; `user-selected-stage` has a matching upstream `wait-for-user` exit; `wait-for-connector` has connector rule detail; `sla-status-change` names SLA target scope, SLA display name, and status — plus an at-risk escalation display name **when and only when the status is at-risk** (a breach rule references the SLA alone; a missing escalation on a breach row is correct, not a gap). A rule without a producer/reference is a blocking error.
|
|
887
983
|
13. **Domain-fidelity scan.** Run a single pass over every narrative cell (Description, persona name, stage name, task name, button label, app-view purpose). For each customer-named entity surfaced in §Source ledger as `verbatim:"..."`, confirm the rendered cell still uses the verbatim phrase (no synonym drift). Mismatch → list and offer `Re-edit` with the verbatim phrase pre-filled.
|
|
888
984
|
14. **Architect's-lens advisory pass.** Run the §Architect's lens checks. Emit `medium` review items for each trigger (the `high` variants — `rev_substitute_app`, and `rev_no_failure_path` at the ≥ 2-connector threshold — emit `high` and gate via the opt-in). `medium` is non-blocking; Approve summary surfaces the count.
|
|
889
985
|
15. **Decision-routing closure.** For every `action` task with `is_decision: Yes`, each button's `Maps To` variable+value MUST be consumed by ≥ 1 downstream rule (stage-entry `IF`, task-entry `IF`, stage-exit, or case-exit) OR the button's Behavior MUST declare it terminal (no routing claim). When a button's Behavior names a destination stage / lane ("route to / send to / via the X lane") and no entry condition keys off that variable+value, the branch is dead → **blocking error**. Pair with §Logical integrity step 5 (lane reachability). A fully-orphaned decision variable (produced by a button, read by nothing) on an `is_decision: Yes` task is blocking; the `medium` `rev_orphan_decision` variant in §Architect's lens applies only when the variable IS read but not for branching.
|
|
@@ -891,8 +987,9 @@ Phase 0 runs these checks **once, against the in-memory case model, before prese
|
|
|
891
987
|
17. **Required-task presence.** Every primary stage whose completion exit uses `required-tasks-completed` MUST contain ≥ 1 task with `Required: Yes`. A `required-tasks-completed` exit over a stage where no task is required is vacuous — the runtime resolves it without gating on real work (and the CLI flags it as `CASE_MGMT_..._NO_REQUIRED_TASK` at `validate`). Catch it at the Approve gate: zero `Required: Yes` tasks in such a stage → blocking error (offer `Re-edit` to mark the stage's terminal/primary task required). Tasks default to `Required: Yes` unless the SDD says otherwise, so this fires only when the author explicitly cleared every task's Required flag.
|
|
892
988
|
18. **Resolved-resource presence (standalone replicability).** Every process/agent/rpa/api-workflow task has a concrete `Resolved Resource`; every action has a concrete Action App title in `HITL Implementation`; every case-management task has a concrete `Child Case`. These portable names are never `<UNRESOLVED>`. Each task also has its required type-specific identity + folder pair (`Resource Identity` + `Folder Path`, or `Action App ID` + `Deployment Folder`): a concrete identity requires the exact concrete folder; an unresolved identity permits an unresolved folder and requires a paired `high` review item. Every connector task has `Connection ID` + `Activity Type ID`. Missing portable intent, or unresolved identity with no review item, is a blocking error.
|
|
893
989
|
19. **Resolved-resource I/O completeness** (§Resolved-resource I/O completeness; audit-checklist item 9). For every task resolved to a live resource (contract in `tasks/registry-resolved.json`): every **required** declared input is bound (any §Binding cell form, incl. an upstream-output ref — which needs NO §1.5 row) OR `<UNRESOLVED>` + a paired `high` review item (`rev_unbound_input_<task>_<field>`); every Outputs `-> caseVar` row's `Field` exists verbatim in the resolved output contract (a phantom field → `high` `rev_phantom_output_<task>_<field>`). Unbound required input with no review item → blocking error. Step 16 is the `action`-app instance of the output-fidelity direction; this step extends both directions to all runnable/connector types. Tasks whose type-specific identity (`Resource Identity` or `Action App ID`) is `<UNRESOLVED>` (no contract) are skipped.
|
|
990
|
+
20. **Re-entry attempt check.** For each `return-to-origin`, rework, correction, or resubmission loop, classify the loop as new attempt, re-evaluate existing fact, or optional repeat work. New-attempt loops must leave request/review/decision producer tasks rerunnable (`Run Only Once: No`) and reset or attempt-scope the routing variables they produce. Re-evaluate-only loops must document which existing fact the origin re-reads.
|
|
894
991
|
|
|
895
|
-
On pass: present the §Confirm checkpoint (
|
|
992
|
+
On pass: present the §Confirm checkpoint (decision-first Case Review with Case Snapshot, Primary Journey, Other Paths Considered, SLA and Escalations, Rules and Outcomes, Resources and Integrations, a complete `Decisions I Made` table, Review Flags, and Caller obligation when applicable). The review names every stage and task but omits data, variables, and task inputs/outputs. A Build answer is the consent — `sdd.md` renders from the confirmed model batched with the first build actions ([phase-0-interview.md § Build start](phase-0-interview.md#build-start--sdd-written-alongside-the-build)); an explicit sign-off request adds one approval prompt before any file is created; design-only/draft requests save and stop. Corrections update the model and re-run only the affected checks.
|
|
896
993
|
|
|
897
994
|
On fail: fix the model and re-run the failed checks (plus any whose inputs changed) — not the full suite. Do not present the confirmation, and never render `sdd.md`, while a fixable check is failing; surface only the unfixable as ⚠ flags.
|
|
898
995
|
|
|
@@ -900,9 +997,14 @@ On fail: fix the model and re-run the failed checks (plus any whose inputs chang
|
|
|
900
997
|
|
|
901
998
|
- **Do NOT silently accept a user-proposed type when a compliance trigger phrase is in the transcript.** Tier 2 of the authority hierarchy overrides user preference; Ask before recording.
|
|
902
999
|
- **Do NOT create `sdd.md` before the confirmation's Build (or save) answer.** Finalization validates the in-memory model before the confirmation; the file renders only after consent — batched with the first build actions, or alone for design-only/draft requests. Never render with a failing fixable check or an undisclosed decision, and never build past a `high` item without the `Build despite N flagged items` pick.
|
|
1000
|
+
- **Do NOT leave design rationale only in chat.** The confirmation's `Decisions I Made` table is transient; stage kind/routing, task type/activation/sequencing, and SLA/escalation reasons must also live in the SDD's `Design Rationale` fields so Phase 1 can preserve them.
|
|
1001
|
+
- **Do NOT treat a validating case as proof the SDD followed the template.** `caseplan.json` validation checks executable JSON, not whether `sdd.md` preserved the template. A summary-style `sdd.md` with top-level `Source`, `Case Objective`, `Task Plan`, or `Acceptance Scenarios` sections is a render defect even when the built case validates.
|
|
1002
|
+
- **Do NOT repeat a global event on every primary stage.** External withdrawn/cancel events belong on one interrupting secondary-stage entry rule. An SLA response that enters a stage belongs on one scoped `sla-status-change` entry, with interrupting set by whether it diverts active work. Per-stage task/exit duplication is a modeling defect.
|
|
1003
|
+
- **Do NOT invent a stage, task, or routing change for an SLA the source only asks to notify about.** Absent a stated response, at-risk and breached are `notify-only` (§ SLA response model).
|
|
903
1004
|
- **Do NOT ship `sdd.md` with a banned `—` or `<UNRESOLVED>` on a render-required field.** Emit a placeholder + review item, or Ask.
|
|
904
1005
|
- **Do NOT pair `Marks Stage Complete: Yes` with `selected-tasks-completed` or `Marks Case Complete: Yes` with `selected-stage-*`.** Both are schema-pairing errors (Key Rule 4).
|
|
905
1006
|
- **Do NOT emit an `action` task without typed recipient prefix.** Bare strings (`"the underwriter"`) force Phase 1 to guess.
|
|
1007
|
+
- **Do NOT let required flow depend on `adhoc` tasks.** `selected-tasks-completed` and required-task rules must select only non-adhoc tasks in the same stage.
|
|
906
1008
|
- **Do NOT emit a decision `action` task with fewer than 2 buttons.** `is_decision: Yes` requires ≥ 2 buttons; downgrade to `is_decision: No` if the task does not fork the case path.
|
|
907
1009
|
- **Do NOT emit a `wait-for-timer` task with `<UNRESOLVED>` duration.** Timer cannot fire — block Approve.
|
|
908
1010
|
- **Do NOT emit SLA cells on `process` / `agent` / `rpa` / `api-workflow` / timer / connector / `case-management` tasks.** SLA supports case, stage, and `action` tasks ONLY (sdd-template Key Rule 1).
|
|
@@ -917,6 +1019,8 @@ On fail: fix the model and re-run the failed checks (plus any whose inputs chang
|
|
|
917
1019
|
- **Do NOT omit provenance on inferred values.** Silent inference reaches Phase 1 under Rule 2 trust — provenance is the audit trail.
|
|
918
1020
|
- **Do NOT alias a task output into an unrelated existing variable to satisfy lineage.** If a task produces a new datum, declare a §1.5 variable for it. Aliasing (`complianceStatus -> titleReviewStatus` with no `complianceStatus` row) closes lineage mechanically but corrupts meaning — see §Variable lineage closure output-naming rule.
|
|
919
1021
|
- **Do NOT emit a decision `action` button whose Behavior names a destination lane the case graph cannot reach.** Every routing button's variable+value must be keyed by a downstream entry / exit condition (§Finalization step 15, §Logical integrity step 5). A button that "routes to the X lane" while X is entered only by an external connector event is a dead branch.
|
|
1022
|
+
- **Do NOT use `user-selected-stage` without an upstream `wait-for-user` exit.** Deterministic rejection, approval, send-back, cancellation, and SLA routing use decision facts and guarded exits/entries instead.
|
|
1023
|
+
- **Do NOT mark correction/resubmission review or decision tasks `Run Only Once: Yes`.** New attempts need fresh producer tasks and neutral or attempt-scoped decision state.
|
|
920
1024
|
- **Do NOT author an `action` Input Schema field the resolved app does not expose.** Fields outside the app's `tasks describe` schema cannot bind (§Finalization step 16). Reusing one app across many tasks is correct **when it is code-switched** (distinct `actionType` per task, fields ⊆ the app schema — the normalized-action-app pattern a full case relies on); it is the substitute anti-pattern (`rev_substitute_app`) only without a distinct `actionType` or with non-bindable fields.
|
|
921
1025
|
- **Do NOT leave a resolved resource's required input unbound, and do NOT bind an output the resource never emits.** Once a task resolves to a live resource, every required declared input needs a `Binding` row (or `<UNRESOLVED>` + `high` review item) and every `-> caseVar` extract `Field` must exist in the resolved contract (§Resolved-resource I/O completeness, §Finalization step 19). A silently-missing required input faults the job at runtime.
|
|
922
1026
|
- **Do NOT declare a §1.5 Case Variable for an input that is just an upstream task's output.** Reference it directly — whole-value `<- "Stage"."Task".out` or in-expression `vars.$xref('Stage','Task','out')`. The emitting task is its own producer; a §1.5 row is only for renaming, custom `Default` / `Type`, or case-level state (§Variable lineage closure → Task-output direct reference).
|