oh-my-agent-commandcode 0.0.0-stage → 20.38.3
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/README.md +35 -2
- package/filter-test-output.sh +52 -0
- package/mods/oma.ts +347 -0
- package/package.json +30 -4
- package/skills/_shared/conditional/experiment-ledger.md +28 -0
- package/skills/_shared/conditional/exploration-loop.md +22 -0
- package/skills/_shared/conditional/quality-score.md +33 -0
- package/skills/_shared/core/anti-ai-prose.md +191 -0
- package/skills/_shared/core/api-contracts/README.md +28 -0
- package/skills/_shared/core/api-contracts/template.md +90 -0
- package/skills/_shared/core/clarification-protocol.md +23 -0
- package/skills/_shared/core/code-intelligence.md +46 -0
- package/skills/_shared/core/collaboration-policy.md +28 -0
- package/skills/_shared/core/common-checklist.md +28 -0
- package/skills/_shared/core/context-budget.md +22 -0
- package/skills/_shared/core/context-loading.md +34 -0
- package/skills/_shared/core/difficulty-guide.md +26 -0
- package/skills/_shared/core/execution-policy.md +31 -0
- package/skills/_shared/core/lessons-learned.md +33 -0
- package/skills/_shared/core/prompt-structure.md +18 -0
- package/skills/_shared/core/quality-principles.md +11 -0
- package/skills/_shared/core/session-metrics.md +35 -0
- package/skills/_shared/core/skill-routing.md +39 -0
- package/skills/_shared/core/test-approach.md +54 -0
- package/skills/_shared/core/vendor-detection.md +52 -0
- package/skills/_shared/runtime/memory-protocol.md +118 -0
- package/skills/_shared/runtime/result-contract.md +64 -0
- package/skills/_shared/ui-interaction-quality.md +133 -0
- package/skills/oma-academic-writing/SKILL.md +181 -0
- package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
- package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
- package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
- package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
- package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
- package/skills/oma-architecture/SKILL.md +203 -0
- package/skills/oma-architecture/resources/api-evolution.md +41 -0
- package/skills/oma-architecture/resources/checklist.md +42 -0
- package/skills/oma-architecture/resources/execution-protocol.md +115 -0
- package/skills/oma-architecture/resources/methodology-selection.md +92 -0
- package/skills/oma-architecture/resources/migration-patterns.md +28 -0
- package/skills/oma-architecture/resources/output-templates.md +111 -0
- package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
- package/skills/oma-backend/SKILL.md +202 -0
- package/skills/oma-backend/resources/checklist.md +45 -0
- package/skills/oma-backend/resources/error-playbook.md +97 -0
- package/skills/oma-backend/resources/execution-protocol.md +39 -0
- package/skills/oma-backend/resources/orm-reference.md +61 -0
- package/skills/oma-backend/variants/node/api-template.ts +315 -0
- package/skills/oma-backend/variants/node/snippets.md +475 -0
- package/skills/oma-backend/variants/node/stack.yaml +21 -0
- package/skills/oma-backend/variants/node/tech-stack.md +33 -0
- package/skills/oma-backend/variants/python/api-template.py +378 -0
- package/skills/oma-backend/variants/python/snippets.md +199 -0
- package/skills/oma-backend/variants/python/stack.yaml +18 -0
- package/skills/oma-backend/variants/python/tech-stack.md +45 -0
- package/skills/oma-backend/variants/rust/api-template.rs +635 -0
- package/skills/oma-backend/variants/rust/snippets.md +471 -0
- package/skills/oma-backend/variants/rust/stack.yaml +20 -0
- package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
- package/skills/oma-backend/variants/stack.schema.json +73 -0
- package/skills/oma-brainstorm/SKILL.md +166 -0
- package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
- package/skills/oma-coordination/SKILL.md +171 -0
- package/skills/oma-db/SKILL.md +201 -0
- package/skills/oma-db/resources/anti-patterns.md +177 -0
- package/skills/oma-db/resources/checklist.md +67 -0
- package/skills/oma-db/resources/document-templates.md +107 -0
- package/skills/oma-db/resources/error-playbook.md +50 -0
- package/skills/oma-db/resources/examples.md +170 -0
- package/skills/oma-db/resources/execution-protocol.md +127 -0
- package/skills/oma-db/resources/iso-controls.md +98 -0
- package/skills/oma-db/resources/migration-playbook.md +93 -0
- package/skills/oma-db/resources/query-tuning.md +57 -0
- package/skills/oma-db/resources/vector-db.md +159 -0
- package/skills/oma-debug/SKILL.md +146 -0
- package/skills/oma-debug/resources/bug-report-template.md +327 -0
- package/skills/oma-debug/resources/checklist.md +31 -0
- package/skills/oma-debug/resources/common-patterns.md +734 -0
- package/skills/oma-debug/resources/debugging-checklist.md +364 -0
- package/skills/oma-debug/resources/error-playbook.md +94 -0
- package/skills/oma-debug/resources/execution-protocol.md +40 -0
- package/skills/oma-design/SKILL.md +135 -0
- package/skills/oma-design/resources/asset-strategy.md +34 -0
- package/skills/oma-design/resources/checklist.md +63 -0
- package/skills/oma-design/resources/data-grid.md +48 -0
- package/skills/oma-design/resources/design-md-spec.md +107 -0
- package/skills/oma-design/resources/design-tokens.md +53 -0
- package/skills/oma-design/resources/error-playbook.md +18 -0
- package/skills/oma-design/resources/execution-protocol.md +95 -0
- package/skills/oma-design/resources/external-design-skills.md +130 -0
- package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
- package/skills/oma-design/resources/product-interface-review.md +59 -0
- package/skills/oma-design/resources/redesign-protocol.md +52 -0
- package/skills/oma-design/resources/stitch-integration.md +244 -0
- package/skills/oma-dev-workflow/SKILL.md +375 -0
- package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
- package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
- package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
- package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
- package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
- package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
- package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
- package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
- package/skills/oma-docs/SKILL.md +77 -0
- package/skills/oma-docs/resources/commands.md +76 -0
- package/skills/oma-explanation/SKILL.md +212 -0
- package/skills/oma-explanation/resources/document-structure.md +115 -0
- package/skills/oma-explanation/resources/draft-format.md +199 -0
- package/skills/oma-explanation/resources/html-contract.md +102 -0
- package/skills/oma-frontend/SKILL.md +227 -0
- package/skills/oma-frontend/resources/angular-rules.md +110 -0
- package/skills/oma-frontend/resources/checklist.md +76 -0
- package/skills/oma-frontend/resources/error-playbook.md +125 -0
- package/skills/oma-frontend/resources/execution-protocol.md +46 -0
- package/skills/oma-frontend/resources/snippets.md +354 -0
- package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
- package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
- package/skills/oma-frontend/resources/tech-stack.md +156 -0
- package/skills/oma-hwp/SKILL.md +166 -0
- package/skills/oma-hwp/config/hwp-config.yaml +35 -0
- package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
- package/skills/oma-hwp/resources/execution-protocol.md +145 -0
- package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
- package/skills/oma-hwp/resources/package.json +13 -0
- package/skills/oma-hwp/resources/troubleshooting.md +70 -0
- package/skills/oma-hwp/resources/tsconfig.json +10 -0
- package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
- package/skills/oma-image/SKILL.md +142 -0
- package/skills/oma-image/config/image-config.yaml +70 -0
- package/skills/oma-image/resources/checklist.md +18 -0
- package/skills/oma-image/resources/execution-protocol.md +117 -0
- package/skills/oma-image/resources/invocation.md +105 -0
- package/skills/oma-image/resources/prompt-tips.md +71 -0
- package/skills/oma-image/resources/vendor-matrix.md +90 -0
- package/skills/oma-market/SKILL.md +142 -0
- package/skills/oma-market/resources/checklist.md +12 -0
- package/skills/oma-market/resources/error-playbook.md +12 -0
- package/skills/oma-market/resources/execution-protocol.md +60 -0
- package/skills/oma-market/resources/frameworks/pestel.md +101 -0
- package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
- package/skills/oma-market/resources/frameworks/swot.md +61 -0
- package/skills/oma-market/resources/intent-rules.md +35 -0
- package/skills/oma-market/resources/output-laws.md +53 -0
- package/skills/oma-mobile/SKILL.md +168 -0
- package/skills/oma-mobile/resources/checklist.md +77 -0
- package/skills/oma-mobile/resources/error-playbook.md +198 -0
- package/skills/oma-mobile/resources/execution-protocol.md +47 -0
- package/skills/oma-mobile/resources/screen-template.dart +331 -0
- package/skills/oma-mobile/resources/screen-template.swift +239 -0
- package/skills/oma-mobile/resources/screen-template.tsx +179 -0
- package/skills/oma-mobile/resources/tech-stack.md +69 -0
- package/skills/oma-mobile/variants/README.md +45 -0
- package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
- package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
- package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
- package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
- package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
- package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
- package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
- package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
- package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
- package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
- package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
- package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
- package/skills/oma-mobile/variants/stack.schema.json +68 -0
- package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
- package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
- package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
- package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
- package/skills/oma-observability/SKILL.md +225 -0
- package/skills/oma-observability/resources/anti-patterns.md +555 -0
- package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
- package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
- package/skills/oma-observability/resources/boundaries/release.md +372 -0
- package/skills/oma-observability/resources/boundaries/slo.md +225 -0
- package/skills/oma-observability/resources/checklist.md +123 -0
- package/skills/oma-observability/resources/examples.md +448 -0
- package/skills/oma-observability/resources/execution-protocol.md +166 -0
- package/skills/oma-observability/resources/incident-forensics.md +348 -0
- package/skills/oma-observability/resources/intent-rules.md +307 -0
- package/skills/oma-observability/resources/layers/L3-network.md +281 -0
- package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
- package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
- package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
- package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
- package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
- package/skills/oma-observability/resources/layers/mesh.md +368 -0
- package/skills/oma-observability/resources/matrix.md +177 -0
- package/skills/oma-observability/resources/meta-observability.md +605 -0
- package/skills/oma-observability/resources/observability-as-code.md +666 -0
- package/skills/oma-observability/resources/signals/audit.md +310 -0
- package/skills/oma-observability/resources/signals/cost.md +303 -0
- package/skills/oma-observability/resources/signals/logs.md +263 -0
- package/skills/oma-observability/resources/signals/metrics.md +478 -0
- package/skills/oma-observability/resources/signals/privacy.md +351 -0
- package/skills/oma-observability/resources/signals/profiles.md +245 -0
- package/skills/oma-observability/resources/signals/traces.md +360 -0
- package/skills/oma-observability/resources/standards.md +214 -0
- package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
- package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
- package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
- package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
- package/skills/oma-observability/resources/vendor-categories.md +352 -0
- package/skills/oma-orchestration/SKILL.md +302 -0
- package/skills/oma-orchestration/config/cli-config.yaml +92 -0
- package/skills/oma-orchestration/resources/memory-schema.md +232 -0
- package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
- package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
- package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
- package/skills/oma-orchestration/scripts/verify.sh +20 -0
- package/skills/oma-orchestration/templates/backend-task.md +19 -0
- package/skills/oma-orchestration/templates/debug-task.md +16 -0
- package/skills/oma-orchestration/templates/frontend-task.md +18 -0
- package/skills/oma-orchestration/templates/mobile-task.md +18 -0
- package/skills/oma-orchestration/templates/qa-task.md +16 -0
- package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
- package/skills/oma-pdf/SKILL.md +162 -0
- package/skills/oma-pdf/config/pdf-config.yaml +27 -0
- package/skills/oma-pdf/resources/execution-protocol.md +127 -0
- package/skills/oma-pm/SKILL.md +157 -0
- package/skills/oma-pm/resources/error-playbook.md +75 -0
- package/skills/oma-pm/resources/examples.md +439 -0
- package/skills/oma-pm/resources/execution-protocol.md +62 -0
- package/skills/oma-pm/resources/iso-planning.md +110 -0
- package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
- package/skills/oma-pm/resources/task-template.json +86 -0
- package/skills/oma-qa/SKILL.md +141 -0
- package/skills/oma-qa/resources/checklist.md +339 -0
- package/skills/oma-qa/resources/error-playbook.md +98 -0
- package/skills/oma-qa/resources/execution-protocol.md +169 -0
- package/skills/oma-qa/resources/iso-quality.md +82 -0
- package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
- package/skills/oma-recap/SKILL.md +245 -0
- package/skills/oma-recap/resources/output-formats.md +83 -0
- package/skills/oma-refactor/SKILL.md +184 -0
- package/skills/oma-refactor/resources/definition.md +108 -0
- package/skills/oma-refactor/resources/governance.md +33 -0
- package/skills/oma-refactor/resources/hotspots.py +44 -0
- package/skills/oma-refactor/resources/measurement.md +93 -0
- package/skills/oma-scholar/SKILL.md +276 -0
- package/skills/oma-scholar/config/scholar-config.yaml +79 -0
- package/skills/oma-scholar/resources/api-endpoints.md +174 -0
- package/skills/oma-scholar/resources/checklist.md +92 -0
- package/skills/oma-scholar/resources/execution-protocol.md +224 -0
- package/skills/oma-scholar/resources/fallback-providers.md +143 -0
- package/skills/oma-scholar/resources/setup-openalex.md +85 -0
- package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
- package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
- package/skills/oma-scm/SKILL.md +103 -0
- package/skills/oma-scm/resources/cm-operations.md +56 -0
- package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
- package/skills/oma-scm/resources/conventional-commits.md +108 -0
- package/skills/oma-scm/resources/merge-risk.md +76 -0
- package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
- package/skills/oma-search/SKILL.md +125 -0
- package/skills/oma-search/resources/checklist.md +36 -0
- package/skills/oma-search/resources/error-playbook.md +66 -0
- package/skills/oma-search/resources/examples.md +80 -0
- package/skills/oma-search/resources/execution-protocol.md +86 -0
- package/skills/oma-search/resources/intent-rules.md +47 -0
- package/skills/oma-search/resources/trust-registry.md +53 -0
- package/skills/oma-security/SKILL.md +172 -0
- package/skills/oma-security/resources/artex.md +108 -0
- package/skills/oma-security/resources/ci.md +134 -0
- package/skills/oma-security/resources/cisco-source.md +108 -0
- package/skills/oma-security/resources/deepsec-config.md +45 -0
- package/skills/oma-security/resources/deepsec-matchers.md +35 -0
- package/skills/oma-security/resources/deepsec-scanning.md +45 -0
- package/skills/oma-security/resources/deepsec-setup.md +41 -0
- package/skills/oma-security/resources/findings-contract.md +408 -0
- package/skills/oma-security/resources/mcp-scanning.md +122 -0
- package/skills/oma-security/resources/skill-scanning.md +106 -0
- package/skills/oma-security/resources/validation.md +71 -0
- package/skills/oma-skill-creation/SKILL.md +84 -0
- package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
- package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
- package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
- package/skills/oma-slide/SKILL.md +277 -0
- package/skills/oma-slide/resources/animation-patterns.md +245 -0
- package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
- package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
- package/skills/oma-slide/resources/canva-integration.md +203 -0
- package/skills/oma-slide/resources/checklist.md +46 -0
- package/skills/oma-slide/resources/design-doctrine.md +260 -0
- package/skills/oma-slide/resources/fixed-stage.md +232 -0
- package/skills/oma-slide/resources/generation-protocol.md +393 -0
- package/skills/oma-slide/resources/native-pptx.md +84 -0
- package/skills/oma-slide/resources/selection-index.json +461 -0
- package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
- package/skills/oma-slide/resources/style-presets.md +520 -0
- package/skills/oma-tf-infra/SKILL.md +201 -0
- package/skills/oma-tf-infra/resources/checklist.md +53 -0
- package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
- package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
- package/skills/oma-tf-infra/resources/examples.md +38 -0
- package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
- package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
- package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
- package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
- package/skills/oma-translation/SKILL.md +229 -0
- package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
- package/skills/oma-translation/resources/lang/_template.md +73 -0
- package/skills/oma-translation/resources/lang/en.md +123 -0
- package/skills/oma-translation/resources/lang/ja.md +274 -0
- package/skills/oma-translation/resources/lang/ko.md +228 -0
- package/skills/oma-translation/resources/lang/zh.md +285 -0
- package/skills/oma-translation/resources/style-skills.md +104 -0
- package/skills/oma-translation/resources/translation-rubric.md +126 -0
- package/skills/oma-video/SKILL.md +229 -0
- package/skills/oma-video/config/video-config.yaml +60 -0
- package/skills/oma-video/resources/checklist.md +26 -0
- package/skills/oma-video/resources/execution-protocol.md +122 -0
- package/skills/oma-video/resources/existing-media.md +185 -0
- package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
- package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
- package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
- package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
- package/skills/oma-video/resources/motion-principles.md +81 -0
- package/skills/oma-video/resources/mpt/driver.py +301 -0
- package/skills/oma-video/resources/prompt-tips.md +75 -0
- package/skills/oma-video/resources/script-schema.md +81 -0
- package/skills/oma-video/resources/sound-design.md +127 -0
- package/skills/oma-video/resources/strudel/package.json +11 -0
- package/skills/oma-video/resources/strudel/page.html +87 -0
- package/skills/oma-video/resources/strudel/render.mjs +295 -0
- package/skills/oma-video/resources/vendor-matrix.md +124 -0
- package/skills/oma-voice/SKILL.md +249 -0
- package/skills/oma-voice/config/voice-config.yaml +30 -0
- package/skills/oma-voice/resources/audio-processing.md +119 -0
- package/skills/oma-voice/resources/checklist.md +47 -0
- package/skills/oma-voice/resources/execution-protocol.md +215 -0
- package/skills/oma-voice/resources/prompt-tips.md +43 -0
- package/skills/oma-voice/resources/voice-matrix.md +51 -0
- package/skills/oma-voice/resources/voicestudio.md +87 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Frontend Agent - Angular Rules
|
|
2
|
+
|
|
3
|
+
Applies when the target project is Angular (`angular.json` present, or `@angular/core` in
|
|
4
|
+
`package.json`). In Angular projects these rules **replace** the React/Next.js-specific
|
|
5
|
+
sections of this skill (shadcn workflow, Server/Client component split, Next.js libraries).
|
|
6
|
+
Cross-cutting rules still apply: accessibility, design tokens, i18n sources of truth,
|
|
7
|
+
self-describing file names, and verification before handoff.
|
|
8
|
+
|
|
9
|
+
## Core Conventions
|
|
10
|
+
|
|
11
|
+
1. **Standalone components only** — no new `NgModule`s. Existing NgModule code may stay;
|
|
12
|
+
migrate opportunistically, never big-bang.
|
|
13
|
+
2. **`ChangeDetectionStrategy.OnPush` on every component.** Prefer zoneless
|
|
14
|
+
(`provideZonelessChangeDetection`) when the project already opts in.
|
|
15
|
+
3. **Signals first**: `signal`, `computed`, `effect`, signal inputs `input()`, `model()`,
|
|
16
|
+
and `output()` are the default state primitives. Reach for RxJS only for genuine
|
|
17
|
+
event streams (see RxJS policy below).
|
|
18
|
+
4. **`inject()` over constructor injection** in new code.
|
|
19
|
+
5. **New template control flow** — `@if` / `@for` / `@switch` / `@defer`. Do not write
|
|
20
|
+
`*ngIf` / `*ngFor` in new templates.
|
|
21
|
+
6. **Lazy routes**: `loadComponent` / `loadChildren`; colocate feature route configs with
|
|
22
|
+
the feature.
|
|
23
|
+
7. **Typed Reactive Forms** for anything beyond a single input; validation schemas live
|
|
24
|
+
next to the form.
|
|
25
|
+
8. **Angular CLI for scaffolding** (`ng generate`); respect the project's generator
|
|
26
|
+
defaults and file-naming style. For naming, follow the project's existing convention;
|
|
27
|
+
new projects follow the current Angular style guide (kebab-case basenames).
|
|
28
|
+
9. **UI library**: use the project's detected library (Spartan UI, Angular Material,
|
|
29
|
+
PrimeNG, …) before hand-rolling components. Tailwind CSS follows
|
|
30
|
+
`resources/tailwind-rules.md` where applicable.
|
|
31
|
+
10. **Data access**: `HttpClient` (or `httpResource`) lives in injectable services, never
|
|
32
|
+
inline in components.
|
|
33
|
+
|
|
34
|
+
## RxJS Policy — Marble Tests Are MANDATORY
|
|
35
|
+
|
|
36
|
+
Signals cover most component state. RxJS is the right tool for **streams over time**:
|
|
37
|
+
debounced input, cancellation (`switchMap`), merging event sources, websockets, polling.
|
|
38
|
+
|
|
39
|
+
Interop happens at boundaries only: `toSignal` / `toObservable` from
|
|
40
|
+
`@angular/core/rxjs-interop`. Do not hand-subscribe in components when `toSignal` or the
|
|
41
|
+
`async` pipe can own the subscription.
|
|
42
|
+
|
|
43
|
+
**Non-negotiable: every non-trivial Observable pipeline ships with a marble test.**
|
|
44
|
+
A stream without a marble test fails review.
|
|
45
|
+
|
|
46
|
+
"Non-trivial" means the pipeline contains any of:
|
|
47
|
+
|
|
48
|
+
- time-based operators: `debounceTime`, `throttleTime`, `auditTime`, `delay`, `timer`-driven logic
|
|
49
|
+
- combination operators: `combineLatest`, `withLatestFrom`, `merge`, `zip`, `race`
|
|
50
|
+
- higher-order mapping: `switchMap`, `mergeMap`, `concatMap`, `exhaustMap`
|
|
51
|
+
- error/retry flow: `retry`, `retryWhen`, `catchError` with re-subscription
|
|
52
|
+
- any custom operator
|
|
53
|
+
|
|
54
|
+
A single synchronous `map`/`filter` on an `HttpClient` call may use a standard async test
|
|
55
|
+
instead — everything else gets marbles.
|
|
56
|
+
|
|
57
|
+
### Marble test skeleton (`TestScheduler`, runner-agnostic)
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { TestScheduler } from 'rxjs/testing';
|
|
61
|
+
import { debounceTime } from 'rxjs';
|
|
62
|
+
|
|
63
|
+
describe('search query stream', () => {
|
|
64
|
+
let scheduler: TestScheduler;
|
|
65
|
+
|
|
66
|
+
beforeEach(() => {
|
|
67
|
+
scheduler = new TestScheduler((actual, expected) => {
|
|
68
|
+
expect(actual).toEqual(expected); // wire to the runner's deep-equal
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('emits only the last value inside the debounce window', () => {
|
|
73
|
+
scheduler.run(({ cold, expectObservable }) => {
|
|
74
|
+
const source$ = cold('a 50ms b 199ms c|', { a: 'n', b: 'ng', c: 'ngx' });
|
|
75
|
+
const result$ = source$.pipe(debounceTime(100));
|
|
76
|
+
expectObservable(result$).toBe('151ms b 100ms (c|)', { b: 'ng', c: 'ngx' });
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Rules for marble tests:
|
|
83
|
+
|
|
84
|
+
1. **Always use `scheduler.run()`** — it virtualizes time, so `debounceTime(300)` needs no
|
|
85
|
+
real waiting and no scheduler injection into production code.
|
|
86
|
+
2. **Test timing, not just values**: the marble diagram must assert *when* emissions
|
|
87
|
+
happen, including completion/error frames.
|
|
88
|
+
3. **Cover cancellation** for higher-order mappings (`switchMap` dropping the stale inner
|
|
89
|
+
observable is exactly the behavior marbles exist to prove) — use `expectSubscriptions`
|
|
90
|
+
for inner-subscription lifetimes when relevant.
|
|
91
|
+
4. `TestScheduler` is runner-agnostic — it works under Vitest, Jest, and Jasmine/Karma;
|
|
92
|
+
only the `assertDeepEqual` wiring differs.
|
|
93
|
+
|
|
94
|
+
## Verification
|
|
95
|
+
|
|
96
|
+
Before handoff, run the project's Angular checks (typical set):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
{pm} run lint # or: ng lint
|
|
100
|
+
bunx tsc --noEmit -p tsconfig.app.json
|
|
101
|
+
{test_cmd} # e.g. bunx vitest run, ng test --watch=false
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Checklist deltas vs the React checklist:
|
|
105
|
+
|
|
106
|
+
- [ ] New components are standalone + OnPush
|
|
107
|
+
- [ ] No new `*ngIf` / `*ngFor` / `NgModule`
|
|
108
|
+
- [ ] Component state is signal-based unless a stream is genuinely needed
|
|
109
|
+
- [ ] Every non-trivial RxJS pipeline has a passing marble test
|
|
110
|
+
- [ ] Routes added lazily (`loadComponent` / `loadChildren`)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Frontend Agent - Self-Verification Checklist
|
|
2
|
+
|
|
3
|
+
Run through every item before submitting your work.
|
|
4
|
+
|
|
5
|
+
## Next.js 16 Conventions
|
|
6
|
+
- [ ] Request-proxy/auth-gate file is named `proxy.ts` (NOT `middleware.ts`) and exports `proxy` (NOT `middleware`)
|
|
7
|
+
<!-- oma-docs:ignore-start -->
|
|
8
|
+
- [ ] Do NOT flag `src/proxy.ts` as dead code or recommend renaming to `middleware.ts`; `proxy.ts` is the canonical Next.js 16+ convention
|
|
9
|
+
<!-- oma-docs:ignore-end -->
|
|
10
|
+
- [ ] Config flags use the `Proxy` form (e.g. `skipProxyUrlNormalize`), not the legacy `Middleware` form
|
|
11
|
+
- [ ] Every `<Link>` passes `prefetch={false}`; any prefetching link is a deliberate high-intent target with an inline reason
|
|
12
|
+
|
|
13
|
+
## TypeScript
|
|
14
|
+
- [ ] Strict mode, no `any` types
|
|
15
|
+
- [ ] Explicit interfaces for all component props
|
|
16
|
+
- [ ] No TypeScript errors (run the project's configured `typecheck` command; preserve framework checks and the selected TypeScript 7/native-preview executable)
|
|
17
|
+
|
|
18
|
+
## Styling
|
|
19
|
+
- [ ] Tailwind CSS only (no inline styles, no CSS modules)
|
|
20
|
+
- [ ] Responsive at 320px, 768px, 1024px, 1440px
|
|
21
|
+
- [ ] Dark mode supported (if project uses it)
|
|
22
|
+
- [ ] No hardcoded colors (use Tailwind theme tokens)
|
|
23
|
+
|
|
24
|
+
## Accessibility (WCAG 2.2 AA)
|
|
25
|
+
- [ ] Semantic HTML elements (`<nav>`, `<main>`, `<button>`)
|
|
26
|
+
- [ ] All images have alt text
|
|
27
|
+
- [ ] Color contrast >= 4.5:1 (normal text), >= 3:1 (large text)
|
|
28
|
+
- [ ] Keyboard navigation works for all interactive elements
|
|
29
|
+
- [ ] ARIA labels on non-obvious interactive elements
|
|
30
|
+
- [ ] Focus indicators visible
|
|
31
|
+
|
|
32
|
+
## UX States
|
|
33
|
+
- [ ] Loading state (skeleton or spinner)
|
|
34
|
+
- [ ] Error state (user-friendly message + retry action)
|
|
35
|
+
- [ ] Empty state (helpful message + CTA)
|
|
36
|
+
- [ ] Optimistic updates where appropriate
|
|
37
|
+
|
|
38
|
+
## Recommended product-interface review (advisory)
|
|
39
|
+
|
|
40
|
+
For new or substantially changed admin consoles, dashboards, SaaS product UI,
|
|
41
|
+
and internal tools, recommend `oma-design` with Interface Design
|
|
42
|
+
`design-review` using [product-interface-review.md](../../oma-design/resources/product-interface-review.md).
|
|
43
|
+
Record `completed`, `recommended-not-run` with a reason, or `not-applicable`.
|
|
44
|
+
An unavailable or omitted advisory review does not block completion; the task's
|
|
45
|
+
required functional, responsive, and accessibility checks still apply.
|
|
46
|
+
|
|
47
|
+
## Deferred / Stub Markers (transparency)
|
|
48
|
+
- [ ] Every deferred external integration is wrapped in `// TODO(oma-deferred): <vendor or feature>`
|
|
49
|
+
- [ ] Every mock data block has `// MVP: replace with <real-source>` on top
|
|
50
|
+
- [ ] Every save/persist UI has a working storage adapter (localStorage, IndexedDB, or API). Empty `onClick={() => console.log("save")}` does NOT count; wire actual persistence, or mark explicitly: `// TODO(oma-deferred): persist <state> to <storage>`
|
|
51
|
+
- [ ] Reload-after-save round-trips state for any save action surfaced in the UI
|
|
52
|
+
|
|
53
|
+
## React 19 hook patterns (catch what eslint catches)
|
|
54
|
+
React 19 + recent `eslint-plugin-react-hooks` flag these as hard errors. They aren't style nits; they break runtime behavior. Avoid them at write-time, not "fix later".
|
|
55
|
+
|
|
56
|
+
- [ ] **Don't put `setState` synchronously inside `useEffect`** (`react-hooks/set-state-in-effect`). Cascading renders trash performance and, in graphics contexts, can exhaust GPU resources. Replace with: derive in render (`const count = items.length`), lazy `useState` initializer (`useState(() => computeOnce())`), move the update into the event handler that triggered it, or `useSyncExternalStore` for external subscriptions.
|
|
57
|
+
- [ ] **Don't read `ref.current` during render** (`react-hooks/refs`). Refs are null on first render and don't trigger re-renders when they attach, so any JSX gated on `ref.current` is wrong. Read refs only inside event handlers or effects. When a child component needs an instance, pass the ref object itself (or use a callback ref); let the child read `.current` from inside its own effect/handler.
|
|
58
|
+
- [ ] **`useEffect` deps complete and stable.** List every referenced reactive value. Wrap object/array literals in `useMemo` so the dep identity doesn't change every render.
|
|
59
|
+
- [ ] **No prop-mirroring via effect.** `useEffect(() => setX(derive(props)))` is always a bug; compute `x` in the render body or memoize.
|
|
60
|
+
|
|
61
|
+
## react-three-fiber specifics
|
|
62
|
+
- [ ] Heavy components (`Canvas`, drei helpers, anything that touches `window`/WebGL) load via `next/dynamic` with `ssr: false`.
|
|
63
|
+
- [ ] Effects, helpers, and post-process passes mount unconditionally on the relevant state; don't gate them on `ref.current` truthiness in JSX.
|
|
64
|
+
- [ ] Background and lighting work without remote assets when the project doesn't ship a CDN HDR. Solid `<color attach="background">` or local textures beat a `<Environment preset>` that depends on network.
|
|
65
|
+
- [ ] Shadow map sizes scale to the number of lights; default to 1024 unless the scene needs more. Multiple 2048-shadowed lights drain GPU memory on integrated graphics.
|
|
66
|
+
|
|
67
|
+
## Performance
|
|
68
|
+
- [ ] No unnecessary re-renders (check with React DevTools Profiler)
|
|
69
|
+
- [ ] Memoization matches the project's React Compiler setting: compiler ON (`reactCompiler` in `next.config.*`) → no hand-written `useMemo`/`useCallback`/`React.memo` in new code; compiler OFF → memoize manually (see `tech-stack.md` §React Compiler)
|
|
70
|
+
- [ ] Code splitting for route-level components
|
|
71
|
+
- [ ] Images optimized and lazy-loaded
|
|
72
|
+
|
|
73
|
+
## Testing
|
|
74
|
+
- [ ] Unit tests for components with logic
|
|
75
|
+
- [ ] User interactions tested (click, type, submit)
|
|
76
|
+
- [ ] Async behavior tested (loading -> data -> display)
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Frontend Agent - Error Recovery Playbook
|
|
2
|
+
|
|
3
|
+
When you encounter a failure, find the matching scenario and follow the recovery steps.
|
|
4
|
+
Use the relevant recovery steps. If required information or authority is missing, pause the dependent action and continue independent work.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## False Positive: `proxy.ts` flagged as dead code or `middleware.ts` demanded
|
|
9
|
+
|
|
10
|
+
<!-- oma-docs:ignore-start -->
|
|
11
|
+
**Symptoms**: Reviewer claims `src/proxy.ts` won't be picked up, demands rename to `src/middleware.ts`, or flags the auth gate as not wired.
|
|
12
|
+
<!-- oma-docs:ignore-end -->
|
|
13
|
+
|
|
14
|
+
1. Check the installed Next.js version and the project's request interception convention.
|
|
15
|
+
2. For a project using the Next.js 16+ proxy convention, inspect `proxy.ts` in the root or `src/` and its `proxy` export.
|
|
16
|
+
3. Verify location, configuration, and relevant tests. A framework entry point need not have application imports.
|
|
17
|
+
4. Correct a finding based only on an outdated filename assumption; retain any wiring or authorization defect supported by evidence.
|
|
18
|
+
5. Reference: https://nextjs.org/docs/messages/middleware-to-proxy
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## TypeScript Compilation Error
|
|
23
|
+
|
|
24
|
+
**Symptoms**: `TS2322`, `TS2345`, `Type X is not assignable to type Y`
|
|
25
|
+
|
|
26
|
+
1. Read the error: which file, which line, which types conflict
|
|
27
|
+
2. Check: is the interface/type definition correct?
|
|
28
|
+
3. Check: is the API response type matching the expected shape?
|
|
29
|
+
4. If API mismatch: update the type to match actual response (don't cast with `as any`)
|
|
30
|
+
5. If generic issue: use explicit type parameter `<Type>` instead of inference
|
|
31
|
+
6. **NEVER do this**: `@ts-ignore`, `as any` (hides type issues without resolving them)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Build Error
|
|
36
|
+
|
|
37
|
+
**Symptoms**: `next build` fails, `Module not found`, `SyntaxError`
|
|
38
|
+
|
|
39
|
+
1. Read the full error: which module, which file
|
|
40
|
+
2. If missing dependency: note in result as "requires `npm install X`"; do NOT install yourself
|
|
41
|
+
3. If import path wrong: use `search_for_pattern("export.*ComponentName")` to find actual path
|
|
42
|
+
4. If dynamic import issue: ensure component is client-side (`'use client'`)
|
|
43
|
+
5. Re-run the build only if the user explicitly requested a build; otherwise use relevant non-build checks and report the verification limit.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Test Failure
|
|
48
|
+
|
|
49
|
+
**Symptoms**: `vitest` FAILED, `expect(X).toBe(Y)` assertion errors
|
|
50
|
+
|
|
51
|
+
1. Read the error: expected vs received, which test file
|
|
52
|
+
2. `find_symbol("ComponentName")` to check current implementation
|
|
53
|
+
3. Determine: test outdated or implementation wrong?
|
|
54
|
+
- Test expects old behavior → update test
|
|
55
|
+
- Component bug → fix component
|
|
56
|
+
4. Re-run the specific test: `npx vitest run path/to/test.ts`
|
|
57
|
+
5. **After 3 failures**: Try a different approach. Record in progress
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Hydration Mismatch (Next.js)
|
|
62
|
+
|
|
63
|
+
**Symptoms**: `Hydration failed`, `Text content does not match server-rendered HTML`
|
|
64
|
+
|
|
65
|
+
1. Find the component that renders differently on server vs client
|
|
66
|
+
2. Common causes:
|
|
67
|
+
- `Date.now()` or `Math.random()` in render
|
|
68
|
+
- Browser-only APIs (`window`, `localStorage`) without `useEffect`
|
|
69
|
+
- Conditional rendering based on client-only state
|
|
70
|
+
3. Fix: keep the server and first client render identical, then set browser-only state in `useEffect`; use a narrowly scoped `dynamic(..., { ssr: false })` boundary when rendering must be client-only
|
|
71
|
+
4. If third-party component: wrap with `dynamic(() => import(...), { ssr: false })`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## API Integration Error
|
|
76
|
+
|
|
77
|
+
**Symptoms**: `Network Error`, `CORS`, `401 Unauthorized`, wrong data shape
|
|
78
|
+
|
|
79
|
+
1. **CORS**: Check backend CORS config; is frontend origin allowed?
|
|
80
|
+
2. **401**: Check token; is it in the header? is it expired?
|
|
81
|
+
3. **Wrong data**: Log `response.data` and compare with expected type
|
|
82
|
+
4. **Network Error**: Is the backend running? Correct port?
|
|
83
|
+
5. If backend isn't your responsibility: document the expected API contract in result
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Styling / Layout Broken
|
|
88
|
+
|
|
89
|
+
**Symptoms**: Component renders but looks wrong, responsive breakpoint fails
|
|
90
|
+
|
|
91
|
+
1. Check Tailwind classes: typo? wrong breakpoint prefix?
|
|
92
|
+
2. Check parent container: is it blocking layout? (`overflow-hidden`, fixed width)
|
|
93
|
+
3. Test at specific breakpoints: 320px, 768px, 1024px, 1440px
|
|
94
|
+
4. Use browser DevTools to inspect computed styles
|
|
95
|
+
5. If dark mode issue: check `dark:` variants applied
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Rate Limit / Quota Error (LLM runtime)
|
|
100
|
+
|
|
101
|
+
**Symptoms**: `429`, `RESOURCE_EXHAUSTED`, `rate limit exceeded` (any vendor runtime: Claude, Codex, etc.)
|
|
102
|
+
|
|
103
|
+
1. Identify the source. An expected rate-limit response from the application under review is a test result, not an agent-provider quota failure.
|
|
104
|
+
2. For provider quota exhaustion, stop affected provider calls and record the unavailable checks; continue independent authorized work when possible.
|
|
105
|
+
3. Preserve injected session/task/run IDs and the claim path. Save progress/results under the configured memory base using the task/run-scoped names in `../../_shared/runtime/memory-protocol.md`.
|
|
106
|
+
4. Use a valid claim status (`partial`, `blocked`, or `failed`) with the actual cause and unresolved work per `../../_shared/runtime/result-contract.md`; do not invent a `quota_exceeded` status.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Workflow State Unavailable
|
|
111
|
+
|
|
112
|
+
Follow `../../_shared/runtime/memory-protocol.md`; state storage is independent of the code-intelligence provider.
|
|
113
|
+
|
|
114
|
+
1. Use the injected progress/result paths and session/task identity.
|
|
115
|
+
2. If a file operation fails, retry once when the failure may be transient.
|
|
116
|
+
3. Preserve work and report the failed path and error to the coordinator. Do not silently redirect artifacts to `/tmp` or mark a missing result as completed.
|
|
117
|
+
4. For read-only tasks, return the result through the runtime's response channel as required by the dispatch contract.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## General Principles
|
|
122
|
+
|
|
123
|
+
- **After 3 failures**: If same approach fails 3 times, must try a different method
|
|
124
|
+
- **Blocked**: If no progress after 5 turns, save current state and record `Status: blocked`
|
|
125
|
+
- **Out of scope**: If you find backend issues, only record in result; do not modify directly
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Frontend Agent - Execution Protocol
|
|
2
|
+
|
|
3
|
+
## Preparation
|
|
4
|
+
Use the task's scope, existing project conventions, and acceptance criteria. Follow `../../_shared/core/execution-policy.md` when it has not already been supplied. Read only references needed by the selected operation; consult lessons or recovery guides for an observed issue. Expand planning depth only when the change requires it.
|
|
5
|
+
|
|
6
|
+
## Step 1: Analyze
|
|
7
|
+
- Read the task requirements carefully
|
|
8
|
+
- Read `DESIGN.md` if present at the project root; treat Section 9 (Agent Prompt Guide) as authoritative component spec
|
|
9
|
+
- Identify which components, pages, and hooks are needed
|
|
10
|
+
- Inspect existing structure and relevant symbols via `../../_shared/core/code-intelligence.md`; if the configured provider is unavailable, use native search only for paths outside this project or ignored paths
|
|
11
|
+
- Review existing patterns: reference search for `Button` through the configured provider to understand usage conventions. Native search is only for paths outside this project or ignored paths.
|
|
12
|
+
- List assumptions; ask if unclear
|
|
13
|
+
|
|
14
|
+
## Step 2: Plan
|
|
15
|
+
- Decide on component structure (which are new, which extend existing)
|
|
16
|
+
- Define props interfaces with TypeScript
|
|
17
|
+
- Plan state management approach (Jotai or Zustand for client, nuqs for URL, TanStack Query for server)
|
|
18
|
+
- Identify API integration points (orval-generated TanStack Query hooks when an OpenAPI spec exists; regenerate via the project's `gen:api` task after contract changes)
|
|
19
|
+
- Plan responsive breakpoints and accessibility requirements
|
|
20
|
+
- For requested GPU/canvas effects, cinematic video-scroll, or selected GSAP APIs,
|
|
21
|
+
choose the matching route in [specialized-visual-implementation.md](specialized-visual-implementation.md).
|
|
22
|
+
- For affected motion, touch, feedback, or interaction performance, apply
|
|
23
|
+
[shared interaction quality](../../_shared/ui-interaction-quality.md).
|
|
24
|
+
|
|
25
|
+
## Step 3: Implement
|
|
26
|
+
- **Honor the task's `test_approach`** (see `../../_shared/core/test-approach.md`): for `tdd` tasks, write and run the focused test first (record the RED failure), make the minimal change (GREEN), then continue
|
|
27
|
+
- Typical affected files (choose an order from actual dependencies):
|
|
28
|
+
1. TypeScript types/interfaces
|
|
29
|
+
2. API client hooks (orval-generated from OpenAPI when available; hand-written TanStack Query otherwise)
|
|
30
|
+
3. Reusable UI components (shadcn/ui based)
|
|
31
|
+
4. Feature components (compose UI + logic)
|
|
32
|
+
5. Page components (route-level)
|
|
33
|
+
6. Tests (unit + integration)
|
|
34
|
+
- Follow `resources/tailwind-rules.md` for styling
|
|
35
|
+
|
|
36
|
+
## Step 4: Verify
|
|
37
|
+
- Check applicable items in `resources/checklist.md`
|
|
38
|
+
- Use `../../_shared/core/common-checklist.md` only for cross-domain verification
|
|
39
|
+
- Check TypeScript strict mode: no errors
|
|
40
|
+
- For `tdd` tasks, append the `TDD_EVIDENCE` block (test command, RED, GREEN) to the result file per `../../_shared/core/test-approach.md`
|
|
41
|
+
- Verify responsive design at 320px, 768px, 1024px, 1440px
|
|
42
|
+
- Test keyboard navigation and screen reader compatibility
|
|
43
|
+
- For a new or substantially changed admin console, dashboard, SaaS product UI, or internal tool, follow the [recommended product-interface review](../../oma-design/resources/product-interface-review.md). Record its advisory outcome; reviewer approval is not a completion prerequisite unless the task explicitly requires it.
|
|
44
|
+
|
|
45
|
+
## On Error
|
|
46
|
+
See `resources/error-playbook.md` for recovery steps.
|