@askdkc/kiokuko 0.1.17 → 0.1.19
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.ja.md +91 -112
- package/README.ko.md +90 -102
- package/README.md +103 -262
- package/README.zh-CN.md +88 -102
- package/dist/agent-file/atomic-write.d.ts +90 -3
- package/dist/agent-file/atomic-write.d.ts.map +1 -1
- package/dist/agent-file/atomic-write.js +990 -14
- package/dist/agent-file/atomic-write.js.map +1 -1
- package/dist/agent-file/managed-block.d.ts +12 -1
- package/dist/agent-file/managed-block.d.ts.map +1 -1
- package/dist/agent-file/managed-block.js +49 -4
- package/dist/agent-file/managed-block.js.map +1 -1
- package/dist/agent-file/render.d.ts +1 -1
- package/dist/agent-file/render.d.ts.map +1 -1
- package/dist/agent-file/render.js +10 -7
- package/dist/agent-file/render.js.map +1 -1
- package/dist/akinator/agent-task.d.ts +11 -22
- package/dist/akinator/agent-task.d.ts.map +1 -1
- package/dist/akinator/agent-task.js +454 -99
- package/dist/akinator/agent-task.js.map +1 -1
- package/dist/akinator/capabilities.d.ts +18 -6
- package/dist/akinator/capabilities.d.ts.map +1 -1
- package/dist/akinator/capabilities.js +72 -35
- package/dist/akinator/capabilities.js.map +1 -1
- package/dist/akinator/capability-binding.d.ts +11 -0
- package/dist/akinator/capability-binding.d.ts.map +1 -0
- package/dist/akinator/capability-binding.js +56 -0
- package/dist/akinator/capability-binding.js.map +1 -0
- package/dist/akinator/domain.js +2 -2
- package/dist/akinator/domain.js.map +1 -1
- package/dist/akinator/knowledge-path.d.ts.map +1 -1
- package/dist/akinator/knowledge-path.js +409 -39
- package/dist/akinator/knowledge-path.js.map +1 -1
- package/dist/akinator/orchestrator.d.ts +3 -4
- package/dist/akinator/orchestrator.d.ts.map +1 -1
- package/dist/akinator/orchestrator.js +1 -4
- package/dist/akinator/orchestrator.js.map +1 -1
- package/dist/akinator/service.d.ts +0 -4
- package/dist/akinator/service.d.ts.map +1 -1
- package/dist/akinator/service.js +19 -35
- package/dist/akinator/service.js.map +1 -1
- package/dist/akinator/skill-discovery-attempt.d.ts +20 -0
- package/dist/akinator/skill-discovery-attempt.d.ts.map +1 -0
- package/dist/akinator/skill-discovery-attempt.js +390 -0
- package/dist/akinator/skill-discovery-attempt.js.map +1 -0
- package/dist/akinator/store.d.ts.map +1 -1
- package/dist/akinator/store.js +107 -52
- package/dist/akinator/store.js.map +1 -1
- package/dist/akinator/types.d.ts +0 -12
- package/dist/akinator/types.d.ts.map +1 -1
- package/dist/bin/kiokuko.js +0 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +534 -148
- package/dist/cli.js.map +1 -1
- package/dist/client/server-client.d.ts +5 -3
- package/dist/client/server-client.d.ts.map +1 -1
- package/dist/client/server-client.js +486 -181
- package/dist/client/server-client.js.map +1 -1
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +861 -86
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/backup.d.ts +2 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +64 -8
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +70 -26
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +0 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +191 -32
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts +10 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +592 -113
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +19 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +569 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/purge.d.ts.map +1 -1
- package/dist/commands/purge.js +3 -0
- package/dist/commands/purge.js.map +1 -1
- package/dist/commands/setup.d.ts +34 -8
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +418 -86
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +317 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/use.d.ts +10 -2
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +851 -73
- package/dist/commands/use.js.map +1 -1
- package/dist/config/paths.d.ts +11 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +64 -29
- package/dist/config/paths.js.map +1 -1
- package/dist/config/project-config.d.ts +1 -0
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +70 -32
- package/dist/config/project-config.js.map +1 -1
- package/dist/context/broker.d.ts +28 -14
- package/dist/context/broker.d.ts.map +1 -1
- package/dist/context/broker.js +604 -145
- package/dist/context/broker.js.map +1 -1
- package/dist/context/delivery.d.ts +6 -21
- package/dist/context/delivery.d.ts.map +1 -1
- package/dist/context/delivery.js +196 -147
- package/dist/context/delivery.js.map +1 -1
- package/dist/context/feedback.d.ts +11 -12
- package/dist/context/feedback.d.ts.map +1 -1
- package/dist/context/feedback.js +229 -261
- package/dist/context/feedback.js.map +1 -1
- package/dist/context/ranking.d.ts +1 -12
- package/dist/context/ranking.d.ts.map +1 -1
- package/dist/context/ranking.js +13 -4
- package/dist/context/ranking.js.map +1 -1
- package/dist/context/recommendations.d.ts +0 -5
- package/dist/context/recommendations.d.ts.map +1 -1
- package/dist/context/recommendations.js +0 -1
- package/dist/context/recommendations.js.map +1 -1
- package/dist/context/run-state.d.ts +26 -0
- package/dist/context/run-state.d.ts.map +1 -0
- package/dist/context/run-state.js +399 -0
- package/dist/context/run-state.js.map +1 -0
- package/dist/context/scoped-broker.d.ts +17 -5
- package/dist/context/scoped-broker.d.ts.map +1 -1
- package/dist/context/scoped-broker.js +512 -106
- package/dist/context/scoped-broker.js.map +1 -1
- package/dist/context/selection-state.d.ts +19 -0
- package/dist/context/selection-state.d.ts.map +1 -0
- package/dist/context/selection-state.js +250 -0
- package/dist/context/selection-state.js.map +1 -0
- package/dist/db/adapter.d.ts +5 -3
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +6 -3
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/capabilities.d.ts.map +1 -1
- package/dist/db/capabilities.js +34 -16
- package/dist/db/capabilities.js.map +1 -1
- package/dist/db/connection.d.ts +8 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +55 -26
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrate.d.ts +28 -7
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +106 -78
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/sqlite-retry.d.ts +11 -0
- package/dist/db/sqlite-retry.d.ts.map +1 -0
- package/dist/db/sqlite-retry.js +66 -0
- package/dist/db/sqlite-retry.js.map +1 -0
- package/dist/db/transaction.d.ts +13 -0
- package/dist/db/transaction.d.ts.map +1 -1
- package/dist/db/transaction.js +53 -24
- package/dist/db/transaction.js.map +1 -1
- package/dist/db/upgrade-backup.d.ts +58 -2
- package/dist/db/upgrade-backup.d.ts.map +1 -1
- package/dist/db/upgrade-backup.js +757 -28
- package/dist/db/upgrade-backup.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/gateway/agent-service.d.ts +4 -1
- package/dist/gateway/agent-service.d.ts.map +1 -1
- package/dist/gateway/agent-service.js +71 -58
- package/dist/gateway/agent-service.js.map +1 -1
- package/dist/gateway/checkpoint-service.d.ts +1 -0
- package/dist/gateway/checkpoint-service.d.ts.map +1 -1
- package/dist/gateway/checkpoint-service.js +47 -24
- package/dist/gateway/checkpoint-service.js.map +1 -1
- package/dist/ledger/archive.d.ts +1 -4
- package/dist/ledger/archive.d.ts.map +1 -1
- package/dist/ledger/archive.js +77 -39
- package/dist/ledger/archive.js.map +1 -1
- package/dist/ledger/maintenance.d.ts +0 -11
- package/dist/ledger/maintenance.d.ts.map +1 -1
- package/dist/ledger/maintenance.js +24 -40
- package/dist/ledger/maintenance.js.map +1 -1
- package/dist/ledger/projection.d.ts +0 -1
- package/dist/ledger/projection.d.ts.map +1 -1
- package/dist/ledger/projection.js.map +1 -1
- package/dist/ledger/promotion.d.ts +0 -9
- package/dist/ledger/promotion.d.ts.map +1 -1
- package/dist/ledger/promotion.js.map +1 -1
- package/dist/ledger/query.d.ts +1 -15
- package/dist/ledger/query.d.ts.map +1 -1
- package/dist/ledger/query.js.map +1 -1
- package/dist/ledger/store.d.ts +0 -1
- package/dist/ledger/store.d.ts.map +1 -1
- package/dist/ledger/store.js +11 -8
- package/dist/ledger/store.js.map +1 -1
- package/dist/ledger/types.d.ts +0 -4
- package/dist/ledger/types.d.ts.map +1 -1
- package/dist/ledger/types.js.map +1 -1
- package/dist/ledger/validate.d.ts.map +1 -1
- package/dist/ledger/validate.js +0 -5
- package/dist/ledger/validate.js.map +1 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +105 -54
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/audit.d.ts +0 -1
- package/dist/memory/audit.d.ts.map +1 -1
- package/dist/memory/audit.js +0 -1
- package/dist/memory/audit.js.map +1 -1
- package/dist/memory/curator.d.ts.map +1 -1
- package/dist/memory/curator.js +172 -96
- package/dist/memory/curator.js.map +1 -1
- package/dist/memory/entries.d.ts +12 -2
- package/dist/memory/entries.d.ts.map +1 -1
- package/dist/memory/entries.js +198 -114
- package/dist/memory/entries.js.map +1 -1
- package/dist/memory/federated-retrieval.d.ts +12 -1
- package/dist/memory/federated-retrieval.d.ts.map +1 -1
- package/dist/memory/federated-retrieval.js +183 -70
- package/dist/memory/federated-retrieval.js.map +1 -1
- package/dist/memory/hybrid-retrieval.d.ts +5 -11
- package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/memory/hybrid-retrieval.js +78 -58
- package/dist/memory/hybrid-retrieval.js.map +1 -1
- package/dist/memory/lifecycle.d.ts.map +1 -1
- package/dist/memory/lifecycle.js +17 -13
- package/dist/memory/lifecycle.js.map +1 -1
- package/dist/memory/rebuild-search.d.ts +5 -0
- package/dist/memory/rebuild-search.d.ts.map +1 -1
- package/dist/memory/rebuild-search.js +101 -76
- package/dist/memory/rebuild-search.js.map +1 -1
- package/dist/memory/retrieval-query.d.ts +0 -5
- package/dist/memory/retrieval-query.d.ts.map +1 -1
- package/dist/memory/retrieval-query.js +0 -5
- package/dist/memory/retrieval-query.js.map +1 -1
- package/dist/memory/retrieval.d.ts.map +1 -1
- package/dist/memory/retrieval.js +25 -131
- package/dist/memory/retrieval.js.map +1 -1
- package/dist/memory/revisions.d.ts +76 -1
- package/dist/memory/revisions.d.ts.map +1 -1
- package/dist/memory/revisions.js +539 -35
- package/dist/memory/revisions.js.map +1 -1
- package/dist/memory/scoped-memory.d.ts +16 -1
- package/dist/memory/scoped-memory.d.ts.map +1 -1
- package/dist/memory/scoped-memory.js +240 -107
- package/dist/memory/scoped-memory.js.map +1 -1
- package/dist/memory/secrets.d.ts +2 -0
- package/dist/memory/secrets.d.ts.map +1 -1
- package/dist/memory/secrets.js +36 -0
- package/dist/memory/secrets.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +3 -2
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +54 -22
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/workspaces.d.ts +9 -0
- package/dist/memory/workspaces.d.ts.map +1 -1
- package/dist/memory/workspaces.js +67 -0
- package/dist/memory/workspaces.js.map +1 -1
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +7 -0
- package/dist/package-version.js.map +1 -0
- package/dist/repository/binding.d.ts +5 -0
- package/dist/repository/binding.d.ts.map +1 -1
- package/dist/repository/binding.js +117 -17
- package/dist/repository/binding.js.map +1 -1
- package/dist/repository/framework-version.d.ts +8 -0
- package/dist/repository/framework-version.d.ts.map +1 -0
- package/dist/repository/framework-version.js +29 -0
- package/dist/repository/framework-version.js.map +1 -0
- package/dist/repository/identity-value.d.ts +4 -0
- package/dist/repository/identity-value.d.ts.map +1 -0
- package/dist/repository/identity-value.js +24 -0
- package/dist/repository/identity-value.js.map +1 -0
- package/dist/repository/identity.d.ts.map +1 -1
- package/dist/repository/identity.js +2 -0
- package/dist/repository/identity.js.map +1 -1
- package/dist/repository/project-fingerprint.d.ts +14 -2
- package/dist/repository/project-fingerprint.d.ts.map +1 -1
- package/dist/repository/project-fingerprint.js +312 -33
- package/dist/repository/project-fingerprint.js.map +1 -1
- package/dist/repository/remote-url.d.ts +0 -1
- package/dist/repository/remote-url.d.ts.map +1 -1
- package/dist/repository/remote-url.js +0 -1
- package/dist/repository/remote-url.js.map +1 -1
- package/dist/runtime-version.d.ts +2 -1
- package/dist/runtime-version.d.ts.map +1 -1
- package/dist/runtime-version.js +21 -4
- package/dist/runtime-version.js.map +1 -1
- package/dist/serialization/boundary-json.d.ts +20 -0
- package/dist/serialization/boundary-json.d.ts.map +1 -0
- package/dist/serialization/boundary-json.js +129 -0
- package/dist/serialization/boundary-json.js.map +1 -0
- package/dist/serialization/envelope.js +1 -1
- package/dist/serialization/envelope.js.map +1 -1
- package/dist/serialization/validate.d.ts +7 -0
- package/dist/serialization/validate.d.ts.map +1 -1
- package/dist/serialization/validate.js +53 -13
- package/dist/serialization/validate.js.map +1 -1
- package/dist/server/app.js +1 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/http.d.ts +4 -3
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +90 -50
- package/dist/server/http.js.map +1 -1
- package/dist/server/idempotency.d.ts +0 -6
- package/dist/server/idempotency.d.ts.map +1 -1
- package/dist/server/idempotency.js.map +1 -1
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +21 -4
- package/dist/server/router.js.map +1 -1
- package/dist/server/routes/agent-capability-gate.d.ts +40 -0
- package/dist/server/routes/agent-capability-gate.d.ts.map +1 -0
- package/dist/server/routes/agent-capability-gate.js +182 -0
- package/dist/server/routes/agent-capability-gate.js.map +1 -0
- package/dist/server/routes/agent-events.d.ts.map +1 -1
- package/dist/server/routes/agent-events.js +8 -1
- package/dist/server/routes/agent-events.js.map +1 -1
- package/dist/server/routes/agent-intake.d.ts.map +1 -1
- package/dist/server/routes/agent-intake.js +10 -2
- package/dist/server/routes/agent-intake.js.map +1 -1
- package/dist/server/routes/agent-promotions.d.ts.map +1 -1
- package/dist/server/routes/agent-promotions.js +5 -2
- package/dist/server/routes/agent-promotions.js.map +1 -1
- package/dist/server/routes/agent-runs.d.ts.map +1 -1
- package/dist/server/routes/agent-runs.js +18 -4
- package/dist/server/routes/agent-runs.js.map +1 -1
- package/dist/server/routes/request-binding.d.ts +5 -0
- package/dist/server/routes/request-binding.d.ts.map +1 -0
- package/dist/server/routes/request-binding.js +49 -0
- package/dist/server/routes/request-binding.js.map +1 -0
- package/dist/server/routes/task5-support.d.ts +1 -8
- package/dist/server/routes/task5-support.d.ts.map +1 -1
- package/dist/server/routes/task5-support.js +1 -17
- package/dist/server/routes/task5-support.js.map +1 -1
- package/dist/server/routes/task5.d.ts.map +1 -1
- package/dist/server/routes/task5.js +106 -36
- package/dist/server/routes/task5.js.map +1 -1
- package/dist/server/write-queue.js +2 -2
- package/dist/server/write-queue.js.map +1 -1
- package/dist/setup/claude-config.d.ts +2 -1
- package/dist/setup/claude-config.d.ts.map +1 -1
- package/dist/setup/claude-config.js +54 -4
- package/dist/setup/claude-config.js.map +1 -1
- package/dist/setup/client-detection.d.ts +7 -2
- package/dist/setup/client-detection.d.ts.map +1 -1
- package/dist/setup/client-detection.js +27 -9
- package/dist/setup/client-detection.js.map +1 -1
- package/dist/setup/hermes-config.d.ts +2 -1
- package/dist/setup/hermes-config.d.ts.map +1 -1
- package/dist/setup/hermes-config.js +53 -12
- package/dist/setup/hermes-config.js.map +1 -1
- package/dist/setup/legacy-client-cleanup.d.ts +6 -0
- package/dist/setup/legacy-client-cleanup.d.ts.map +1 -0
- package/dist/setup/legacy-client-cleanup.js +152 -0
- package/dist/setup/legacy-client-cleanup.js.map +1 -0
- package/dist/setup/managed-text.d.ts.map +1 -1
- package/dist/setup/managed-text.js +11 -1
- package/dist/setup/managed-text.js.map +1 -1
- package/dist/setup/opencode-config.d.ts +2 -1
- package/dist/setup/opencode-config.d.ts.map +1 -1
- package/dist/setup/opencode-config.js +57 -5
- package/dist/setup/opencode-config.js.map +1 -1
- package/dist/setup/render.d.ts +2 -1
- package/dist/setup/render.d.ts.map +1 -1
- package/dist/setup/render.js +91 -17
- package/dist/setup/render.js.map +1 -1
- package/dist/setup/standard-skills.d.ts +16 -2
- package/dist/setup/standard-skills.d.ts.map +1 -1
- package/dist/setup/standard-skills.js +37 -13
- package/dist/setup/standard-skills.js.map +1 -1
- package/dist/setup/strict-json.d.ts +7 -0
- package/dist/setup/strict-json.d.ts.map +1 -0
- package/dist/setup/strict-json.js +98 -0
- package/dist/setup/strict-json.js.map +1 -0
- package/dist/setup/strict-toml.d.ts +7 -0
- package/dist/setup/strict-toml.d.ts.map +1 -0
- package/dist/setup/strict-toml.js +470 -0
- package/dist/setup/strict-toml.js.map +1 -0
- package/dist/skills/cache.d.ts +15 -0
- package/dist/skills/cache.d.ts.map +1 -0
- package/dist/skills/cache.js +19 -0
- package/dist/skills/cache.js.map +1 -0
- package/dist/skills/candidate-ranking.d.ts +15 -0
- package/dist/skills/candidate-ranking.d.ts.map +1 -0
- package/dist/skills/candidate-ranking.js +52 -0
- package/dist/skills/candidate-ranking.js.map +1 -0
- package/dist/skills/chunking.d.ts +11 -0
- package/dist/skills/chunking.d.ts.map +1 -0
- package/dist/skills/chunking.js +291 -0
- package/dist/skills/chunking.js.map +1 -0
- package/dist/skills/config.d.ts +19 -0
- package/dist/skills/config.d.ts.map +1 -0
- package/dist/skills/config.js +103 -0
- package/dist/skills/config.js.map +1 -0
- package/dist/skills/discovery-service.d.ts +26 -0
- package/dist/skills/discovery-service.d.ts.map +1 -0
- package/dist/skills/discovery-service.js +921 -0
- package/dist/skills/discovery-service.js.map +1 -0
- package/dist/skills/external-transport.d.ts +2 -0
- package/dist/skills/external-transport.d.ts.map +1 -0
- package/dist/skills/external-transport.js +30 -0
- package/dist/skills/external-transport.js.map +1 -0
- package/dist/skills/find.d.ts +16 -0
- package/dist/skills/find.d.ts.map +1 -0
- package/dist/skills/find.js +58 -0
- package/dist/skills/find.js.map +1 -0
- package/dist/skills/gap-detection.d.ts +23 -0
- package/dist/skills/gap-detection.d.ts.map +1 -0
- package/dist/skills/gap-detection.js +62 -0
- package/dist/skills/gap-detection.js.map +1 -0
- package/dist/skills/import-preparation.d.ts +4 -0
- package/dist/skills/import-preparation.d.ts.map +1 -0
- package/dist/skills/import-preparation.js +20 -0
- package/dist/skills/import-preparation.js.map +1 -0
- package/dist/skills/materialization-authority.d.ts +11 -0
- package/dist/skills/materialization-authority.d.ts.map +1 -0
- package/dist/skills/materialization-authority.js +92 -0
- package/dist/skills/materialization-authority.js.map +1 -0
- package/dist/skills/materialization-service.d.ts +22 -0
- package/dist/skills/materialization-service.d.ts.map +1 -0
- package/dist/skills/materialization-service.js +101 -0
- package/dist/skills/materialization-service.js.map +1 -0
- package/dist/skills/official-catalog.d.ts +31 -0
- package/dist/skills/official-catalog.d.ts.map +1 -0
- package/dist/skills/official-catalog.js +110 -0
- package/dist/skills/official-catalog.js.map +1 -0
- package/dist/skills/providers/schema.d.ts +30 -0
- package/dist/skills/providers/schema.d.ts.map +1 -0
- package/dist/skills/providers/schema.js +354 -0
- package/dist/skills/providers/schema.js.map +1 -0
- package/dist/skills/providers/skills-sh-compat.d.ts +17 -0
- package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -0
- package/dist/skills/providers/skills-sh-compat.js +71 -0
- package/dist/skills/providers/skills-sh-compat.js.map +1 -0
- package/dist/skills/providers/skills-sh-v1.d.ts +23 -0
- package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -0
- package/dist/skills/providers/skills-sh-v1.js +134 -0
- package/dist/skills/providers/skills-sh-v1.js.map +1 -0
- package/dist/skills/query-builder.d.ts +18 -0
- package/dist/skills/query-builder.d.ts.map +1 -0
- package/dist/skills/query-builder.js +93 -0
- package/dist/skills/query-builder.js.map +1 -0
- package/dist/skills/source/errors.d.ts +9 -0
- package/dist/skills/source/errors.d.ts.map +1 -0
- package/dist/skills/source/errors.js +15 -0
- package/dist/skills/source/errors.js.map +1 -0
- package/dist/skills/source/frontmatter.d.ts +9 -0
- package/dist/skills/source/frontmatter.d.ts.map +1 -0
- package/dist/skills/source/frontmatter.js +77 -0
- package/dist/skills/source/frontmatter.js.map +1 -0
- package/dist/skills/source/github-fetcher.d.ts +20 -0
- package/dist/skills/source/github-fetcher.d.ts.map +1 -0
- package/dist/skills/source/github-fetcher.js +292 -0
- package/dist/skills/source/github-fetcher.js.map +1 -0
- package/dist/skills/source/snapshot-validator.d.ts +28 -0
- package/dist/skills/source/snapshot-validator.d.ts.map +1 -0
- package/dist/skills/source/snapshot-validator.js +186 -0
- package/dist/skills/source/snapshot-validator.js.map +1 -0
- package/dist/skills/store.d.ts +181 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +1710 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/types.d.ts +169 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/web/i18n.d.ts +32 -0
- package/dist/web/i18n.d.ts.map +1 -1
- package/dist/web/i18n.js +128 -0
- package/dist/web/i18n.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +386 -38
- package/dist/web/server.js.map +1 -1
- package/dist/web/ui.d.ts +4 -0
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +382 -6
- package/dist/web/ui.js.map +1 -1
- package/migrations/009_external_skill_discovery.sql +126 -0
- package/package.json +4 -3
- package/skills/kiokuko-single-purpose-functions/SKILL.md +288 -0
- package/skills/kiokuko-single-purpose-functions/references/kiokuko-patterns.md +344 -0
- package/skills/kiokuko-single-purpose-functions/references/review-checklist.md +97 -0
- package/skills/kiokuko-ui-design-soul/SKILL.md +1186 -28
- package/templates/AGENTS.md +8 -7
- package/dist/client/runtime-discovery.d.ts +0 -15
- package/dist/client/runtime-discovery.d.ts.map +0 -1
- package/dist/client/runtime-discovery.js +0 -45
- package/dist/client/runtime-discovery.js.map +0 -1
- package/dist/commands/call.d.ts +0 -7
- package/dist/commands/call.d.ts.map +0 -1
- package/dist/commands/call.js +0 -10
- package/dist/commands/call.js.map +0 -1
- package/dist/commands/link.d.ts +0 -6
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -6
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/promote.d.ts +0 -6
- package/dist/commands/promote.d.ts.map +0 -1
- package/dist/commands/promote.js +0 -6
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/read.d.ts +0 -6
- package/dist/commands/read.d.ts.map +0 -1
- package/dist/commands/read.js +0 -4
- package/dist/commands/read.js.map +0 -1
- package/dist/commands/recall.d.ts +0 -6
- package/dist/commands/recall.d.ts.map +0 -1
- package/dist/commands/recall.js +0 -4
- package/dist/commands/recall.js.map +0 -1
- package/dist/commands/record.d.ts +0 -6
- package/dist/commands/record.d.ts.map +0 -1
- package/dist/commands/record.js +0 -4
- package/dist/commands/record.js.map +0 -1
- package/dist/commands/search.d.ts +0 -6
- package/dist/commands/search.d.ts.map +0 -1
- package/dist/commands/search.js +0 -4
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/supersede.d.ts +0 -6
- package/dist/commands/supersede.d.ts.map +0 -1
- package/dist/commands/supersede.js +0 -6
- package/dist/commands/supersede.js.map +0 -1
- package/dist/knowledge/sources.d.ts +0 -72
- package/dist/knowledge/sources.d.ts.map +0 -1
- package/dist/knowledge/sources.js +0 -388
- package/dist/knowledge/sources.js.map +0 -1
- package/dist/setup/opencode-evidence.d.ts +0 -37
- package/dist/setup/opencode-evidence.d.ts.map +0 -1
- package/dist/setup/opencode-evidence.js +0 -58
- package/dist/setup/opencode-evidence.js.map +0 -1
- package/dist/setup/opencode-loop-guard.d.ts +0 -9
- package/dist/setup/opencode-loop-guard.d.ts.map +0 -1
- package/dist/setup/opencode-loop-guard.js +0 -248
- package/dist/setup/opencode-loop-guard.js.map +0 -1
|
@@ -1,50 +1,1208 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kiokuko-ui-design-soul
|
|
3
|
-
description:
|
|
3
|
+
description: Prevent common UI/UX failures when designing, implementing, or reviewing interactive interfaces. Enforce perceivable feedback, adequate hit targets, explicit async states, recovery, accessibility, responsive behavior, and platform conventions using Apple HIG and WCAG principles.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<!-- KIOKUKO MANAGED STANDARD SKILL: kiokuko-ui-design-soul -->
|
|
7
7
|
|
|
8
8
|
# UI design soul
|
|
9
9
|
|
|
10
|
-
Use this skill when designing, implementing,
|
|
10
|
+
Use this skill when designing, implementing, modifying, or reviewing any interactive user interface.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Invoke it for work involving:
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
- buttons, links, menus, tabs, toolbars, forms, dialogs, sheets, popovers, lists, tables, navigation, or gestures;
|
|
15
|
+
- loading, saving, uploading, downloading, generation, search, synchronization, or other asynchronous behavior;
|
|
16
|
+
- responsive layouts;
|
|
17
|
+
- mobile or touch interfaces;
|
|
18
|
+
- keyboard, screen reader, focus, motion, contrast, or other accessibility concerns;
|
|
19
|
+
- destructive actions, permissions, errors, offline states, empty states, or user-created data;
|
|
20
|
+
- UI bugs where the implementation technically works but the user may not understand what happened.
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
Do not invoke it for backend-only work or tasks with no user-facing interaction.
|
|
17
23
|
|
|
18
|
-
|
|
19
|
-
- the people it serves;
|
|
20
|
-
- their primary task;
|
|
21
|
-
- how they should feel while completing it.
|
|
24
|
+
This skill is a **UI correctness and usability quality gate**, not a request to make software visually resemble Apple products.
|
|
22
25
|
|
|
23
|
-
|
|
26
|
+
Use the existing product design system and the conventions of the target platform unless they conflict with accessibility, safety, data integrity, or interaction correctness.
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Prime directive
|
|
31
|
+
|
|
32
|
+
A UI action is not successful merely because the underlying code executed successfully.
|
|
33
|
+
|
|
34
|
+
It is successful only when the user can:
|
|
35
|
+
|
|
36
|
+
1. discover the action;
|
|
37
|
+
2. understand what it will do;
|
|
38
|
+
3. activate it comfortably;
|
|
39
|
+
4. perceive that activation was accepted;
|
|
40
|
+
5. understand what is happening while it runs;
|
|
41
|
+
6. recognize success or failure;
|
|
42
|
+
7. recover when something goes wrong;
|
|
43
|
+
8. continue without losing work or context.
|
|
44
|
+
|
|
45
|
+
**Invisible work is a UI failure.**
|
|
46
|
+
|
|
47
|
+
If a click, tap, key press, gesture, submit, or other user action starts work but the interface appears unchanged, treat that as a defect even when the backend is working correctly.
|
|
48
|
+
|
|
49
|
+
Do not optimize the happy path while leaving processing, error, empty, disabled, offline, permission, cancellation, or recovery states undefined.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
# Priority order
|
|
54
|
+
|
|
55
|
+
When requirements compete, optimize in this order:
|
|
56
|
+
|
|
57
|
+
1. safety and prevention of data loss;
|
|
58
|
+
2. accessibility and ability to operate the interface;
|
|
59
|
+
3. interaction correctness and feedback;
|
|
60
|
+
4. preservation of user context and work;
|
|
61
|
+
5. platform conventions and familiarity;
|
|
62
|
+
6. responsiveness and perceived performance;
|
|
63
|
+
7. visual refinement;
|
|
64
|
+
8. decorative delight.
|
|
65
|
+
|
|
66
|
+
Never sacrifice the first four merely to produce a cleaner-looking interface.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
# Core interaction invariants
|
|
71
|
+
|
|
72
|
+
Treat these as defaults that require a specific reason to violate.
|
|
73
|
+
|
|
74
|
+
## 1. Every action must produce perceivable feedback
|
|
75
|
+
|
|
76
|
+
Every user-initiated action must produce immediate perceptible feedback.
|
|
77
|
+
|
|
78
|
+
Examples include:
|
|
79
|
+
|
|
80
|
+
- pressed or active visual state;
|
|
81
|
+
- focus change;
|
|
82
|
+
- loading or busy state;
|
|
83
|
+
- progress;
|
|
84
|
+
- optimistic state change;
|
|
85
|
+
- navigation;
|
|
86
|
+
- content update;
|
|
87
|
+
- status text;
|
|
88
|
+
- system feedback such as an appropriate haptic.
|
|
89
|
+
|
|
90
|
+
A network request beginning in the background is **not feedback**.
|
|
91
|
+
|
|
92
|
+
Do not allow:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
idle
|
|
96
|
+
-> invisible background processing
|
|
97
|
+
-> eventually something happens
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Prefer:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
idle
|
|
104
|
+
-> pressed / activated
|
|
105
|
+
-> processing
|
|
106
|
+
-> success | failure | cancelled
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The user must never have to click again merely to determine whether the first click worked.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 2. Interactive targets must be easy to activate
|
|
114
|
+
|
|
115
|
+
Judge the **actual hit target**, not merely the visible icon.
|
|
116
|
+
|
|
117
|
+
A visually small icon is acceptable when padding expands its interactive region.
|
|
118
|
+
|
|
119
|
+
Use platform conventions first.
|
|
120
|
+
|
|
121
|
+
### Apple platform baseline
|
|
122
|
+
|
|
123
|
+
Prefer normal/default control sizes rather than shrinking controls to platform minimums.
|
|
124
|
+
|
|
125
|
+
| Platform | Preferred/default control size | Minimum control size |
|
|
126
|
+
| --- | ---: | ---: |
|
|
127
|
+
| iOS / iPadOS | 44×44 pt | 28×28 pt |
|
|
128
|
+
| macOS | 28×28 pt | 20×20 pt |
|
|
129
|
+
| watchOS | 44×44 pt | 28×28 pt |
|
|
130
|
+
| tvOS | 66×66 pt | 56×56 pt |
|
|
131
|
+
| visionOS | 60×60 pt | 28×28 pt |
|
|
132
|
+
|
|
133
|
+
The minimum is an exception floor, not the target for ordinary controls.
|
|
134
|
+
|
|
135
|
+
For frequently used touch controls, strongly prefer at least 44×44 pt.
|
|
136
|
+
|
|
137
|
+
### Web baseline
|
|
138
|
+
|
|
139
|
+
WCAG 2.2 AA requires pointer targets to satisfy its 24×24 CSS pixel minimum target-size criterion or an allowed exception.
|
|
140
|
+
|
|
141
|
+
Treat 24×24 CSS px as an accessibility floor, **not a desirable general button size**.
|
|
142
|
+
|
|
143
|
+
For touch-oriented controls, important actions, icon buttons, and compact mobile layouts, prefer an effective hit area around 44×44 CSS px when practical.
|
|
144
|
+
|
|
145
|
+
Also verify:
|
|
146
|
+
|
|
147
|
+
- adequate spacing between adjacent targets;
|
|
148
|
+
- destructive and safe actions are not easy to hit accidentally;
|
|
149
|
+
- edge controls remain reachable;
|
|
150
|
+
- controls do not require precision pointing;
|
|
151
|
+
- touch controls do not depend on hover;
|
|
152
|
+
- clickable containers have predictable boundaries.
|
|
153
|
+
|
|
154
|
+
Flag tiny icon-only buttons with tiny hit regions even if they technically satisfy the visual design.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 3. Async actions require an explicit state machine
|
|
159
|
+
|
|
160
|
+
For every asynchronous action, identify the applicable states before implementation:
|
|
161
|
+
|
|
162
|
+
```text
|
|
163
|
+
idle
|
|
164
|
+
focused
|
|
165
|
+
pressed
|
|
166
|
+
processing
|
|
167
|
+
success
|
|
168
|
+
failure
|
|
169
|
+
cancelled
|
|
170
|
+
offline
|
|
171
|
+
permission-denied
|
|
172
|
+
recovered
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Not every action needs every state, but every reachable state needs defined behavior.
|
|
176
|
+
|
|
177
|
+
At minimum, inspect:
|
|
178
|
+
|
|
179
|
+
```text
|
|
180
|
+
idle
|
|
181
|
+
-> activation feedback
|
|
182
|
+
-> processing
|
|
183
|
+
-> success | failure
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
There must be no invisible transition from `idle` to `processing`.
|
|
187
|
+
|
|
188
|
+
Examples include:
|
|
189
|
+
|
|
190
|
+
- save;
|
|
191
|
+
- submit;
|
|
192
|
+
- upload;
|
|
193
|
+
- download;
|
|
194
|
+
- import;
|
|
195
|
+
- export;
|
|
196
|
+
- search;
|
|
197
|
+
- AI generation;
|
|
198
|
+
- OCR;
|
|
199
|
+
- synchronization;
|
|
200
|
+
- authentication;
|
|
201
|
+
- deletion;
|
|
202
|
+
- background jobs triggered from the UI.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# Immediate feedback
|
|
207
|
+
|
|
208
|
+
Give visual or otherwise accessible activation feedback immediately.
|
|
209
|
+
|
|
210
|
+
Do not wait for:
|
|
211
|
+
|
|
212
|
+
- HTTP response;
|
|
213
|
+
- database completion;
|
|
214
|
+
- AI response;
|
|
215
|
+
- file processing;
|
|
216
|
+
- server acknowledgement;
|
|
217
|
+
- navigation completion.
|
|
218
|
+
|
|
219
|
+
A control should feel responsive even when the requested operation is slow.
|
|
220
|
+
|
|
221
|
+
Examples:
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
Save
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
becomes:
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
Saving…
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
or shows a nearby activity indicator immediately after activation.
|
|
234
|
+
|
|
235
|
+
A button may enter a pressed state before any asynchronous state begins.
|
|
236
|
+
|
|
237
|
+
For operations that complete almost instantly, avoid flashing a spinner unnecessarily; immediate pressed-state feedback may be enough.
|
|
238
|
+
|
|
239
|
+
For perceptibly delayed operations, show an explicit busy state.
|
|
240
|
+
|
|
241
|
+
Do not use arbitrary delays merely to make feedback visible.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
# Processing and progress
|
|
246
|
+
|
|
247
|
+
Keep progress feedback near the action or content it belongs to whenever practical.
|
|
248
|
+
|
|
249
|
+
Prefer local busy states over blocking the entire application.
|
|
250
|
+
|
|
251
|
+
Bad:
|
|
252
|
+
|
|
253
|
+
```text
|
|
254
|
+
User clicks "Generate"
|
|
255
|
+
Nothing changes
|
|
256
|
+
Request runs for 12 seconds
|
|
257
|
+
Result suddenly appears
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Good:
|
|
261
|
+
|
|
262
|
+
```text
|
|
263
|
+
User clicks "Generate"
|
|
264
|
+
Button immediately becomes "Generating…"
|
|
265
|
+
Relevant region enters a busy state
|
|
266
|
+
Result appears
|
|
267
|
+
Busy state clears
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
While processing:
|
|
271
|
+
|
|
272
|
+
- prevent accidental duplicate execution of the same operation;
|
|
273
|
+
- do not disable unrelated functionality without a reason;
|
|
274
|
+
- communicate what is happening;
|
|
275
|
+
- keep completed user work visible;
|
|
276
|
+
- do not imply progress that the system cannot actually measure.
|
|
277
|
+
|
|
278
|
+
Use:
|
|
279
|
+
|
|
280
|
+
- determinate progress when meaningful progress is measurable;
|
|
281
|
+
- indeterminate progress when duration or completion percentage is unknown.
|
|
282
|
+
|
|
283
|
+
Never display fake percentage progress as though it represents real work.
|
|
284
|
+
|
|
285
|
+
If a task becomes long-running:
|
|
286
|
+
|
|
287
|
+
- explain that it is still running;
|
|
288
|
+
- show meaningful progress when available;
|
|
289
|
+
- offer cancellation when cancellation is technically safe and real;
|
|
290
|
+
- permit unrelated work when possible;
|
|
291
|
+
- tell the user if processing can continue in the background;
|
|
292
|
+
- provide completion feedback when the result may otherwise go unnoticed.
|
|
293
|
+
|
|
294
|
+
Do not provide a Cancel button that merely hides the UI while work continues unless that behavior is explicitly communicated.
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
# Success feedback
|
|
299
|
+
|
|
300
|
+
Success must be perceivable.
|
|
301
|
+
|
|
302
|
+
Explicit success messaging is not always necessary if the state change itself is obvious.
|
|
303
|
+
|
|
304
|
+
Examples of naturally visible success:
|
|
305
|
+
|
|
306
|
+
- a saved item immediately reflects the new value;
|
|
307
|
+
- a deleted item disappears and an Undo action appears;
|
|
308
|
+
- navigation visibly reaches the requested destination;
|
|
309
|
+
- an uploaded file appears in the file list.
|
|
310
|
+
|
|
311
|
+
Use explicit confirmation when the result would otherwise be ambiguous.
|
|
312
|
+
|
|
313
|
+
Avoid noisy success toasts for every trivial interaction.
|
|
314
|
+
|
|
315
|
+
Do not leave the interface in a busy or disabled state after completion.
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
# Failure and recovery
|
|
320
|
+
|
|
321
|
+
A failure must never be represented only by:
|
|
322
|
+
|
|
323
|
+
- a console error;
|
|
324
|
+
- a rejected promise;
|
|
325
|
+
- an HTTP status;
|
|
326
|
+
- a log entry;
|
|
327
|
+
- a spinner that stops;
|
|
328
|
+
- nothing happening.
|
|
329
|
+
|
|
330
|
+
When an action fails:
|
|
331
|
+
|
|
332
|
+
1. stop the busy state;
|
|
333
|
+
2. preserve user input and completed work;
|
|
334
|
+
3. explain what failed in user-facing language;
|
|
335
|
+
4. keep the explanation near the affected task when possible;
|
|
336
|
+
5. provide the next useful action.
|
|
337
|
+
|
|
338
|
+
Possible recovery actions include:
|
|
339
|
+
|
|
340
|
+
- Retry;
|
|
341
|
+
- Undo;
|
|
342
|
+
- Back;
|
|
343
|
+
- Reconnect;
|
|
344
|
+
- Choose another file;
|
|
345
|
+
- Fix highlighted fields;
|
|
346
|
+
- Open Settings;
|
|
347
|
+
- Save locally.
|
|
348
|
+
|
|
349
|
+
Do not clear a form because submission failed.
|
|
350
|
+
|
|
351
|
+
Do not discard generated or edited content merely because a subsequent save failed.
|
|
352
|
+
|
|
353
|
+
Do not replace actionable errors with vague messages such as:
|
|
354
|
+
|
|
355
|
+
```text
|
|
356
|
+
Something went wrong.
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
when the application knows enough to say something more useful.
|
|
360
|
+
|
|
361
|
+
Technical details may be logged separately.
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
# Preserve user context
|
|
366
|
+
|
|
367
|
+
UI updates must not unexpectedly reset the user's place.
|
|
368
|
+
|
|
369
|
+
When data reloads, state changes, or asynchronous work completes, preserve relevant context such as:
|
|
370
|
+
|
|
371
|
+
- selected item;
|
|
372
|
+
- current document;
|
|
373
|
+
- current page;
|
|
374
|
+
- active tab;
|
|
375
|
+
- expanded sections;
|
|
376
|
+
- scroll position;
|
|
377
|
+
- cursor position;
|
|
378
|
+
- form values;
|
|
379
|
+
- search query;
|
|
380
|
+
- filters;
|
|
381
|
+
- sort order;
|
|
382
|
+
- zoom;
|
|
383
|
+
- focus.
|
|
384
|
+
|
|
385
|
+
Do not reset a list, gallery, document viewer, carousel, or editor to the first item merely because underlying data was refreshed.
|
|
386
|
+
|
|
387
|
+
Do not remount large parts of the interface unnecessarily when a local state update is sufficient.
|
|
388
|
+
|
|
389
|
+
A successful operation that makes the user lose their place is still a UX defect.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
# Prevent duplicate and stale actions
|
|
394
|
+
|
|
395
|
+
Async interfaces must account for concurrency.
|
|
396
|
+
|
|
397
|
+
Check for:
|
|
398
|
+
|
|
399
|
+
- double-click submission;
|
|
400
|
+
- repeated taps;
|
|
401
|
+
- multiple overlapping requests;
|
|
402
|
+
- stale responses arriving after newer responses;
|
|
403
|
+
- navigation while work is running;
|
|
404
|
+
- component unmount during requests;
|
|
405
|
+
- retry while the previous operation is still active.
|
|
406
|
+
|
|
407
|
+
When only the newest result is valid, prevent stale results from overwriting newer state.
|
|
408
|
+
|
|
409
|
+
When duplicate execution would be harmful, make the busy state enforce that invariant.
|
|
410
|
+
|
|
411
|
+
Do not globally lock the application merely because one control is busy.
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
# Forms and data entry
|
|
416
|
+
|
|
417
|
+
Every form should make these states clear:
|
|
418
|
+
|
|
419
|
+
```text
|
|
420
|
+
pristine
|
|
421
|
+
editing
|
|
422
|
+
invalid
|
|
423
|
+
submitting
|
|
424
|
+
submitted
|
|
425
|
+
failed
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
Apply these rules:
|
|
429
|
+
|
|
430
|
+
- visible labels are preferred to placeholder-only labeling;
|
|
431
|
+
- required fields must be understandable without color alone;
|
|
432
|
+
- validation errors must identify the affected field and explain how to fix it;
|
|
433
|
+
- preserve entered values after validation or server failure;
|
|
434
|
+
- do not validate so aggressively that the interface reports errors before the user has reasonably had a chance to enter a value;
|
|
435
|
+
- after failed submission, guide focus appropriately without unexpectedly stealing it;
|
|
436
|
+
- submitting must provide immediate busy feedback;
|
|
437
|
+
- prevent accidental duplicate submission;
|
|
438
|
+
- successful submission must have an observable result;
|
|
439
|
+
- keyboard submission behavior must be predictable;
|
|
440
|
+
- multiline input must not unexpectedly submit when the user expects a newline.
|
|
441
|
+
|
|
442
|
+
For uploads:
|
|
443
|
+
|
|
444
|
+
- show the chosen file;
|
|
445
|
+
- show upload state;
|
|
446
|
+
- show progress when measurable;
|
|
447
|
+
- expose failure and retry;
|
|
448
|
+
- define cancellation semantics;
|
|
449
|
+
- do not discard already completed uploads because another upload fails.
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
# Buttons and controls
|
|
454
|
+
|
|
455
|
+
A button label should describe its action.
|
|
456
|
+
|
|
457
|
+
Prefer:
|
|
458
|
+
|
|
459
|
+
```text
|
|
460
|
+
Save changes
|
|
461
|
+
Delete project
|
|
462
|
+
Retry upload
|
|
463
|
+
Create account
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
over ambiguous labels such as:
|
|
467
|
+
|
|
468
|
+
```text
|
|
469
|
+
OK
|
|
470
|
+
Yes
|
|
471
|
+
Continue
|
|
472
|
+
Do it
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
when a more specific verb is practical.
|
|
476
|
+
|
|
477
|
+
For icon-only controls:
|
|
478
|
+
|
|
479
|
+
- provide an accessible name;
|
|
480
|
+
- ensure the icon is understandable in context;
|
|
481
|
+
- provide additional discoverability where appropriate, such as a tooltip on pointer-based interfaces;
|
|
482
|
+
- use a sufficiently large hit target.
|
|
483
|
+
|
|
484
|
+
Do not recreate standard buttons, checkboxes, switches, links, text fields, or other controls from generic containers unless a custom implementation is genuinely necessary.
|
|
485
|
+
|
|
486
|
+
Use semantic or native controls whenever possible.
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
# Disabled and unavailable controls
|
|
491
|
+
|
|
492
|
+
A disabled control must look unavailable.
|
|
493
|
+
|
|
494
|
+
If the reason is not obvious, make the reason discoverable.
|
|
495
|
+
|
|
496
|
+
Do not create interfaces where users repeatedly activate something that silently refuses to work.
|
|
497
|
+
|
|
498
|
+
Do not rely solely on low opacity when that creates insufficient legibility or makes the state ambiguous.
|
|
499
|
+
|
|
500
|
+
Do not use disabled controls as the only way to teach requirements.
|
|
501
|
+
|
|
502
|
+
When practical, allow the user to reach the control and provide a useful explanation rather than hiding functionality with no context.
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
# Empty states
|
|
507
|
+
|
|
508
|
+
An empty state is a real application state, not leftover whitespace.
|
|
509
|
+
|
|
510
|
+
When useful, communicate:
|
|
511
|
+
|
|
512
|
+
1. what is empty;
|
|
513
|
+
2. why it may be empty;
|
|
514
|
+
3. what the user can do next.
|
|
515
|
+
|
|
516
|
+
Bad:
|
|
517
|
+
|
|
518
|
+
```text
|
|
519
|
+
[blank panel]
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
Better:
|
|
523
|
+
|
|
524
|
+
```text
|
|
525
|
+
No documents yet
|
|
526
|
+
|
|
527
|
+
Create a document or import an existing file.
|
|
528
|
+
[Create document] [Import]
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
Do not fabricate an action when there is genuinely nothing useful to do.
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
# Loading states
|
|
536
|
+
|
|
537
|
+
Do not make missing content look like broken content.
|
|
538
|
+
|
|
539
|
+
When content must load:
|
|
540
|
+
|
|
541
|
+
- display available content as soon as practical;
|
|
542
|
+
- use placeholders or skeletons when they improve continuity;
|
|
543
|
+
- distinguish loading from empty;
|
|
544
|
+
- distinguish loading from error;
|
|
545
|
+
- avoid unnecessary layout jumps when content arrives;
|
|
546
|
+
- keep unrelated interface areas usable when safe.
|
|
547
|
+
|
|
548
|
+
Do not replace a local operation with a full-screen loading state unless the entire application genuinely cannot proceed.
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
# Offline and connectivity states
|
|
553
|
+
|
|
554
|
+
Do not silently pretend network-dependent functionality is working while offline.
|
|
555
|
+
|
|
556
|
+
If work is queued locally, state that only when it is actually persisted.
|
|
557
|
+
|
|
558
|
+
If work is not preserved, do not imply that it will resume automatically.
|
|
559
|
+
|
|
560
|
+
When connectivity matters:
|
|
561
|
+
|
|
562
|
+
- expose relevant offline state;
|
|
563
|
+
- preserve local user work;
|
|
564
|
+
- provide retry or reconnection behavior;
|
|
565
|
+
- recover cleanly when connectivity returns.
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
# Permissions
|
|
570
|
+
|
|
571
|
+
Request permissions in context, close to the feature that requires them.
|
|
572
|
+
|
|
573
|
+
Explain why the capability is needed before or when the permission request occurs where appropriate.
|
|
574
|
+
|
|
575
|
+
If permission is denied:
|
|
576
|
+
|
|
577
|
+
- do not repeatedly trigger the same system prompt;
|
|
578
|
+
- explain what functionality is unavailable;
|
|
579
|
+
- provide an alternative if one exists;
|
|
580
|
+
- provide a safe route to Settings when appropriate.
|
|
581
|
+
|
|
582
|
+
Never imply that permission was granted when it was not.
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
# Destructive actions
|
|
587
|
+
|
|
588
|
+
Treat operations that can cause meaningful loss differently from ordinary actions.
|
|
589
|
+
|
|
590
|
+
Prefer **Undo** for safely reversible operations.
|
|
591
|
+
|
|
592
|
+
Use explicit confirmation when:
|
|
593
|
+
|
|
594
|
+
- the action is materially destructive;
|
|
595
|
+
- recovery is unavailable;
|
|
596
|
+
- the scope may surprise the user;
|
|
597
|
+
- the consequence is difficult to reverse.
|
|
598
|
+
|
|
599
|
+
Confirmation text should identify the action and consequence.
|
|
600
|
+
|
|
601
|
+
Prefer:
|
|
602
|
+
|
|
603
|
+
```text
|
|
604
|
+
Delete 14 documents?
|
|
605
|
+
This permanently removes them from this workspace.
|
|
606
|
+
```
|
|
26
607
|
|
|
27
|
-
|
|
608
|
+
with:
|
|
28
609
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
610
|
+
```text
|
|
611
|
+
Cancel
|
|
612
|
+
Delete 14 documents
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
over:
|
|
616
|
+
|
|
617
|
+
```text
|
|
618
|
+
Are you sure?
|
|
619
|
+
Cancel / OK
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
Do not make destructive controls visually or spatially easy to trigger accidentally.
|
|
623
|
+
|
|
624
|
+
Do not add confirmation dialogs to harmless actions merely out of habit.
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
# Navigation and continuity
|
|
629
|
+
|
|
630
|
+
Navigation must preserve a coherent mental model.
|
|
631
|
+
|
|
632
|
+
Check that:
|
|
633
|
+
|
|
634
|
+
- Back returns somewhere meaningful;
|
|
635
|
+
- closing a modal returns focus appropriately;
|
|
636
|
+
- tabs preserve expected state;
|
|
637
|
+
- reloading local data does not unexpectedly navigate;
|
|
638
|
+
- async completion does not move the user to another item without a reason;
|
|
639
|
+
- browser history works appropriately on the web;
|
|
640
|
+
- deep-linked content remains addressable when required.
|
|
641
|
+
|
|
642
|
+
Do not use navigation as a substitute for feedback.
|
|
643
|
+
|
|
644
|
+
---
|
|
645
|
+
|
|
646
|
+
# Responsive behavior
|
|
647
|
+
|
|
648
|
+
A responsive interface must preserve functionality, not merely avoid horizontal overflow.
|
|
649
|
+
|
|
650
|
+
At each supported size verify:
|
|
651
|
+
|
|
652
|
+
- the primary action is still visible or readily reachable;
|
|
653
|
+
- navigation remains usable;
|
|
654
|
+
- important information is not silently removed;
|
|
655
|
+
- required controls do not move somewhere undiscoverable;
|
|
656
|
+
- touch targets remain large enough;
|
|
657
|
+
- text remains readable;
|
|
658
|
+
- overlays fit within the viewport;
|
|
659
|
+
- fixed headers and bottom bars do not cover content;
|
|
660
|
+
- safe-area constraints are respected where applicable.
|
|
661
|
+
|
|
662
|
+
Desktop functionality must not simply disappear on mobile without an intentional replacement.
|
|
663
|
+
|
|
664
|
+
If a multi-pane layout collapses into a single pane, preserve the user's current item and navigation context.
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
# Keyboard interaction
|
|
669
|
+
|
|
670
|
+
All primary functionality must be usable without a pointer when the target platform supports keyboard interaction.
|
|
671
|
+
|
|
672
|
+
Verify:
|
|
673
|
+
|
|
674
|
+
- logical focus order;
|
|
675
|
+
- visible focus indicator;
|
|
676
|
+
- activation with expected keys;
|
|
677
|
+
- Escape behavior for dismissible overlays;
|
|
678
|
+
- no keyboard traps;
|
|
679
|
+
- menus and dialogs behave predictably;
|
|
680
|
+
- focus returns somewhere sensible when transient UI closes.
|
|
681
|
+
|
|
682
|
+
Do not remove focus outlines without providing an equally visible replacement.
|
|
683
|
+
|
|
684
|
+
Do not make hover the only way to reveal an essential action.
|
|
685
|
+
|
|
686
|
+
---
|
|
687
|
+
|
|
688
|
+
# Screen readers and semantics
|
|
689
|
+
|
|
690
|
+
Prefer native semantic elements and platform controls.
|
|
691
|
+
|
|
692
|
+
Every meaningful interactive element needs a programmatically determinable role and accessible name.
|
|
693
|
+
|
|
694
|
+
Communicate relevant:
|
|
695
|
+
|
|
696
|
+
- names;
|
|
697
|
+
- roles;
|
|
698
|
+
- values;
|
|
699
|
+
- checked or selected states;
|
|
700
|
+
- expanded states;
|
|
701
|
+
- validation errors;
|
|
702
|
+
- progress;
|
|
703
|
+
- busy states;
|
|
704
|
+
- status changes.
|
|
705
|
+
|
|
706
|
+
For web applications, use ARIA only when native HTML semantics are insufficient.
|
|
707
|
+
|
|
708
|
+
Do not add redundant or contradictory ARIA to native controls.
|
|
709
|
+
|
|
710
|
+
Dynamic status feedback must be available to assistive technologies without causing excessive announcements.
|
|
711
|
+
|
|
712
|
+
Do not move screen-reader or keyboard focus merely because content changed unless the movement helps the user continue the task.
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
716
|
+
# Contrast and non-color information
|
|
717
|
+
|
|
718
|
+
On the web, target WCAG 2.2 AA or stronger unless the project explicitly defines a stricter standard.
|
|
719
|
+
|
|
720
|
+
As a baseline:
|
|
721
|
+
|
|
722
|
+
- normal text: at least 4.5:1 contrast;
|
|
723
|
+
- large text: at least 3:1;
|
|
724
|
+
- meaningful UI component boundaries and state indicators: at least 3:1 against adjacent colors where WCAG requires it.
|
|
725
|
+
|
|
726
|
+
Do not communicate meaning only through color.
|
|
727
|
+
|
|
728
|
+
For example, an error field should not merely change from gray to red; also provide text, iconography, semantics, or another perceivable cue.
|
|
729
|
+
|
|
730
|
+
Disabled controls are treated differently by WCAG, but they must still remain understandable within the product context.
|
|
731
|
+
|
|
732
|
+
---
|
|
733
|
+
|
|
734
|
+
# Text size, zoom, and content growth
|
|
735
|
+
|
|
736
|
+
Test the interface with:
|
|
737
|
+
|
|
738
|
+
- increased text size;
|
|
739
|
+
- browser zoom;
|
|
740
|
+
- long values;
|
|
741
|
+
- translated strings;
|
|
742
|
+
- multiple-line labels;
|
|
743
|
+
- dynamic content.
|
|
744
|
+
|
|
745
|
+
For web interfaces, support 200% text resizing without losing required content or functionality where WCAG applies.
|
|
746
|
+
|
|
747
|
+
Do not hard-code heights that clip text merely to preserve visual symmetry.
|
|
748
|
+
|
|
749
|
+
Avoid truncating information required to complete the task.
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
# Motion and animation
|
|
754
|
+
|
|
755
|
+
Use motion to explain:
|
|
756
|
+
|
|
757
|
+
- state changes;
|
|
758
|
+
- hierarchy;
|
|
759
|
+
- continuity;
|
|
760
|
+
- cause and effect.
|
|
761
|
+
|
|
762
|
+
Do not use animation merely to make the interface feel active.
|
|
763
|
+
|
|
764
|
+
Animation must never be the only indication that something happened.
|
|
765
|
+
|
|
766
|
+
Respect Reduced Motion and equivalent platform accessibility settings.
|
|
767
|
+
|
|
768
|
+
When motion is reduced, preserve equivalent state information.
|
|
769
|
+
|
|
770
|
+
Avoid motion that delays interaction unnecessarily.
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
# Gestures and direct manipulation
|
|
775
|
+
|
|
776
|
+
Gestures need immediate and continuous feedback.
|
|
777
|
+
|
|
778
|
+
Do not require a custom or difficult gesture for essential functionality when a simpler alternative can be provided.
|
|
779
|
+
|
|
780
|
+
For drag-and-drop:
|
|
781
|
+
|
|
782
|
+
- show what is being dragged;
|
|
783
|
+
- show valid drop targets or outcomes when useful;
|
|
784
|
+
- communicate rejected drops;
|
|
785
|
+
- provide a non-drag alternative where accessibility standards require it.
|
|
786
|
+
|
|
787
|
+
A failed gesture should not make the application look frozen.
|
|
788
|
+
|
|
789
|
+
---
|
|
790
|
+
|
|
791
|
+
# Error prevention
|
|
792
|
+
|
|
793
|
+
Prevent mistakes where prevention is cheaper than recovery.
|
|
794
|
+
|
|
795
|
+
Examples:
|
|
796
|
+
|
|
797
|
+
- disable duplicate submission while the same save is in progress;
|
|
798
|
+
- warn before irreversible destructive actions;
|
|
799
|
+
- validate destructive scope;
|
|
800
|
+
- distinguish Delete from Cancel;
|
|
801
|
+
- avoid placing unrelated dangerous actions next to common actions;
|
|
802
|
+
- retain unsaved work when navigation can interrupt editing;
|
|
803
|
+
- handle stale network responses;
|
|
804
|
+
- prevent accidental repeated requests.
|
|
805
|
+
|
|
806
|
+
Do not add friction indiscriminately.
|
|
807
|
+
|
|
808
|
+
The goal is prevention of meaningful mistakes, not confirmation of every click.
|
|
809
|
+
|
|
810
|
+
---
|
|
811
|
+
|
|
812
|
+
# Perceived performance
|
|
813
|
+
|
|
814
|
+
Fast software that looks frozen is perceived as broken.
|
|
815
|
+
|
|
816
|
+
Slow software with clear, accurate state can remain understandable.
|
|
817
|
+
|
|
818
|
+
Improve perceived performance by:
|
|
819
|
+
|
|
820
|
+
- acknowledging input immediately;
|
|
821
|
+
- showing existing content before optional content;
|
|
822
|
+
- loading incrementally when useful;
|
|
823
|
+
- keeping unrelated controls available;
|
|
824
|
+
- avoiding unnecessary full-page reloads;
|
|
825
|
+
- preserving layout stability;
|
|
826
|
+
- avoiding repeated skeleton/loading flashes during small updates.
|
|
827
|
+
|
|
828
|
+
Never hide a slow operation behind silence.
|
|
829
|
+
|
|
830
|
+
---
|
|
831
|
+
|
|
832
|
+
# Platform adaptation
|
|
833
|
+
|
|
834
|
+
Do not interpret HIG principles as a requirement to imitate iOS on every platform.
|
|
835
|
+
|
|
836
|
+
## Apple platforms
|
|
837
|
+
|
|
838
|
+
Prefer:
|
|
839
|
+
|
|
840
|
+
- native controls;
|
|
841
|
+
- platform-standard interaction behavior;
|
|
842
|
+
- platform-standard navigation;
|
|
843
|
+
- system accessibility behavior;
|
|
844
|
+
- standard keyboard and pointer conventions;
|
|
845
|
+
- the normal/default target sizes for the platform.
|
|
846
|
+
|
|
847
|
+
## Web
|
|
848
|
+
|
|
849
|
+
Prefer:
|
|
850
|
+
|
|
851
|
+
- semantic HTML;
|
|
852
|
+
- native browser behavior where appropriate;
|
|
853
|
+
- the project's existing design system;
|
|
854
|
+
- WCAG 2.2 AA or stronger;
|
|
855
|
+
- responsive layouts;
|
|
856
|
+
- keyboard, pointer, and touch support;
|
|
857
|
+
- browser history and URL semantics when relevant.
|
|
858
|
+
|
|
859
|
+
## Cross-platform products
|
|
860
|
+
|
|
861
|
+
Preserve product identity while allowing interaction conventions to adapt to the platform.
|
|
862
|
+
|
|
863
|
+
Consistency does not mean forcing identical behavior where platform expectations differ.
|
|
864
|
+
|
|
865
|
+
---
|
|
866
|
+
|
|
867
|
+
# HIG decision principles
|
|
868
|
+
|
|
869
|
+
Use these as decision filters rather than decorative goals.
|
|
870
|
+
|
|
871
|
+
## Purpose
|
|
872
|
+
|
|
873
|
+
Every important element should help users accomplish something meaningful.
|
|
874
|
+
|
|
875
|
+
## Agency
|
|
876
|
+
|
|
877
|
+
Users should understand what they can do, retain control, escape when appropriate, and recover from mistakes.
|
|
878
|
+
|
|
879
|
+
## Responsibility
|
|
880
|
+
|
|
881
|
+
Protect privacy, attention, safety, and user-created work.
|
|
882
|
+
|
|
883
|
+
## Familiarity
|
|
884
|
+
|
|
885
|
+
Use established concepts and interaction conventions unless there is a strong reason not to.
|
|
886
|
+
|
|
887
|
+
## Flexibility
|
|
888
|
+
|
|
889
|
+
Support different devices, input methods, abilities, content sizes, and contexts.
|
|
890
|
+
|
|
891
|
+
## Simplicity
|
|
892
|
+
|
|
893
|
+
Make the next meaningful action clear without removing necessary information or control.
|
|
894
|
+
|
|
895
|
+
## Craft
|
|
896
|
+
|
|
897
|
+
Handle edge cases, timing, spacing, state, focus, copy, and failure with the same care as the happy path.
|
|
898
|
+
|
|
899
|
+
## Delight
|
|
900
|
+
|
|
901
|
+
Delight is the result of responsive, understandable, forgiving software — not an amount of decoration.
|
|
902
|
+
|
|
903
|
+
---
|
|
904
|
+
|
|
905
|
+
# Implementation rules for coding agents
|
|
906
|
+
|
|
907
|
+
When implementing UI, do not stop after making the happy path function.
|
|
908
|
+
|
|
909
|
+
Before editing code:
|
|
910
|
+
|
|
911
|
+
1. inspect the existing design system and reusable components;
|
|
912
|
+
2. identify the primary user action;
|
|
913
|
+
3. identify async boundaries;
|
|
914
|
+
4. identify destructive or data-loss risks;
|
|
915
|
+
5. identify platform and input expectations.
|
|
916
|
+
|
|
917
|
+
During implementation:
|
|
918
|
+
|
|
919
|
+
- use existing components before introducing near-duplicates;
|
|
920
|
+
- use native or semantic controls before recreating them;
|
|
921
|
+
- make processing state explicit;
|
|
922
|
+
- keep state ownership clear;
|
|
923
|
+
- avoid multiple unsynchronized sources of truth;
|
|
924
|
+
- guard against duplicate and stale requests;
|
|
925
|
+
- preserve user context through rerenders;
|
|
926
|
+
- preserve input through failures;
|
|
927
|
+
- avoid fake progress;
|
|
928
|
+
- implement cancellation only when cancellation semantics are real;
|
|
929
|
+
- avoid arbitrary timeouts as synchronization logic;
|
|
930
|
+
- do not hide failures in logs;
|
|
931
|
+
- do not silently swallow rejected operations.
|
|
932
|
+
|
|
933
|
+
When modifying existing behavior, check whether the change accidentally alters:
|
|
934
|
+
|
|
935
|
+
- selection;
|
|
936
|
+
- focus;
|
|
937
|
+
- scroll;
|
|
938
|
+
- navigation;
|
|
939
|
+
- active filters;
|
|
940
|
+
- busy state;
|
|
941
|
+
- error state;
|
|
942
|
+
- mobile layout;
|
|
943
|
+
- keyboard interaction.
|
|
944
|
+
|
|
945
|
+
---
|
|
946
|
+
|
|
947
|
+
# Review procedure
|
|
948
|
+
|
|
949
|
+
When reviewing a concrete UI, do not review screenshots alone.
|
|
950
|
+
|
|
951
|
+
Trace actual interaction behavior.
|
|
952
|
+
|
|
953
|
+
## Step 1 — Inventory
|
|
954
|
+
|
|
955
|
+
Identify:
|
|
956
|
+
|
|
957
|
+
- every primary interactive control;
|
|
958
|
+
- every async action;
|
|
959
|
+
- every destructive action;
|
|
960
|
+
- every form;
|
|
961
|
+
- navigation transitions;
|
|
962
|
+
- dialogs and overlays;
|
|
963
|
+
- responsive variants.
|
|
964
|
+
|
|
965
|
+
## Step 2 — Trace each action
|
|
966
|
+
|
|
967
|
+
For each action ask:
|
|
968
|
+
|
|
969
|
+
```text
|
|
970
|
+
Can the user discover it?
|
|
971
|
+
Can the user activate it comfortably?
|
|
972
|
+
What changes immediately after activation?
|
|
973
|
+
What is shown while it runs?
|
|
974
|
+
Can it execute twice accidentally?
|
|
975
|
+
What does success look like?
|
|
976
|
+
What does failure look like?
|
|
977
|
+
What happens to existing user work?
|
|
978
|
+
How does the user recover?
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
If any answer is undefined, treat it as a design or implementation gap.
|
|
982
|
+
|
|
983
|
+
## Step 3 — Check interaction targets
|
|
984
|
+
|
|
985
|
+
Inspect the effective clickable/tappable region, not only the artwork.
|
|
986
|
+
|
|
987
|
+
Flag:
|
|
988
|
+
|
|
989
|
+
- tiny icon buttons;
|
|
990
|
+
- crowded adjacent actions;
|
|
991
|
+
- precision-dependent targets;
|
|
992
|
+
- hover-only functionality;
|
|
993
|
+
- touch controls below platform expectations without justification.
|
|
994
|
+
|
|
995
|
+
## Step 4 — Test failure paths
|
|
996
|
+
|
|
997
|
+
Verify behavior for:
|
|
998
|
+
|
|
999
|
+
- server error;
|
|
1000
|
+
- validation failure;
|
|
1001
|
+
- timeout;
|
|
1002
|
+
- offline state;
|
|
1003
|
+
- permission denial;
|
|
1004
|
+
- empty result;
|
|
1005
|
+
- cancellation;
|
|
1006
|
+
- stale response;
|
|
1007
|
+
- repeated activation.
|
|
1008
|
+
|
|
1009
|
+
## Step 5 — Test accessibility
|
|
1010
|
+
|
|
1011
|
+
Verify as applicable:
|
|
1012
|
+
|
|
1013
|
+
- keyboard-only operation;
|
|
1014
|
+
- visible focus;
|
|
1015
|
+
- screen-reader semantics;
|
|
1016
|
+
- accessible dynamic status;
|
|
1017
|
+
- contrast;
|
|
1018
|
+
- zoom/text resizing;
|
|
1019
|
+
- Reduced Motion;
|
|
1020
|
+
- touch target size.
|
|
1021
|
+
|
|
1022
|
+
## Step 6 — Test responsive behavior
|
|
1023
|
+
|
|
1024
|
+
Check narrow and wide layouts with real content.
|
|
1025
|
+
|
|
1026
|
+
Ensure functionality and context survive layout changes.
|
|
1027
|
+
|
|
1028
|
+
## Step 7 — Verify recovery
|
|
1029
|
+
|
|
1030
|
+
After every failure, cancellation, dialog dismissal, or temporary state, verify that the interface returns to a coherent usable state.
|
|
1031
|
+
|
|
1032
|
+
---
|
|
1033
|
+
|
|
1034
|
+
# Severity model
|
|
1035
|
+
|
|
1036
|
+
Use severity to prioritize review findings.
|
|
1037
|
+
|
|
1038
|
+
## BLOCKER
|
|
1039
|
+
|
|
1040
|
+
A defect that can cause:
|
|
1041
|
+
|
|
1042
|
+
- data loss;
|
|
1043
|
+
- unintended irreversible destructive action;
|
|
1044
|
+
- inability to complete a primary flow;
|
|
1045
|
+
- security or privacy harm;
|
|
1046
|
+
- inaccessible primary functionality with no alternative;
|
|
1047
|
+
- indefinite state where the user cannot determine whether an important action worked.
|
|
1048
|
+
|
|
1049
|
+
Do not approve the interaction while a known blocker remains.
|
|
1050
|
+
|
|
1051
|
+
## MAJOR
|
|
1052
|
+
|
|
1053
|
+
Examples:
|
|
1054
|
+
|
|
1055
|
+
- click or tap starts asynchronous work with no visible feedback;
|
|
1056
|
+
- primary control has an unreasonably small hit target;
|
|
1057
|
+
- duplicate submission is possible;
|
|
1058
|
+
- processing state is missing;
|
|
1059
|
+
- error has no recovery path;
|
|
1060
|
+
- failed action clears user input;
|
|
1061
|
+
- rerender loses selection or returns to an unrelated item;
|
|
1062
|
+
- primary operation cannot be completed with keyboard where keyboard support is expected;
|
|
1063
|
+
- mobile layout hides required functionality;
|
|
1064
|
+
- destructive action lacks appropriate protection.
|
|
1065
|
+
|
|
1066
|
+
These should normally be fixed before considering the interface complete.
|
|
1067
|
+
|
|
1068
|
+
## MINOR
|
|
1069
|
+
|
|
1070
|
+
Examples:
|
|
1071
|
+
|
|
1072
|
+
- non-critical copy ambiguity;
|
|
1073
|
+
- inconsistent spacing;
|
|
1074
|
+
- unnecessary animation;
|
|
1075
|
+
- secondary-state polish;
|
|
1076
|
+
- small discoverability improvements that do not block or mislead users.
|
|
1077
|
+
|
|
1078
|
+
Minor does not mean optional when several combine into a poor experience.
|
|
1079
|
+
|
|
1080
|
+
---
|
|
1081
|
+
|
|
1082
|
+
# Definition of done
|
|
1083
|
+
|
|
1084
|
+
Do not declare a UI task complete solely because:
|
|
1085
|
+
|
|
1086
|
+
- the build passes;
|
|
1087
|
+
- the API returns success;
|
|
1088
|
+
- the screenshot looks correct;
|
|
1089
|
+
- the happy path works.
|
|
1090
|
+
|
|
1091
|
+
A UI task is complete when applicable behavior has been checked for:
|
|
1092
|
+
|
|
1093
|
+
- target size and comfortable activation;
|
|
1094
|
+
- immediate action feedback;
|
|
1095
|
+
- processing state;
|
|
1096
|
+
- duplicate execution;
|
|
1097
|
+
- success;
|
|
1098
|
+
- failure;
|
|
1099
|
+
- recovery;
|
|
1100
|
+
- user-work preservation;
|
|
1101
|
+
- selection/context preservation;
|
|
1102
|
+
- empty state;
|
|
1103
|
+
- offline behavior;
|
|
1104
|
+
- permissions;
|
|
1105
|
+
- destructive behavior;
|
|
1106
|
+
- keyboard;
|
|
1107
|
+
- screen reader semantics;
|
|
1108
|
+
- focus;
|
|
1109
|
+
- contrast;
|
|
1110
|
+
- zoom/text resizing;
|
|
1111
|
+
- Reduced Motion;
|
|
1112
|
+
- touch and pointer;
|
|
1113
|
+
- responsive layout.
|
|
1114
|
+
|
|
1115
|
+
Report:
|
|
1116
|
+
|
|
1117
|
+
1. what was verified;
|
|
1118
|
+
2. what could not be verified;
|
|
1119
|
+
3. known remaining gaps.
|
|
1120
|
+
|
|
1121
|
+
Never claim interaction behavior was tested if it was inferred only from source code or screenshots.
|
|
1122
|
+
|
|
1123
|
+
---
|
|
1124
|
+
|
|
1125
|
+
# Critical anti-patterns
|
|
1126
|
+
|
|
1127
|
+
Flag these aggressively:
|
|
1128
|
+
|
|
1129
|
+
```text
|
|
1130
|
+
Click -> nothing visible -> background request
|
|
1131
|
+
```
|
|
1132
|
+
|
|
1133
|
+
```text
|
|
1134
|
+
Tiny icon -> tiny hit target
|
|
1135
|
+
```
|
|
1136
|
+
|
|
1137
|
+
```text
|
|
1138
|
+
Submit -> button remains active -> duplicate requests
|
|
1139
|
+
```
|
|
1140
|
+
|
|
1141
|
+
```text
|
|
1142
|
+
Request fails -> form resets
|
|
1143
|
+
```
|
|
1144
|
+
|
|
1145
|
+
```text
|
|
1146
|
+
Loading fails -> spinner forever
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
```text
|
|
1150
|
+
Refresh data -> selected item resets
|
|
1151
|
+
```
|
|
1152
|
+
|
|
1153
|
+
```text
|
|
1154
|
+
Error exists only in console
|
|
1155
|
+
```
|
|
1156
|
+
|
|
1157
|
+
```text
|
|
1158
|
+
Delete -> immediate irreversible loss
|
|
1159
|
+
```
|
|
1160
|
+
|
|
1161
|
+
```text
|
|
1162
|
+
Disabled button -> no explanation
|
|
1163
|
+
```
|
|
1164
|
+
|
|
1165
|
+
```text
|
|
1166
|
+
Mobile layout -> required controls disappear
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
```text
|
|
1170
|
+
Hover -> only way to discover an essential action
|
|
1171
|
+
```
|
|
1172
|
+
|
|
1173
|
+
```text
|
|
1174
|
+
Color -> only indication of state
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
```text
|
|
1178
|
+
Animation -> only indication that an action occurred
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
```text
|
|
1182
|
+
Drag gesture -> only way to perform an essential action
|
|
1183
|
+
```
|
|
1184
|
+
|
|
1185
|
+
```text
|
|
1186
|
+
Async completion -> stale response overwrites newer state
|
|
1187
|
+
```
|
|
1188
|
+
|
|
1189
|
+
```text
|
|
1190
|
+
Whole page blocked -> only one local control is actually busy
|
|
1191
|
+
```
|
|
1192
|
+
|
|
1193
|
+
The underlying implementation may be technically correct in all of these cases. The user experience is not.
|
|
1194
|
+
|
|
1195
|
+
---
|
|
36
1196
|
|
|
37
|
-
|
|
1197
|
+
# Reference material
|
|
38
1198
|
|
|
39
|
-
|
|
1199
|
+
Read [references/ui-checklist.md](references/ui-checklist.md) when performing a detailed UI implementation or review.
|
|
40
1200
|
|
|
41
|
-
|
|
1201
|
+
When current platform requirements matter, prefer the latest official platform guidance over stale remembered values.
|
|
42
1202
|
|
|
43
|
-
|
|
1203
|
+
Primary standards:
|
|
44
1204
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
3. Test with real input methods and accessibility settings, not screenshots alone.
|
|
48
|
-
4. Report covered states, verified behaviors, and any known gaps.
|
|
1205
|
+
- Apple Human Interface Guidelines
|
|
1206
|
+
- Web Content Accessibility Guidelines (WCAG) 2.2
|
|
49
1207
|
|
|
50
|
-
|
|
1208
|
+
This skill paraphrases and operationalizes design and accessibility guidance. It does not require Apple-styled visuals and must not be treated as a substitute for checking current official requirements when exact platform compliance is material.
|