@tangle-network/browser-agent-driver 0.29.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brain/index.d.ts +15 -1
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +67 -5
- package/dist/brain/index.js.map +1 -1
- package/dist/cli-ack-patch.d.ts +39 -0
- package/dist/cli-ack-patch.d.ts.map +1 -0
- package/dist/cli-ack-patch.js +47 -0
- package/dist/cli-ack-patch.js.map +1 -0
- package/dist/cli-design-audit.d.ts +16 -0
- package/dist/cli-design-audit.d.ts.map +1 -1
- package/dist/cli-design-audit.js +232 -7
- package/dist/cli-design-audit.js.map +1 -1
- package/dist/cli-jobs.d.ts +13 -0
- package/dist/cli-jobs.d.ts.map +1 -0
- package/dist/cli-jobs.js +262 -0
- package/dist/cli-jobs.js.map +1 -0
- package/dist/cli-patterns.d.ts +26 -0
- package/dist/cli-patterns.d.ts.map +1 -0
- package/dist/cli-patterns.js +49 -0
- package/dist/cli-patterns.js.map +1 -0
- package/dist/cli-reports.d.ts +12 -0
- package/dist/cli-reports.d.ts.map +1 -0
- package/dist/cli-reports.js +97 -0
- package/dist/cli-reports.js.map +1 -0
- package/dist/cli-ui.d.ts.map +1 -1
- package/dist/cli-ui.js +5 -1
- package/dist/cli-ui.js.map +1 -1
- package/dist/cli.js +52 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/design/audit/attribution/aggregate.d.ts +16 -0
- package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
- package/dist/design/audit/attribution/aggregate.js +81 -0
- package/dist/design/audit/attribution/aggregate.js.map +1 -0
- package/dist/design/audit/attribution/store.d.ts +36 -0
- package/dist/design/audit/attribution/store.d.ts.map +1 -0
- package/dist/design/audit/attribution/store.js +108 -0
- package/dist/design/audit/attribution/store.js.map +1 -0
- package/dist/design/audit/attribution/types.d.ts +13 -0
- package/dist/design/audit/attribution/types.d.ts.map +1 -0
- package/dist/design/audit/attribution/types.js +10 -0
- package/dist/design/audit/attribution/types.js.map +1 -0
- package/dist/design/audit/classify-ensemble.d.ts +46 -0
- package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
- package/dist/design/audit/classify-ensemble.js +207 -0
- package/dist/design/audit/classify-ensemble.js.map +1 -0
- package/dist/design/audit/ethics/check.d.ts +59 -0
- package/dist/design/audit/ethics/check.d.ts.map +1 -0
- package/dist/design/audit/ethics/check.js +137 -0
- package/dist/design/audit/ethics/check.js.map +1 -0
- package/dist/design/audit/ethics/loader.d.ts +21 -0
- package/dist/design/audit/ethics/loader.d.ts.map +1 -0
- package/dist/design/audit/ethics/loader.js +207 -0
- package/dist/design/audit/ethics/loader.js.map +1 -0
- package/dist/design/audit/ethics/rules/finance.yaml +37 -0
- package/dist/design/audit/ethics/rules/kids.yaml +37 -0
- package/dist/design/audit/ethics/rules/legal.yaml +35 -0
- package/dist/design/audit/ethics/rules/medical.yaml +36 -0
- package/dist/design/audit/evaluate.d.ts +69 -0
- package/dist/design/audit/evaluate.d.ts.map +1 -1
- package/dist/design/audit/evaluate.js +417 -55
- package/dist/design/audit/evaluate.js.map +1 -1
- package/dist/design/audit/first-principles-mode.d.ts +42 -0
- package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
- package/dist/design/audit/first-principles-mode.js +77 -0
- package/dist/design/audit/first-principles-mode.js.map +1 -0
- package/dist/design/audit/modality/android.d.ts +14 -0
- package/dist/design/audit/modality/android.d.ts.map +1 -0
- package/dist/design/audit/modality/android.js +18 -0
- package/dist/design/audit/modality/android.js.map +1 -0
- package/dist/design/audit/modality/html.d.ts +22 -0
- package/dist/design/audit/modality/html.d.ts.map +1 -0
- package/dist/design/audit/modality/html.js +51 -0
- package/dist/design/audit/modality/html.js.map +1 -0
- package/dist/design/audit/modality/index.d.ts +8 -0
- package/dist/design/audit/modality/index.d.ts.map +1 -0
- package/dist/design/audit/modality/index.js +15 -0
- package/dist/design/audit/modality/index.js.map +1 -0
- package/dist/design/audit/modality/ios.d.ts +16 -0
- package/dist/design/audit/modality/ios.d.ts.map +1 -0
- package/dist/design/audit/modality/ios.js +19 -0
- package/dist/design/audit/modality/ios.js.map +1 -0
- package/dist/design/audit/modality/types.d.ts +9 -0
- package/dist/design/audit/modality/types.d.ts.map +1 -0
- package/dist/design/audit/modality/types.js +9 -0
- package/dist/design/audit/modality/types.js.map +1 -0
- package/dist/design/audit/patches/index.d.ts +8 -0
- package/dist/design/audit/patches/index.d.ts.map +1 -0
- package/dist/design/audit/patches/index.js +5 -0
- package/dist/design/audit/patches/index.js.map +1 -0
- package/dist/design/audit/patches/parse.d.ts +29 -0
- package/dist/design/audit/patches/parse.d.ts.map +1 -0
- package/dist/design/audit/patches/parse.js +153 -0
- package/dist/design/audit/patches/parse.js.map +1 -0
- package/dist/design/audit/patches/render.d.ts +20 -0
- package/dist/design/audit/patches/render.d.ts.map +1 -0
- package/dist/design/audit/patches/render.js +55 -0
- package/dist/design/audit/patches/render.js.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.js +42 -0
- package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
- package/dist/design/audit/patches/validate.d.ts +34 -0
- package/dist/design/audit/patches/validate.d.ts.map +1 -0
- package/dist/design/audit/patches/validate.js +53 -0
- package/dist/design/audit/patches/validate.js.map +1 -0
- package/dist/design/audit/patterns/match.d.ts +24 -0
- package/dist/design/audit/patterns/match.d.ts.map +1 -0
- package/dist/design/audit/patterns/match.js +48 -0
- package/dist/design/audit/patterns/match.js.map +1 -0
- package/dist/design/audit/patterns/mine.d.ts +31 -0
- package/dist/design/audit/patterns/mine.d.ts.map +1 -0
- package/dist/design/audit/patterns/mine.js +35 -0
- package/dist/design/audit/patterns/mine.js.map +1 -0
- package/dist/design/audit/patterns/store.d.ts +14 -0
- package/dist/design/audit/patterns/store.d.ts.map +1 -0
- package/dist/design/audit/patterns/store.js +53 -0
- package/dist/design/audit/patterns/store.js.map +1 -0
- package/dist/design/audit/patterns/types.d.ts +53 -0
- package/dist/design/audit/patterns/types.d.ts.map +1 -0
- package/dist/design/audit/patterns/types.js +13 -0
- package/dist/design/audit/patterns/types.js.map +1 -0
- package/dist/design/audit/pipeline.d.ts +26 -0
- package/dist/design/audit/pipeline.d.ts.map +1 -1
- package/dist/design/audit/pipeline.js +131 -4
- package/dist/design/audit/pipeline.js.map +1 -1
- package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
- package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
- package/dist/design/audit/rubric/anchor-loader.js +210 -0
- package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
- package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
- package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
- package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
- package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
- package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
- package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
- package/dist/design/audit/rubric/anchors/social.yaml +33 -0
- package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
- package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
- package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
- package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
- package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
- package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
- package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
- package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
- package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
- package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
- package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
- package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
- package/dist/design/audit/rubric/fragments/universal-product-intent.md +48 -0
- package/dist/design/audit/rubric/loader.d.ts +26 -6
- package/dist/design/audit/rubric/loader.d.ts.map +1 -1
- package/dist/design/audit/rubric/loader.js +77 -27
- package/dist/design/audit/rubric/loader.js.map +1 -1
- package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
- package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
- package/dist/design/audit/rubric/rollup-weights.js +51 -0
- package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
- package/dist/design/audit/types.d.ts +28 -0
- package/dist/design/audit/types.d.ts.map +1 -1
- package/dist/design/audit/v2/build-result.d.ts +47 -0
- package/dist/design/audit/v2/build-result.d.ts.map +1 -0
- package/dist/design/audit/v2/build-result.js +163 -0
- package/dist/design/audit/v2/build-result.js.map +1 -0
- package/dist/design/audit/v2/score.d.ts +49 -0
- package/dist/design/audit/v2/score.d.ts.map +1 -0
- package/dist/design/audit/v2/score.js +211 -0
- package/dist/design/audit/v2/score.js.map +1 -0
- package/dist/design/audit/v2/types.d.ts +431 -0
- package/dist/design/audit/v2/types.d.ts.map +1 -0
- package/dist/design/audit/v2/types.js +26 -0
- package/dist/design/audit/v2/types.js.map +1 -0
- package/dist/discover/index.d.ts +16 -0
- package/dist/discover/index.d.ts.map +1 -0
- package/dist/discover/index.js +25 -0
- package/dist/discover/index.js.map +1 -0
- package/dist/discover/wayback.d.ts +49 -0
- package/dist/discover/wayback.d.ts.map +1 -0
- package/dist/discover/wayback.js +123 -0
- package/dist/discover/wayback.js.map +1 -0
- package/dist/jobs/anti-bot.d.ts +19 -0
- package/dist/jobs/anti-bot.d.ts.map +1 -0
- package/dist/jobs/anti-bot.js +64 -0
- package/dist/jobs/anti-bot.js.map +1 -0
- package/dist/jobs/cost-estimate.d.ts +12 -0
- package/dist/jobs/cost-estimate.d.ts.map +1 -0
- package/dist/jobs/cost-estimate.js +21 -0
- package/dist/jobs/cost-estimate.js.map +1 -0
- package/dist/jobs/cost-history.d.ts +19 -0
- package/dist/jobs/cost-history.d.ts.map +1 -0
- package/dist/jobs/cost-history.js +42 -0
- package/dist/jobs/cost-history.js.map +1 -0
- package/dist/jobs/index.d.ts +31 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +37 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/orchestrator.d.ts +42 -0
- package/dist/jobs/orchestrator.d.ts.map +1 -0
- package/dist/jobs/orchestrator.js +282 -0
- package/dist/jobs/orchestrator.js.map +1 -0
- package/dist/jobs/queue.d.ts +45 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +114 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/retry.d.ts +36 -0
- package/dist/jobs/retry.d.ts.map +1 -0
- package/dist/jobs/retry.js +77 -0
- package/dist/jobs/retry.js.map +1 -0
- package/dist/jobs/store.d.ts +31 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +92 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/types.d.ts +106 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +13 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/provider-defaults.d.ts +1 -1
- package/dist/provider-defaults.d.ts.map +1 -1
- package/dist/provider-defaults.js +8 -0
- package/dist/provider-defaults.js.map +1 -1
- package/dist/reports/aggregate.d.ts +38 -0
- package/dist/reports/aggregate.d.ts.map +1 -0
- package/dist/reports/aggregate.js +145 -0
- package/dist/reports/aggregate.js.map +1 -0
- package/dist/reports/index.d.ts +21 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +15 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/narrate.d.ts +19 -0
- package/dist/reports/narrate.d.ts.map +1 -0
- package/dist/reports/narrate.js +40 -0
- package/dist/reports/narrate.js.map +1 -0
- package/dist/reports/templates.d.ts +43 -0
- package/dist/reports/templates.d.ts.map +1 -0
- package/dist/reports/templates.js +200 -0
- package/dist/reports/templates.js.map +1 -0
- package/dist/reports/tokens.d.ts +77 -0
- package/dist/reports/tokens.d.ts.map +1 -0
- package/dist/reports/tokens.js +88 -0
- package/dist/reports/tokens.js.map +1 -0
- package/dist/reports/tools.d.ts +76 -0
- package/dist/reports/tools.d.ts.map +1 -0
- package/dist/reports/tools.js +205 -0
- package/dist/reports/tools.js.map +1 -0
- package/dist/reports/types.d.ts +51 -0
- package/dist/reports/types.d.ts.map +1 -0
- package/dist/reports/types.js +9 -0
- package/dist/reports/types.js.map +1 -0
- package/dist/supervisor/critic.d.ts +1 -1
- package/dist/supervisor/critic.d.ts.map +1 -1
- package/dist/supervisor/critic.js +50 -5
- package/dist/supervisor/critic.js.map +1 -1
- package/dist/telemetry/client.d.ts +42 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +203 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/hash.d.ts +4 -0
- package/dist/telemetry/hash.d.ts.map +1 -0
- package/dist/telemetry/hash.js +7 -0
- package/dist/telemetry/hash.js.map +1 -0
- package/dist/telemetry/index.d.ts +6 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +5 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/schema.d.ts +85 -0
- package/dist/telemetry/schema.d.ts.map +1 -0
- package/dist/telemetry/schema.js +13 -0
- package/dist/telemetry/schema.js.map +1 -0
- package/dist/telemetry/sink.d.ts +46 -0
- package/dist/telemetry/sink.d.ts.map +1 -0
- package/dist/telemetry/sink.js +97 -0
- package/dist/telemetry/sink.js.map +1 -0
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type: saas-app
|
|
2
|
+
score_9_10:
|
|
3
|
+
criteria:
|
|
4
|
+
- Domain object visible above the fold (tasks, deployments, conversations, files)
|
|
5
|
+
- One visually-dominant primary action per page state
|
|
6
|
+
- Empty states preview real product (sample rows, setup checklists, status timelines), not generic illustrations
|
|
7
|
+
- Action hierarchy = product hierarchy; no decorative buttons competing with workflow
|
|
8
|
+
- Trust details visible where commitment exists (price, permissions, undo, audit trail)
|
|
9
|
+
fixtures:
|
|
10
|
+
- fixture:linear-app
|
|
11
|
+
- fixture:figma-file-ui
|
|
12
|
+
- fixture:notion-editor
|
|
13
|
+
- fixture:superhuman
|
|
14
|
+
- fixture:github-pr-view
|
|
15
|
+
score_7_8:
|
|
16
|
+
criteria:
|
|
17
|
+
- Most criteria from 9-10 with one or two minor gaps
|
|
18
|
+
- Polish gaps that don't block job completion
|
|
19
|
+
- Domain objects present but action hierarchy slightly diffuse
|
|
20
|
+
fixtures:
|
|
21
|
+
- fixture:airtable-grid
|
|
22
|
+
- fixture:notion-database
|
|
23
|
+
score_5_6:
|
|
24
|
+
criteria:
|
|
25
|
+
- Functional but generic component-library assembly
|
|
26
|
+
- No domain object above the fold OR action hierarchy unclear
|
|
27
|
+
- Empty states show illustrations + platitudes instead of product preview
|
|
28
|
+
- Multiple equal-weight CTAs without a dominant primary
|
|
29
|
+
fixtures:
|
|
30
|
+
- fixture:generic-dashboard
|
|
31
|
+
score_3_4:
|
|
32
|
+
criteria:
|
|
33
|
+
- No primary job inferable from screen
|
|
34
|
+
- Equal-weight CTAs blocking workflow
|
|
35
|
+
- Decorative elements actively distract from product surface
|
|
36
|
+
- Page reads as a marketing/setup stub rather than an operational product
|
|
37
|
+
fixtures:
|
|
38
|
+
- fixture:no-primary-action
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type: social
|
|
2
|
+
score_9_10:
|
|
3
|
+
criteria:
|
|
4
|
+
- Feed prioritizes real content (posts, conversations) over chrome and ads
|
|
5
|
+
- Compose surface is one click away and primary in the layout
|
|
6
|
+
- Identity signals (verified accounts, profile preview, follower counts) consistent and lightweight
|
|
7
|
+
- State transitions (like, reply, repost) feel instant and reversible
|
|
8
|
+
- Empty states preview what the feed will look like with a few followed accounts
|
|
9
|
+
fixtures:
|
|
10
|
+
- fixture:threads-web
|
|
11
|
+
- fixture:bluesky-web
|
|
12
|
+
- fixture:substack-inline
|
|
13
|
+
score_7_8:
|
|
14
|
+
criteria:
|
|
15
|
+
- Solid feed and compose flow but reply chains are visually flat
|
|
16
|
+
- Identity signals inconsistent across surfaces
|
|
17
|
+
- Empty states use illustrations rather than previewing real content
|
|
18
|
+
fixtures:
|
|
19
|
+
- fixture:generic-microblog
|
|
20
|
+
score_5_6:
|
|
21
|
+
criteria:
|
|
22
|
+
- Feed cluttered with chrome (rails, ads, suggestions) competing with content
|
|
23
|
+
- Compose buried two clicks deep
|
|
24
|
+
- Action affordances (reply, like, share) are equal weight with no clear primary
|
|
25
|
+
fixtures:
|
|
26
|
+
- fixture:cluttered-feed
|
|
27
|
+
score_3_4:
|
|
28
|
+
criteria:
|
|
29
|
+
- Page reads as ad inventory with content squeezed in
|
|
30
|
+
- No clear primary feed; multiple surfaces compete
|
|
31
|
+
- Identity signals fake or absent (anonymous content with no provenance)
|
|
32
|
+
fixtures:
|
|
33
|
+
- fixture:ad-heavy-feed
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type: tool
|
|
2
|
+
score_9_10:
|
|
3
|
+
criteria:
|
|
4
|
+
- Single-purpose surface — the input and output relationship is immediate and obvious
|
|
5
|
+
- Keyboard-first interaction (shortcuts, focus management, paste support)
|
|
6
|
+
- Output is copyable, exportable, and shareable without modal interruption
|
|
7
|
+
- Recent results, history, or undo always available
|
|
8
|
+
- State (input, processing, output, error) handled explicitly with clear transitions
|
|
9
|
+
fixtures:
|
|
10
|
+
- fixture:linear-command-palette
|
|
11
|
+
- fixture:github-pr-view
|
|
12
|
+
- fixture:raycast
|
|
13
|
+
score_7_8:
|
|
14
|
+
criteria:
|
|
15
|
+
- Tool works well but lacks keyboard affordances or history
|
|
16
|
+
- Output exportable but with extra clicks
|
|
17
|
+
- Error states present but generic
|
|
18
|
+
fixtures:
|
|
19
|
+
- fixture:generic-converter
|
|
20
|
+
score_5_6:
|
|
21
|
+
criteria:
|
|
22
|
+
- Form-and-submit pattern with reload-style output
|
|
23
|
+
- No keyboard shortcuts, no history, no undo
|
|
24
|
+
- Loading and error states use defaults
|
|
25
|
+
fixtures:
|
|
26
|
+
- fixture:basic-tool-form
|
|
27
|
+
score_3_4:
|
|
28
|
+
criteria:
|
|
29
|
+
- Multi-step flow for what should be a single action
|
|
30
|
+
- Output requires manual selection/copy
|
|
31
|
+
- No error handling — failures show generic browser errors
|
|
32
|
+
fixtures:
|
|
33
|
+
- fixture:broken-tool
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type: utility
|
|
2
|
+
score_9_10:
|
|
3
|
+
criteria:
|
|
4
|
+
- Status, configuration, or admin surface that exposes the operational object directly (deploy, build, job, account)
|
|
5
|
+
- Real state (running, succeeded, failed, queued) with timestamps and durations
|
|
6
|
+
- Action affordances (retry, rollback, configure, audit) match the operational verbs of the system
|
|
7
|
+
- Logs, diagnostics, or detail panels are one click from the summary
|
|
8
|
+
- Empty states preview what real activity will look like
|
|
9
|
+
fixtures:
|
|
10
|
+
- fixture:vercel-deployment-status
|
|
11
|
+
- fixture:cloudflare-dashboard
|
|
12
|
+
- fixture:github-actions
|
|
13
|
+
score_7_8:
|
|
14
|
+
criteria:
|
|
15
|
+
- Status surface clear but action affordances are generic (Edit/Save instead of Retry/Rollback)
|
|
16
|
+
- Logs accessible but require navigation
|
|
17
|
+
- Empty states use illustrations rather than previewing activity
|
|
18
|
+
fixtures:
|
|
19
|
+
- fixture:generic-admin
|
|
20
|
+
score_5_6:
|
|
21
|
+
criteria:
|
|
22
|
+
- Status indicators are decorative pills without timestamps or durations
|
|
23
|
+
- Logs and diagnostics buried in modals
|
|
24
|
+
- Forms-of-forms pattern instead of operational verbs
|
|
25
|
+
fixtures:
|
|
26
|
+
- fixture:basic-settings-page
|
|
27
|
+
score_3_4:
|
|
28
|
+
criteria:
|
|
29
|
+
- Status is text only — no visual signal of failure or success
|
|
30
|
+
- No way to retry, rollback, or audit from the surface
|
|
31
|
+
- Settings sprawl with no IA, no search
|
|
32
|
+
fixtures:
|
|
33
|
+
- fixture:settings-sprawl
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: audience-clinician
|
|
3
|
+
title: Clinician Audience
|
|
4
|
+
weight: high
|
|
5
|
+
applies-when:
|
|
6
|
+
audience: [clinician]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is used by clinical professionals (physicians, nurses, pharmacists,
|
|
10
|
+
therapists) in high-stakes decision-making contexts. Standard consumer-UX
|
|
11
|
+
heuristics are insufficient — apply the following additional lens.
|
|
12
|
+
|
|
13
|
+
INFORMATION DENSITY
|
|
14
|
+
- Clinicians tolerate and often require high information density. Sparse
|
|
15
|
+
consumer-style layouts that hide detail behind progressive disclosure are
|
|
16
|
+
friction, not polish.
|
|
17
|
+
- Data tables, lab result grids, medication lists must be fully visible without
|
|
18
|
+
expand/collapse. If key data is folded, score `content_ia` lower.
|
|
19
|
+
|
|
20
|
+
WORKFLOW EFFICIENCY
|
|
21
|
+
- Clinicians context-switch constantly (patient to patient, chart to EHR to
|
|
22
|
+
order entry). Keyboard navigation, dense primary actions, and minimal
|
|
23
|
+
confirmation dialogs for routine operations are expected.
|
|
24
|
+
- If standard consumer patterns (fat CTAs, step-by-step wizards) dominate
|
|
25
|
+
routine tasks, score `workflow` lower.
|
|
26
|
+
|
|
27
|
+
CRITICAL VALUE FLAGGING
|
|
28
|
+
- Out-of-range lab values, drug interactions, and alert states must be
|
|
29
|
+
immediately visible with high visual contrast — not just color. Include
|
|
30
|
+
icon + text pattern redundancy.
|
|
31
|
+
- Missing or weak critical-value flagging is a major finding in `trust_clarity`.
|
|
32
|
+
|
|
33
|
+
AUDIT TRAIL AND ATTRIBUTION
|
|
34
|
+
- Clinician workflows require visible "who did what, when" — last modified by,
|
|
35
|
+
order placed by, cosigned by. This is both regulatory and practical.
|
|
36
|
+
- If attributable actions lack visible provenance, that is a major finding in
|
|
37
|
+
`trust_clarity`.
|
|
38
|
+
|
|
39
|
+
DO NOT penalize for:
|
|
40
|
+
- Dense information layouts (this is intentional)
|
|
41
|
+
- Lack of illustrations or hero imagery
|
|
42
|
+
- Technical terminology appropriate to the audience
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: audience-developer
|
|
3
|
+
title: Developer Audience
|
|
4
|
+
weight: medium
|
|
5
|
+
applies-when:
|
|
6
|
+
audience: [developer]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is used by software engineers and technical practitioners.
|
|
10
|
+
|
|
11
|
+
INFORMATION OVER DECORATION
|
|
12
|
+
- Code samples, CLI commands, API endpoints, and technical specifications must
|
|
13
|
+
be immediately accessible — not gated behind tabs, scrolling, or "Request
|
|
14
|
+
Demo" flows. If core technical content requires navigation to find, score
|
|
15
|
+
`content_ia` lower.
|
|
16
|
+
|
|
17
|
+
COPY-PASTE HYGIENE
|
|
18
|
+
- Every code block must have a visible copy button or be selectable without
|
|
19
|
+
capturing surrounding prose. Missing copy affordance is a minor-to-major
|
|
20
|
+
finding in `workflow` depending on frequency.
|
|
21
|
+
|
|
22
|
+
DARK MODE AND TERMINAL AESTHETICS
|
|
23
|
+
- Developers default to dark environments. A light-only surface with no dark
|
|
24
|
+
mode is a `visual_craft` minor finding. A surface that actively breaks
|
|
25
|
+
(illegible code contrast) in dark mode is major.
|
|
26
|
+
|
|
27
|
+
AUTHENTICATION PATHS
|
|
28
|
+
- API keys, tokens, and credentials should be displayed with
|
|
29
|
+
mask-by-default + reveal-on-click. Showing credentials in plaintext by
|
|
30
|
+
default is a critical `trust_clarity` finding.
|
|
31
|
+
|
|
32
|
+
SEARCH AS PRIMARY NAVIGATION
|
|
33
|
+
- Technical docs and reference surfaces must have a prominent, keyboard-
|
|
34
|
+
accessible search. If Cmd/Ctrl-K does not open search, that is a major
|
|
35
|
+
finding in `workflow`.
|
|
36
|
+
|
|
37
|
+
DO NOT penalize for:
|
|
38
|
+
- Dense information layouts
|
|
39
|
+
- Monospace typography sections
|
|
40
|
+
- Minimal illustration or marketing copy
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: audience-kids
|
|
3
|
+
title: Kids Audience
|
|
4
|
+
weight: critical
|
|
5
|
+
applies-when:
|
|
6
|
+
audience: [kids]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is used by or targeted at minors. Apply the following additional
|
|
10
|
+
lens. Note: ethics rules in Layer 7 enforce hard score floors independently
|
|
11
|
+
of rubric scoring — both layers apply simultaneously.
|
|
12
|
+
|
|
13
|
+
AGE-APPROPRIATE LANGUAGE AND IMAGERY
|
|
14
|
+
- Copy must be readable at the stated age level. Technical jargon, legalese,
|
|
15
|
+
or implicit social pressure ("Your friends are waiting!") are major findings
|
|
16
|
+
in `content_ia`.
|
|
17
|
+
- Imagery should be appropriate for the age group. Mature themes, even subtle
|
|
18
|
+
ones, are critical findings in `trust_clarity`.
|
|
19
|
+
|
|
20
|
+
FRICTION-SYMMETRIC FLOWS
|
|
21
|
+
- Actions that benefit the operator (in-app purchase, data sharing, account
|
|
22
|
+
creation) must have equal or greater friction than their reversal
|
|
23
|
+
(cancellation, data deletion, account closure).
|
|
24
|
+
- Any flow where it is easier to spend money / share data than to undo is a
|
|
25
|
+
critical finding in `workflow`.
|
|
26
|
+
|
|
27
|
+
PARENTAL CONTROLS VISIBILITY
|
|
28
|
+
- If the app collects data from minors, parental consent or control mechanisms
|
|
29
|
+
must be visible without buried navigation. If absent: major finding in
|
|
30
|
+
`trust_clarity`.
|
|
31
|
+
|
|
32
|
+
DO NOT penalize for:
|
|
33
|
+
- Simplified language and larger touch targets
|
|
34
|
+
- Reduced information density appropriate to age
|
|
35
|
+
- Bright color palettes and playful illustration styles
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: audience-vulnerability-minor-facing
|
|
3
|
+
title: Minor-Facing Audience Vulnerability
|
|
4
|
+
weight: critical
|
|
5
|
+
applies-when:
|
|
6
|
+
audienceVulnerability: [minor-facing]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface directly interacts with users who are minors or who are
|
|
10
|
+
unaccompanied minors in a supervised context (e.g. school software, children's
|
|
11
|
+
gaming, education platforms). The vulnerability is that the minor may not fully
|
|
12
|
+
understand consent, financial consequence, or data implications. Apply this
|
|
13
|
+
lens in addition to audience-kids and regulatory-coppa fragments.
|
|
14
|
+
|
|
15
|
+
DARK PATTERN PROHIBITION — ENFORCED
|
|
16
|
+
Every dark pattern is a critical finding when directed at minors. Dark patterns
|
|
17
|
+
to look for:
|
|
18
|
+
- Confirmshaming ("No thanks, I don't want to save money")
|
|
19
|
+
- Fake urgency ("Only 2 left! Timer expires in 03:42")
|
|
20
|
+
- Hidden costs revealed at final checkout step
|
|
21
|
+
- Forced continuity (subscription auto-enrolled without explicit confirmation)
|
|
22
|
+
- Misdirection (styled "X" button that is actually an ad click)
|
|
23
|
+
|
|
24
|
+
IRREVERSIBILITY DISCLOSURE
|
|
25
|
+
- Any action that is irreversible (purchase, deletion, sharing to others) must
|
|
26
|
+
be labeled explicitly. "Delete" without "This cannot be undone" is a major
|
|
27
|
+
finding in `trust_clarity`.
|
|
28
|
+
|
|
29
|
+
SOCIAL COMPARISON AS PRESSURE
|
|
30
|
+
- Leaderboards, "Your friends have X" notifications, or streak-loss warnings
|
|
31
|
+
designed to create anxiety are major `trust_clarity` findings when the
|
|
32
|
+
audience is minors.
|
|
33
|
+
|
|
34
|
+
REPORTING AND BLOCKING CONTROLS
|
|
35
|
+
- If the surface allows social interaction (messaging, comments, reactions),
|
|
36
|
+
visible reporting and blocking controls are required. Absent: major finding
|
|
37
|
+
in `trust_clarity`.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: first-principles
|
|
3
|
+
title: First-Principles Fallback
|
|
4
|
+
weight: critical
|
|
5
|
+
applies-when:
|
|
6
|
+
universal: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You haven't seen this pattern before. Do not fabricate a classification.
|
|
10
|
+
Audit against the universal product principles only. Score per-dimension as
|
|
11
|
+
usual, but set `rollup.confidence = "low"` and emit a top-level
|
|
12
|
+
`novel_pattern_signal` describing what you observed, so this surface can be
|
|
13
|
+
mined into a new fragment after enough fleet exposure.
|
|
14
|
+
|
|
15
|
+
1. PRIMARY JOB CLARITY (5 sec test)
|
|
16
|
+
- Within 5 seconds, can a stranger name what this page is for?
|
|
17
|
+
- If no: severity major; finding category `product_intent`.
|
|
18
|
+
|
|
19
|
+
2. PRIMARY ACTION OBVIOUSNESS
|
|
20
|
+
- Is there one visually-dominant action this page is built around?
|
|
21
|
+
- Are competing actions visually subordinate?
|
|
22
|
+
- If equal-weight: severity major; finding category `product_intent`.
|
|
23
|
+
|
|
24
|
+
3. STATE PREVIEW
|
|
25
|
+
- Are empty/loading/error states designed, or browser-default / placeholder?
|
|
26
|
+
- Do empty states preview the real product, or show generic illustrations?
|
|
27
|
+
- If generic: severity major; finding category `product_intent`.
|
|
28
|
+
|
|
29
|
+
4. TRUST BEFORE COMMITMENT
|
|
30
|
+
- Does the page ask the user to commit (money, identity, deploy, share)?
|
|
31
|
+
- If yes: are price, permissions, scope, undo path visible BEFORE the
|
|
32
|
+
commit button?
|
|
33
|
+
- If no: severity critical; finding category `trust_clarity`.
|
|
34
|
+
|
|
35
|
+
5. RECOVERY FROM FAILURE
|
|
36
|
+
- Can the user undo their last action?
|
|
37
|
+
- Is there a clear path forward when something fails?
|
|
38
|
+
- If no: severity major; finding category `workflow`.
|
|
39
|
+
|
|
40
|
+
GUARDRAILS:
|
|
41
|
+
- Do not invent domain-specific findings ("this dashboard needs charts").
|
|
42
|
+
You don't know the domain. Stick to the five principles.
|
|
43
|
+
- Do not anchor on marketing-page heuristics (hero copy, illustrations,
|
|
44
|
+
social proof). They don't apply.
|
|
45
|
+
- If a principle simply doesn't apply (e.g. there is no commitment on this
|
|
46
|
+
page), say so explicitly rather than scoring it generically.
|
|
47
|
+
|
|
48
|
+
RESPOND WITH ONLY a JSON object of the form:
|
|
49
|
+
{
|
|
50
|
+
"scores": {
|
|
51
|
+
"product_intent": { "score": <1-10>, "range": [<lo>, <hi>], "confidence": "low", "summary": "<one sentence>", "primaryFindings": [] },
|
|
52
|
+
"visual_craft": { ... },
|
|
53
|
+
"trust_clarity": { ... },
|
|
54
|
+
"workflow": { ... },
|
|
55
|
+
"content_ia": { ... }
|
|
56
|
+
},
|
|
57
|
+
"rollup": { "score": <1-10>, "range": [<lo>, <hi>], "confidence": "low", "rule": "first-principles", "weights": { "product_intent": 0.30, "workflow": 0.25, "visual_craft": 0.20, "content_ia": 0.15, "trust_clarity": 0.10 } },
|
|
58
|
+
"findings": [ ... ],
|
|
59
|
+
"novel_pattern_signal": {
|
|
60
|
+
"observedSignals": [
|
|
61
|
+
{ "label": "<short-label>", "evidence": "<what you saw>", "confidence": <0..1> }
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"first_principles_mode": true
|
|
65
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: modality-mobile
|
|
3
|
+
title: Mobile Modality
|
|
4
|
+
weight: medium
|
|
5
|
+
applies-when:
|
|
6
|
+
modality: [mobile]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is evaluated at a mobile viewport (≤480px wide). Apply the
|
|
10
|
+
following lens on top of page-type and domain fragments.
|
|
11
|
+
|
|
12
|
+
TOUCH TARGET SIZING
|
|
13
|
+
- Interactive elements must meet minimum 44×44pt touch targets (WCAG 2.5.5
|
|
14
|
+
AAA; Apple HIG minimum). Anything below 32pt is a major finding in
|
|
15
|
+
`workflow`. Count the number of undersized targets — if >3 on a single
|
|
16
|
+
screen, escalate to critical.
|
|
17
|
+
|
|
18
|
+
THUMB-ZONE REACHABILITY
|
|
19
|
+
- Primary actions must be reachable in the bottom 60% of a 375px screen
|
|
20
|
+
one-handed. A primary CTA pinned to the top of the viewport is a major
|
|
21
|
+
`workflow` finding.
|
|
22
|
+
|
|
23
|
+
HORIZONTAL SCROLL AVOIDANCE
|
|
24
|
+
- Content must not require horizontal scroll on a 375px viewport. Tables
|
|
25
|
+
that overflow without a scroll affordance are major `workflow` findings.
|
|
26
|
+
|
|
27
|
+
FONT LEGIBILITY
|
|
28
|
+
- Body text must be ≥16px (browser zoom notwithstanding). Text smaller than
|
|
29
|
+
14px is a major `visual_craft` finding. Text below 12px is critical.
|
|
30
|
+
|
|
31
|
+
FORM INPUT KEYBOARD
|
|
32
|
+
- Input fields must trigger the appropriate virtual keyboard type (numeric
|
|
33
|
+
for phone/postcode, email for email, tel for phone numbers). Wrong keyboard
|
|
34
|
+
type is a minor `workflow` finding per field.
|
|
35
|
+
|
|
36
|
+
DO NOT penalize for:
|
|
37
|
+
- Navigation patterns specific to mobile (hamburger, bottom tab bar)
|
|
38
|
+
- Reduced visible surface area compared to desktop
|
|
39
|
+
- Single-column layouts
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: modality-tablet
|
|
3
|
+
title: Tablet Modality
|
|
4
|
+
weight: low
|
|
5
|
+
applies-when:
|
|
6
|
+
modality: [tablet]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is evaluated at a tablet viewport (481–1024px wide). Apply this
|
|
10
|
+
lens on top of page-type and domain fragments.
|
|
11
|
+
|
|
12
|
+
LAYOUT ADAPTATION
|
|
13
|
+
- The layout must actually adapt between mobile and desktop — not simply
|
|
14
|
+
scale a mobile layout or stretch a desktop layout. A layout that is
|
|
15
|
+
identical to either breakpoint is a minor `visual_craft` finding.
|
|
16
|
+
|
|
17
|
+
SPLIT-VIEW AND SIDEBAR OPPORTUNITIES
|
|
18
|
+
- Tablet viewports often benefit from master-detail or sidebar-content
|
|
19
|
+
patterns rather than single-column stacks. If the content hierarchy would
|
|
20
|
+
benefit from a persistent sidebar and none is present, that is a minor
|
|
21
|
+
`workflow` finding.
|
|
22
|
+
|
|
23
|
+
TOUCH AND POINTER HYBRID
|
|
24
|
+
- Tablet users may use touch or pointer. Touch targets must still meet the
|
|
25
|
+
44pt minimum. Hover-only affordances without touch fallbacks are major
|
|
26
|
+
`workflow` findings.
|
|
27
|
+
|
|
28
|
+
LANDSCAPE AND PORTRAIT PARITY
|
|
29
|
+
- Key interactions must work in both orientations. If a primary action is
|
|
30
|
+
unreachable in landscape (below fold with no scroll), that is a major
|
|
31
|
+
`workflow` finding.
|
|
32
|
+
|
|
33
|
+
DO NOT penalize for:
|
|
34
|
+
- Adapting typography slightly smaller than mobile maximums
|
|
35
|
+
- Showing more information density than the mobile equivalent
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: regulatory-coppa
|
|
3
|
+
title: COPPA Regulatory Context
|
|
4
|
+
weight: critical
|
|
5
|
+
applies-when:
|
|
6
|
+
regulatoryContext: [coppa]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is subject to COPPA (Children's Online Privacy Protection Act).
|
|
10
|
+
Apply this lens when the audience includes or may include users under 13. The
|
|
11
|
+
ethics gate (Layer 7) independently enforces hard score floors for missing
|
|
12
|
+
age gates and dark patterns — both apply simultaneously.
|
|
13
|
+
|
|
14
|
+
VERIFIABLE PARENTAL CONSENT
|
|
15
|
+
- If this surface collects personal data from users who may be under 13,
|
|
16
|
+
a verifiable parental consent mechanism must be visible and functional.
|
|
17
|
+
Absent: critical finding in `trust_clarity`.
|
|
18
|
+
|
|
19
|
+
AGE GATE INTEGRITY
|
|
20
|
+
- Age gates must require date-of-birth entry, not a single yes/no question
|
|
21
|
+
("Are you 13 or older?"). A single-question age gate is a major finding —
|
|
22
|
+
it is trivially bypassed.
|
|
23
|
+
|
|
24
|
+
DATA COLLECTION DISCLOSURE
|
|
25
|
+
- A clear, plain-English summary of what data is collected and why must be
|
|
26
|
+
visible before any data collection begins. Buried in a privacy policy does
|
|
27
|
+
not satisfy this requirement. Absent: major finding in `content_ia`.
|
|
28
|
+
|
|
29
|
+
PROHIBITION ON BEHAVIORAL TARGETING
|
|
30
|
+
- No behavioral advertising or cross-site tracking may be enabled for users
|
|
31
|
+
under 13. If third-party tracking scripts are present without age-based
|
|
32
|
+
gating: critical finding in `trust_clarity`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: regulatory-gdpr
|
|
3
|
+
title: GDPR Regulatory Context
|
|
4
|
+
weight: high
|
|
5
|
+
applies-when:
|
|
6
|
+
regulatoryContext: [gdpr]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface is subject to GDPR. Apply the following lens in addition to other
|
|
10
|
+
applicable fragments. Note: the ethics gate (Layer 7) independently enforces a
|
|
11
|
+
score floor for missing consent mechanisms — both apply.
|
|
12
|
+
|
|
13
|
+
CONSENT MECHANISM QUALITY
|
|
14
|
+
- Cookie consent banners must offer granular controls (necessary / analytics /
|
|
15
|
+
marketing) with equal visual prominence. An "Accept all" button that is
|
|
16
|
+
larger or more prominent than "Manage preferences" is a major `trust_clarity`
|
|
17
|
+
finding.
|
|
18
|
+
- Pre-ticked checkboxes are a critical finding — they are unlawful under GDPR.
|
|
19
|
+
|
|
20
|
+
DATA SUBJECT RIGHTS ACCESS
|
|
21
|
+
- Users must be able to find their data rights (access, deletion, portability,
|
|
22
|
+
correction) without more than 2 navigation steps from any page. If the
|
|
23
|
+
privacy page is not reachable from the footer, that is a major finding in
|
|
24
|
+
`content_ia`.
|
|
25
|
+
|
|
26
|
+
LEGAL BASIS TRANSPARENCY
|
|
27
|
+
- If the page collects personal data, the legal basis (consent, legitimate
|
|
28
|
+
interest, contract) must be stated. Absent: minor finding in `trust_clarity`.
|
|
29
|
+
|
|
30
|
+
DATA RETENTION
|
|
31
|
+
- If retention periods are disclosed (they should be), they must be
|
|
32
|
+
understandable to a non-lawyer. Legal boilerplate with no plain-English
|
|
33
|
+
summary is a minor finding in `content_ia`.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: regulatory-hipaa
|
|
3
|
+
title: HIPAA Regulatory Context
|
|
4
|
+
weight: high
|
|
5
|
+
applies-when:
|
|
6
|
+
regulatoryContext: [hipaa]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
This surface handles Protected Health Information (PHI) and is subject to HIPAA
|
|
10
|
+
technical safeguards. Apply this lens in addition to domain-specific fragments.
|
|
11
|
+
|
|
12
|
+
SESSION SECURITY VISIBILITY
|
|
13
|
+
- Automatic session timeout must be visible to the user (countdown or clear
|
|
14
|
+
logout trigger). Invisible timeout with hard logout is a major `workflow`
|
|
15
|
+
finding.
|
|
16
|
+
- If the surface shows PHI and has no visible session indicator, that is a
|
|
17
|
+
major `trust_clarity` finding.
|
|
18
|
+
|
|
19
|
+
MINIMUM NECESSARY DATA
|
|
20
|
+
- Only the minimum necessary PHI should be visible on any given screen.
|
|
21
|
+
Dashboards that show full SSN, full DOB, or complete medication histories
|
|
22
|
+
when partial identifiers suffice are major `trust_clarity` findings.
|
|
23
|
+
|
|
24
|
+
AUDIT LOG ACCESS
|
|
25
|
+
- If this surface allows modification of PHI, a visible "audit log" or
|
|
26
|
+
"activity history" link must be accessible to the user. Absent: minor
|
|
27
|
+
finding in `trust_clarity`.
|
|
28
|
+
|
|
29
|
+
DATA EXPORT LABELING
|
|
30
|
+
- Export buttons (CSV, PDF, print) must label the output as PHI with a
|
|
31
|
+
handling reminder. Unlabeled PHI export is a minor finding.
|
|
32
|
+
|
|
33
|
+
DO NOT penalize for:
|
|
34
|
+
- Explicit data masking that adds cognitive load (masks protect PHI)
|
|
35
|
+
- Confirmation dialogs on irreversible PHI operations
|
|
36
|
+
- Conservative color coding that prioritizes legibility over aesthetics
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: universal-product-intent
|
|
3
|
+
title: Product Intent & Outcome Fit
|
|
4
|
+
weight: critical
|
|
5
|
+
dimension: product-clarity
|
|
6
|
+
applies-when:
|
|
7
|
+
universal: true
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
PRODUCT INTENT AUDIT — judge the screen by the job it must do, not by generic prettiness.
|
|
11
|
+
|
|
12
|
+
Before scoring, infer these from the screenshot and classification:
|
|
13
|
+
- Primary audience: who is this for right now?
|
|
14
|
+
- Primary job: what must this page help them accomplish?
|
|
15
|
+
- Primary action: what should they do next?
|
|
16
|
+
- Stakes: what can go wrong if the UI is unclear? Money, trust, data loss, wrong deployment, wasted time, safety, legal/medical risk, brand trust, or simple confusion.
|
|
17
|
+
- Success path: what is the shortest believable path from landing on this screen to completing the job?
|
|
18
|
+
|
|
19
|
+
Then evaluate brutally:
|
|
20
|
+
- Does the page make the primary job obvious within 5 seconds?
|
|
21
|
+
- Is the main action visually and semantically dominant, or is it buried among equal-weight controls?
|
|
22
|
+
- Does the content shown match the user's intent, or is it filler, meta copy, marketing fluff, or generic component-library scaffolding?
|
|
23
|
+
- Are empty/loading/disconnected states still useful previews of the real product, or do they make the product look unfinished?
|
|
24
|
+
- Does the information architecture match the audience's mental model?
|
|
25
|
+
- Are trust-critical details visible before commitment: price, permissions, data source, provenance, verification, risk, status, ownership, or next steps?
|
|
26
|
+
- Does the design use the domain's natural artifacts? Examples: ledgers and receipts for finance, logs and deployments for devtools, product cards and checkout for ecommerce, source/code/examples for developer products, clinical clarity for health, creator/social proof for social products.
|
|
27
|
+
|
|
28
|
+
WHAT TO PUNISH:
|
|
29
|
+
- Vague dashboards that show containers instead of decisions.
|
|
30
|
+
- Copy that explains the UI rather than helping the user act.
|
|
31
|
+
- Equal-weight buttons for unequal actions.
|
|
32
|
+
- Generic empty states where real state previews, sample rows, setup checklists, or status timelines would communicate the product.
|
|
33
|
+
- Decorative graphics that block or distract from the job.
|
|
34
|
+
- Beautiful surfaces that do not clarify what the product does.
|
|
35
|
+
- Navigation chrome that feels more important than the workflow.
|
|
36
|
+
|
|
37
|
+
WHAT TO REWARD:
|
|
38
|
+
- One obvious primary action per page state.
|
|
39
|
+
- Real domain objects above the fold: deployments, jobs, payouts, orders, patients, tasks, files, incidents, products, conversations, etc.
|
|
40
|
+
- Clear state machines: draft → pending → active → failed → complete.
|
|
41
|
+
- Trust-building detail where risk exists.
|
|
42
|
+
- Progressive disclosure: simple first screen, serious detail available when needed.
|
|
43
|
+
- Visual hierarchy driven by the product model, not by arbitrary cards.
|
|
44
|
+
|
|
45
|
+
SCORING IMPACT:
|
|
46
|
+
- If users cannot tell what the product is for or what to do next, cap the page at 6 no matter how clean it looks.
|
|
47
|
+
- If the screen is visually polished but mostly generic scaffolding, cap it at 7.
|
|
48
|
+
- 8+ requires product specificity: the page must feel designed for this exact product, audience, and workflow.
|
|
@@ -6,6 +6,19 @@
|
|
|
6
6
|
* `~/.bad/rubrics/` for user fragments). No code changes required.
|
|
7
7
|
*/
|
|
8
8
|
import type { PageClassification, RubricFragment, ComposedRubric } from '../types.js';
|
|
9
|
+
import type { AudienceTag, ModalityTag, RegulatoryContextTag, AudienceVulnerabilityTag } from '../v2/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Operator-supplied context for Layer 6 composable predicate matching.
|
|
12
|
+
* When provided, fragments whose `applies-when.audience | modality |
|
|
13
|
+
* regulatoryContext | audienceVulnerability` overlap with these values are
|
|
14
|
+
* included in the composed rubric alongside the classification-matched set.
|
|
15
|
+
*/
|
|
16
|
+
export interface RubricContext {
|
|
17
|
+
audience?: AudienceTag[];
|
|
18
|
+
modality?: ModalityTag[];
|
|
19
|
+
regulatoryContext?: RegulatoryContextTag[];
|
|
20
|
+
audienceVulnerability?: AudienceVulnerabilityTag[];
|
|
21
|
+
}
|
|
9
22
|
/**
|
|
10
23
|
* Parse a markdown fragment file into a RubricFragment.
|
|
11
24
|
* Frontmatter format:
|
|
@@ -25,22 +38,29 @@ export declare function parseFragment(filePath: string): RubricFragment;
|
|
|
25
38
|
*/
|
|
26
39
|
export declare function loadFragments(dir?: string): RubricFragment[];
|
|
27
40
|
/**
|
|
28
|
-
* Predicate evaluator. Returns true if the fragment applies to the classification
|
|
41
|
+
* Predicate evaluator. Returns true if the fragment applies to the classification
|
|
42
|
+
* or the optional Layer 6 context (audience / modality / regulatoryContext /
|
|
43
|
+
* audienceVulnerability hints).
|
|
29
44
|
*
|
|
30
45
|
* Universal fragments always apply.
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* fragment's allowed set.
|
|
46
|
+
* Predicate groups are OR-combined at the group level: a fragment fires if ANY
|
|
47
|
+
* one of its predicate groups matches. Within a group, list membership is used
|
|
48
|
+
* (the classification/context value must appear in the fragment's allowed set).
|
|
49
|
+
*
|
|
50
|
+
* Layer 6 predicates are additive: they can cause a fragment to fire even when
|
|
51
|
+
* no type/domain predicate matches, enabling composition across independent
|
|
52
|
+
* predicate dimensions.
|
|
34
53
|
*/
|
|
35
|
-
export declare function fragmentApplies(fragment: RubricFragment, classification: PageClassification): boolean;
|
|
54
|
+
export declare function fragmentApplies(fragment: RubricFragment, classification: PageClassification, ctx?: RubricContext): boolean;
|
|
36
55
|
/**
|
|
37
56
|
* Compose a rubric from a classification.
|
|
38
57
|
*
|
|
39
58
|
* @param classification - the page classification
|
|
40
59
|
* @param fragments - all loaded fragments (defaults to builtin)
|
|
41
60
|
* @param userFragmentsDir - optional path to user-supplied fragments
|
|
61
|
+
* @param ctx - optional Layer 6 context for audience/modality/regulatory predicates
|
|
42
62
|
*/
|
|
43
|
-
export declare function composeRubric(classification: PageClassification, fragments?: RubricFragment[], userFragmentsDir?: string): ComposedRubric;
|
|
63
|
+
export declare function composeRubric(classification: PageClassification, fragments?: RubricFragment[], userFragmentsDir?: string, ctx?: RubricContext): ComposedRubric;
|
|
44
64
|
/**
|
|
45
65
|
* Compose a rubric from an explicit profile name (for `--profile` override).
|
|
46
66
|
* Loads only the matching type fragment + universal fragments.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/rubric/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/rubric/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,gBAAgB,CAAA;AAEvB;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,iBAAiB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC1C,qBAAqB,CAAC,EAAE,wBAAwB,EAAE,CAAA;CACnD;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAiB9D;AAkED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAA8B,GAAG,cAAc,EAAE,CAMnF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,kBAAkB,EAClC,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CA2CT;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,cAAc,EAAE,kBAAkB,EAClC,SAAS,CAAC,EAAE,cAAc,EAAE,EAC5B,gBAAgB,CAAC,EAAE,MAAM,EACzB,GAAG,CAAC,EAAE,aAAa,GAClB,cAAc,CAgChB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,cAAc,EAAE,GACnC,cAAc,CA0BhB"}
|