{ "schemaVersion": 1, "contractVersion": "1.1.0", "sourceSha256": "97ab56bc54149f32ea16577369c4ec29579b516ea464cb42010b31e4dc413e60", "recipes": [ { "code": "T01", "type": "list", "templateComponent": "KbxListPage", "defaultCommands": [ { "id": "search", "label": "조회", "group": "query", "shortcut": "F3", "permissionKind": "none" }, { "id": "excel", "label": "엑셀", "group": "output", "permissionKind": "none" } ], "requiredPolicies": [ "server-read-model", "tanstack-query", "search-condition-preservation", "server-side-bulk-selection" ], "recoveryPolicies": [ "idle-before-first-search", "retain-grid-during-refresh", "retry-with-search-context", "partial-bulk-result" ], "securityPolicies": [ "screen-permission", "command-permission", "safe-drilldown-route", "masked-sensitive-cells" ], "canonicalScenarioIds": [ "scenario.oms.order-list.bulk-ship", "scenario.oms.order-list.all-filtered-ship" ], "scaffoldSurfaces": [ "search", "content", "summary" ], "testProfile": { "requiredScenarioKinds": [ "e2e" ], "requiredTags": [ "bulk", "idempotency" ], "requiredEvidence": [ "playwright-trace" ], "requiredChecks": [ "idle-search", "refresh-retains-context", "bulk-partial-result", "safe-drilldown" ] } }, { "code": "T02", "type": "master", "templateComponent": "KbxMasterPage", "defaultCommands": [ { "id": "search", "label": "조회", "group": "query", "shortcut": "F3", "permissionKind": "none" }, { "id": "new", "label": "신규", "group": "edit", "permissionKind": "write" }, { "id": "save", "label": "저장", "group": "edit", "shortcut": "F8", "variant": "primary", "permissionKind": "write" }, { "id": "excel", "label": "엑셀", "group": "output", "permissionKind": "none" } ], "requiredPolicies": [ "normalized-write-model", "lookup-provider", "server-validation", "optimistic-concurrency", "audit" ], "recoveryPolicies": [ "dirty-navigation-guard", "conflict-reload", "field-validation-focus", "readonly-after-terminal-state" ], "securityPolicies": [ "screen-permission", "write-command-permission", "server-enforcement", "sensitive-value-masking" ], "canonicalScenarioIds": [ "scenario.erp.item-master.lifecycle", "scenario.erp.item-master.keyboard-recovery" ], "scaffoldSurfaces": [ "list", "detail" ], "testProfile": { "requiredScenarioKinds": [ "e2e", "integration" ], "requiredTags": [ "master-crud", "concurrency", "audit" ], "requiredEvidence": [ "playwright-trace", "db-assertions" ], "requiredChecks": [ "permission-aware-save", "dirty-guard", "conflict-reload", "audit-visible" ] } }, { "code": "T03", "type": "transaction", "templateComponent": "KbxTransactionPage", "defaultCommands": [ { "id": "new", "label": "신규", "group": "edit", "permissionKind": "write" }, { "id": "save", "label": "저장", "group": "edit", "shortcut": "F8", "variant": "primary", "permissionKind": "write" }, { "id": "excel", "label": "엑셀", "group": "output", "permissionKind": "none" } ], "requiredPolicies": [ "normalized-write-model", "header-detail-transaction", "server-validation", "optimistic-concurrency", "audit", "outbox" ], "recoveryPolicies": [ "dirty-navigation-guard", "conflict-reload", "row-key-validation", "double-submit-guard" ], "securityPolicies": [ "screen-permission", "write-command-permission", "workflow-permission", "server-enforcement" ], "canonicalScenarioIds": [ "scenario.oms.order-register.keyboard", "scenario.oms.order-register.conflict", "scenario.oms.order-register.lifecycle" ], "scaffoldSurfaces": [ "header", "detail", "summary" ], "testProfile": { "requiredScenarioKinds": [ "e2e", "integration" ], "requiredTags": [ "keyboard", "lookup", "conflict", "workflow" ], "requiredEvidence": [ "playwright-trace", "problem-json" ], "requiredChecks": [ "f2-lookup", "f8-save", "row-key-validation", "conflict-recovery" ] } }, { "code": "T04", "type": "fast-entry", "templateComponent": "KbxFastEntryPage", "defaultCommands": [ { "id": "new", "label": "신규", "group": "edit", "permissionKind": "write" }, { "id": "save", "label": "저장", "group": "edit", "shortcut": "F8", "variant": "primary", "permissionKind": "write" }, { "id": "excel", "label": "엑셀", "group": "output", "permissionKind": "none" } ], "requiredPolicies": [ "typed-clipboard-normalization", "stable-client-row-key", "bulk-server-validation", "idempotent-bulk-save" ], "recoveryPolicies": [ "error-cell-navigation", "paste-error-summary", "dirty-navigation-guard", "partial-save-result" ], "securityPolicies": [ "screen-permission", "write-command-permission", "lookup-entity-resolution", "server-enforcement" ], "canonicalScenarioIds": [ "scenario.erp.item-price.fast-entry", "scenario.oms.order-register.fast-entry" ], "scaffoldSurfaces": [ "guide", "content", "validation", "summary" ], "testProfile": { "requiredScenarioKinds": [ "e2e" ], "requiredTags": [ "fast-entry", "paste", "fill-down", "idempotency" ], "requiredEvidence": [ "playwright-trace", "problem-json" ], "requiredChecks": [ "multi-cell-paste", "fill-down", "error-navigation", "partial-save-result" ] } }, { "code": "T05", "type": "master-detail", "templateComponent": "KbxMasterDetailPage", "defaultCommands": [ { "id": "search", "label": "조회", "group": "query", "shortcut": "F3", "permissionKind": "none" }, { "id": "excel", "label": "엑셀", "group": "output", "permissionKind": "none" } ], "requiredPolicies": [ "server-read-model", "master-selection-context", "detail-projection", "n-plus-one-prohibition" ], "recoveryPolicies": [ "selection-restore-after-refresh", "retain-master-on-detail-error", "safe-drilldown", "empty-master-detail-reset" ], "securityPolicies": [ "screen-permission", "safe-drilldown-route", "masked-sensitive-detail" ], "canonicalScenarioIds": [ "scenario.erp.inventory.master-detail-context" ], "scaffoldSurfaces": [ "search", "master", "detail" ], "testProfile": { "requiredScenarioKinds": [ "e2e" ], "requiredTags": [ "master-detail", "context-retention", "drill-down" ], "requiredEvidence": [ "playwright-trace", "api-transcript" ], "requiredChecks": [ "master-selection-context", "detail-error-retains-master", "history-context", "safe-drilldown" ] } }, { "code": "T06", "type": "queue", "templateComponent": "KbxQueuePage", "defaultCommands": [ { "id": "search", "label": "조회", "group": "query", "shortcut": "F3", "permissionKind": "none" } ], "requiredPolicies": [ "exception-first-projection", "sla-state", "server-side-bulk-selection", "audit" ], "recoveryPolicies": [ "partial-action-result", "retryable-vs-terminal-error", "stale-event-suppression", "detail-context-retention" ], "securityPolicies": [ "screen-permission", "exception-action-permission", "server-enforcement" ], "canonicalScenarioIds": [ "scenario.common.operations.stale-event", "scenario.integration.manual-retry.idempotent", "scenario.common.operations.queue-recovery" ], "scaffoldSurfaces": [ "summary", "exceptions", "content" ], "testProfile": { "requiredScenarioKinds": [ "e2e", "integration" ], "requiredTags": [ "exception", "recovery", "context-retention" ], "requiredEvidence": [ "playwright-trace", "db-assertions" ], "requiredChecks": [ "exception-first", "detail-context-retention", "retryable-vs-terminal", "partial-action-result" ] } }, { "code": "T07", "type": "reconcile", "templateComponent": "KbxReconcilePage", "defaultCommands": [ { "id": "search", "label": "조회", "group": "query", "shortcut": "F3", "permissionKind": "none" } ], "requiredPolicies": [ "expected-actual-difference-projection", "reason-code", "resolution-state", "audit" ], "recoveryPolicies": [ "grace-period-before-mismatch", "mismatch-only-filter", "resolution-retry", "retain-comparison-context" ], "securityPolicies": [ "screen-permission", "resolution-permission", "server-enforcement" ], "canonicalScenarioIds": [ "scenario.common.reconcile.grace-period", "scenario.common.reconcile.mismatch-recovery" ], "scaffoldSurfaces": [ "search", "content", "resolution" ], "testProfile": { "requiredScenarioKinds": [ "e2e", "integration" ], "requiredTags": [ "reconcile", "mismatch-filter", "eventual-consistency" ], "requiredEvidence": [ "playwright-trace", "db-assertions" ], "requiredChecks": [ "mismatch-only-filter", "grace-period", "resolution-retry", "comparison-context" ] } }, { "code": "T08", "type": "import", "templateComponent": "KbxImportPage", "defaultCommands": [], "requiredPolicies": [ "staging-before-domain-write", "mapping-source-traceability", "background-job-threshold", "idempotent-commit", "audit" ], "recoveryPolicies": [ "session-mapping-isolation", "validation-error-download", "partial-commit-result", "job-refresh-recovery" ], "securityPolicies": [ "screen-permission", "file-preflight", "commit-permission", "server-validation", "sensitive-column-policy" ], "canonicalScenarioIds": [ "scenario.oms.order-import.partial" ], "scaffoldSurfaces": [ "steps", "content", "result" ], "testProfile": { "requiredScenarioKinds": [ "e2e" ], "requiredTags": [ "excel", "mapping", "staging", "partial-success", "job" ], "requiredEvidence": [ "playwright-trace", "problem-json" ], "requiredChecks": [ "mapping-isolation", "validation-download", "commit-confirm", "job-refresh-recovery" ] } }, { "code": "T09", "type": "wms-mobile", "templateComponent": "KbxWmsMobilePage", "defaultCommands": [], "requiredPolicies": [ "barcode-normalization", "server-validation-before-success", "idempotent-scan-command", "network-state", "offline-command-policy" ], "recoveryPolicies": [ "duplicate-scan-debounce", "response-loss-replay", "wrong-item-no-retry", "pending-command-visibility" ], "securityPolicies": [ "screen-permission", "execute-permission", "server-enforcement", "offline-command-allowlist" ], "canonicalScenarioIds": [ "scenario.wms.picking.idempotent-replay", "scenario.wms.picking.wrong-item" ], "scaffoldSurfaces": [ "context", "content", "actions" ], "testProfile": { "requiredScenarioKinds": [ "e2e" ], "requiredTags": [ "scanner", "idempotency", "network", "retry-policy" ], "requiredEvidence": [ "playwright-trace", "api-transcript" ], "requiredChecks": [ "scan-normalization", "server-before-success", "response-loss-replay", "wrong-item-no-retry" ] } } ] }