@agentikos/omega-os 0.1.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/LICENSE +21 -0
- package/README.md +127 -0
- package/bin/omega-os.js +48 -0
- package/bootstrap/lib/common.sh +73 -0
- package/bootstrap/lib/steps.sh +153 -0
- package/bootstrap/manifest.example.yaml +45 -0
- package/docs/ACCOUNT-AND-BILLING.md +95 -0
- package/docs/ARCHITECTURE.md +225 -0
- package/docs/AUTONOMOUS-AGENTS.md +128 -0
- package/docs/ENGINE-SPEC.md +174 -0
- package/docs/INSTALL.md +106 -0
- package/docs/MCP-AND-PLUGINS.md +121 -0
- package/docs/RUNTIME-PLAN.md +63 -0
- package/install.sh +54 -0
- package/omega/Agentik_Coding/README.md +21 -0
- package/omega/Agentik_Engine/README.md +58 -0
- package/omega/Agentik_Engine/omega_engine/__init__.py +58 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audit.py +96 -0
- package/omega/Agentik_Engine/omega_engine/audit_arsenal.py +314 -0
- package/omega/Agentik_Engine/omega_engine/barrier.py +45 -0
- package/omega/Agentik_Engine/omega_engine/bus.py +45 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +158 -0
- package/omega/Agentik_Engine/omega_engine/events.py +60 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +167 -0
- package/omega/Agentik_Engine/omega_engine/mission.py +145 -0
- package/omega/Agentik_Engine/omega_engine/progress.py +75 -0
- package/omega/Agentik_Engine/omega_engine/project.py +92 -0
- package/omega/Agentik_Engine/omega_engine/provider.py +139 -0
- package/omega/Agentik_Engine/omega_engine/reducer.py +76 -0
- package/omega/Agentik_Engine/omega_engine/report.py +146 -0
- package/omega/Agentik_Engine/omega_engine/router.py +34 -0
- package/omega/Agentik_Engine/omega_engine/store.py +97 -0
- package/omega/Agentik_Engine/omega_engine/supervisor.py +69 -0
- package/omega/Agentik_Engine/omega_engine/task.py +91 -0
- package/omega/Agentik_Engine/omega_engine/telegram.py +115 -0
- package/omega/Agentik_Engine/pyproject.toml +31 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_audit_arsenal.py +80 -0
- package/omega/Agentik_Engine/tests/test_executor.py +96 -0
- package/omega/Agentik_Engine/tests/test_mission.py +64 -0
- package/omega/Agentik_Engine/tests/test_progress.py +69 -0
- package/omega/Agentik_Engine/tests/test_project.py +61 -0
- package/omega/Agentik_Engine/tests/test_reducer.py +144 -0
- package/omega/Agentik_Engine/tests/test_report.py +88 -0
- package/omega/Agentik_Extra/README.md +37 -0
- package/omega/Agentik_Extra/etc/agentik.env.example +19 -0
- package/omega/Agentik_Extra/etc/structure.yaml +46 -0
- package/omega/Agentik_Orchestration/README.md +43 -0
- package/omega/Agentik_Orchestration/autonomous/README.md +29 -0
- package/omega/Agentik_Orchestration/autonomous/example-agents.yaml +85 -0
- package/omega/Agentik_Orchestration/educators/README.md +55 -0
- package/omega/Agentik_Orchestration/topologies/aisb-oracle-worker.yaml +42 -0
- package/omega/Agentik_Orchestration/verifier/audit-router.yaml +26 -0
- package/omega/Agentik_Providers/README.md +62 -0
- package/omega/Agentik_Providers/claude/accounts.example.yaml +28 -0
- package/omega/Agentik_Providers/registry.yaml +30 -0
- package/omega/Agentik_Runtime/README.md +30 -0
- package/omega/Agentik_SSOT/README.md +36 -0
- package/omega/Agentik_SSOT/VERSION +1 -0
- package/omega/Agentik_SSOT/audits/a11yaudit.yaml +69 -0
- package/omega/Agentik_SSOT/audits/apiaudit.yaml +71 -0
- package/omega/Agentik_SSOT/audits/automationaudit.yaml +77 -0
- package/omega/Agentik_SSOT/audits/codeaudit.yaml +63 -0
- package/omega/Agentik_SSOT/audits/copyaudit.yaml +68 -0
- package/omega/Agentik_SSOT/audits/dataaudit.yaml +76 -0
- package/omega/Agentik_SSOT/audits/debugaudit.yaml +75 -0
- package/omega/Agentik_SSOT/audits/dxaudit.yaml +78 -0
- package/omega/Agentik_SSOT/audits/featureaudit.yaml +73 -0
- package/omega/Agentik_SSOT/audits/flowaudit.yaml +72 -0
- package/omega/Agentik_SSOT/audits/logicaudit.yaml +75 -0
- package/omega/Agentik_SSOT/audits/motionaudit.yaml +67 -0
- package/omega/Agentik_SSOT/audits/perfaudit.yaml +71 -0
- package/omega/Agentik_SSOT/audits/refontaudit.yaml +77 -0
- package/omega/Agentik_SSOT/audits/retentionaudit.yaml +84 -0
- package/omega/Agentik_SSOT/audits/secaudit.yaml +73 -0
- package/omega/Agentik_SSOT/audits/seoaudit.yaml +75 -0
- package/omega/Agentik_SSOT/audits/uiuxaudit.yaml +61 -0
- package/omega/Agentik_SSOT/mcp/mcp-catalog.yaml +136 -0
- package/omega/Agentik_SSOT/rules/constitution.md +44 -0
- package/omega/Agentik_SSOT/schemas/event.schema.json +45 -0
- package/omega/Agentik_SSOT/schemas/task.schema.json +54 -0
- package/omega/Agentik_Tools/README.md +42 -0
- package/omega/Agentik_Tools/registry.json +15 -0
- package/package.json +43 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# flowaudit — Quality Arsenal definition for OmegaOS.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: flowaudit
|
|
6
|
+
domain: flows
|
|
7
|
+
question: "Does the experience WORK — can a user complete every journey without getting lost or stuck?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*"]
|
|
14
|
+
|
|
15
|
+
# GATHER — deterministic flow-shape detectors, run first, no LLM. Machine-checkable signals.
|
|
16
|
+
gather:
|
|
17
|
+
- name: routes
|
|
18
|
+
cmd: "find {path} -type f \\( -path '*app/*page.tsx' -o -path '*app/*page.jsx' -o -path '*pages/*' \\) 2>/dev/null || true"
|
|
19
|
+
when: "*.tsx,*.jsx,*.ts,*.js"
|
|
20
|
+
- name: noop-handlers
|
|
21
|
+
cmd: "grep -rnE 'on(Click|Submit)=\\{?\\(\\s*\\)\\s*=>\\s*\\{?\\s*\\}|href=[\"'\\'']#[\"'\\'']' {path} || true"
|
|
22
|
+
when: "*.tsx,*.jsx"
|
|
23
|
+
- name: empty-state-markers
|
|
24
|
+
cmd: "grep -rnE 'No items|No results|Nothing (here|found)|empty|Empty' {path} || true"
|
|
25
|
+
when: "*.tsx,*.jsx"
|
|
26
|
+
- name: error-boundaries
|
|
27
|
+
cmd: "grep -rnE 'ErrorBoundary|error\\.tsx|not-found\\.tsx|catch\\s*\\(' {path} || true"
|
|
28
|
+
when: "*.tsx,*.jsx,*.ts"
|
|
29
|
+
|
|
30
|
+
# PHASES — the agentic falsification pass investigates each. Flow-prosecutor scrutiny.
|
|
31
|
+
phases:
|
|
32
|
+
- id: hinge-flow
|
|
33
|
+
checks: "Identify the ONE journey that — if broken — makes the product worthless (signup->activation, purchase->delivery); audit it with 10x scrutiny end-to-end."
|
|
34
|
+
- id: flow-completeness
|
|
35
|
+
checks: "Every flow has a reachable entry, every step a clear single CTA and visible progress, a confirmed success state, and a sane next action — no flow that starts but cannot finish."
|
|
36
|
+
- id: state-machines
|
|
37
|
+
checks: "Every entity's lifecycle states are explicit, transitions guarded (no draft->completed skip), invalid transitions rejected not silently corrupting, no entity can get permanently stuck."
|
|
38
|
+
- id: happy-path
|
|
39
|
+
checks: "Walk each primary journey — data entered in step 1 survives to step 5, every action acknowledged under 100ms, the result is visible afterward in the dashboard/list."
|
|
40
|
+
- id: error-paths
|
|
41
|
+
checks: "For every flow exercise the dark paths — empty/invalid/boundary input, API failure mid-flow, slow/garbage responses, permission loss, double-submit; each handled gracefully."
|
|
42
|
+
- id: dead-ends
|
|
43
|
+
checks: "No state with no way out — unclosable modals, error pages with no home link, success pages with no next step, 'Processing...' that never resolves, empty results with no guidance."
|
|
44
|
+
- id: permission-auth-gaps
|
|
45
|
+
checks: "Every protected route redirects unauthenticated users and denies wrong roles; no IDOR via URL ID tampering; admin checks enforced server-side not just hidden in UI; session expiry handled."
|
|
46
|
+
- id: onboarding
|
|
47
|
+
checks: "First-run shows a guided path not an empty dashboard; the shortest path to the activation 'aha' action; empty states teach the user to create their first item."
|
|
48
|
+
- id: data-integrity
|
|
49
|
+
checks: "Input -> storage -> display roundtrip is identical (special chars, emoji, numbers, timezones); data created in flow A visible in flow B; deletes clean up all references."
|
|
50
|
+
- id: cross-session-continuity
|
|
51
|
+
checks: "Close/reopen browser preserves state, long flows resume rather than restart, real-time sync across tabs/users, active flows survive a deploy or migration."
|
|
52
|
+
- id: error-recovery
|
|
53
|
+
checks: "After a validation/network/payment error — form values preserved, focus on the errored field, actionable message, retry without double-charge; destructive actions undoable."
|
|
54
|
+
- id: notification-feedback
|
|
55
|
+
checks: "Every action gets a proportional reaction — no silent success, no silent failure, no state change without notice; progress communicated for long/background operations."
|
|
56
|
+
- id: empty-and-loading-states
|
|
57
|
+
checks: "Every list/table/dashboard has a designed zero-data state with a CTA, a layout-shaped loading skeleton, a styled error state with retry — never a blank or collapsed layout."
|
|
58
|
+
- id: destructive-actions
|
|
59
|
+
checks: "Delete/cancel/disconnect have a consequence-explaining confirmation, the confirm button is not the default, reversibility or clear irreversible warning, cascade effects disclosed."
|
|
60
|
+
- id: flow-entropy
|
|
61
|
+
checks: "Similar flows structured alike, same action same verb everywhere, back always means back, one consistent pattern for success/error/loading, no terminology drift."
|
|
62
|
+
|
|
63
|
+
falsification: >
|
|
64
|
+
The user is always lost; every button is a promise — FALSIFY each. Click
|
|
65
|
+
"Save": was data actually persisted? "Cancel anytime": can you cancel at every
|
|
66
|
+
point? Every PASS must cite at least 3 concrete checks (the route walked, the
|
|
67
|
+
state in the DB, the screenshot of the step). Categorise findings as
|
|
68
|
+
LABEL-vs-ACTION, PROMISE-vs-EXPERIENCE, STATE-vs-DISPLAY, or FEEDBACK-vs-TRUTH.
|
|
69
|
+
Happy paths are marketing; error paths, edge cases and permission denials are
|
|
70
|
+
reality — an untested dark path is an untested flow. Bias toward FAIL.
|
|
71
|
+
|
|
72
|
+
fix_loop: true
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# logicaudit — OmegaOS Quality Arsenal definition.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: logicaudit
|
|
6
|
+
domain: logic
|
|
7
|
+
question: "Where is the system fighting itself — wasted computation, redundant paths, the wrong amount of engineering?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*.ts", "*.tsx", "*.js", "*.jsx", "*.py", "*.go", "*.rs", "*.sh"]
|
|
14
|
+
|
|
15
|
+
# GATHER — deterministic tools, run first, no LLM. Machine-checkable findings.
|
|
16
|
+
gather:
|
|
17
|
+
- name: complexity-census
|
|
18
|
+
cmd: "for f in {path}; do c=$(grep -cE '(if |else|switch|case |for |while |&&|\\|\\||try|catch|\\?)' \"$f\" 2>/dev/null); echo \"$c $f\"; done | sort -rn | head -30 || true"
|
|
19
|
+
when: "*.ts,*.tsx,*.js,*.jsx,*.py,*.sh"
|
|
20
|
+
- name: monster-files
|
|
21
|
+
cmd: "wc -l {path} 2>/dev/null | sort -rn | awk '$1>500' || true"
|
|
22
|
+
when: "*.ts,*.tsx,*.js,*.jsx,*.py,*.go,*.rs,*.sh"
|
|
23
|
+
- name: deep-nesting
|
|
24
|
+
cmd: "grep -nE '^[[:space:]]{20,}[^[:space:]]' {path} 2>/dev/null | head -25 || true"
|
|
25
|
+
when: "*.ts,*.tsx,*.js,*.jsx,*.py"
|
|
26
|
+
- name: dead-exports
|
|
27
|
+
cmd: "npx --no-install ts-prune 2>/dev/null || true"
|
|
28
|
+
when: "*.ts,*.tsx"
|
|
29
|
+
- name: deep-clone-misuse
|
|
30
|
+
cmd: "grep -rnE 'JSON\\.parse\\(JSON\\.stringify\\(' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' {path} || true"
|
|
31
|
+
when: "*.ts,*.tsx,*.js,*.jsx"
|
|
32
|
+
|
|
33
|
+
# PHASES — the agentic falsification pass investigates each, domain-specific.
|
|
34
|
+
phases:
|
|
35
|
+
- id: redundant-logic
|
|
36
|
+
checks: "Semantically identical logic in 3+ places; checks repeated across middleware/handler/service (blurs who owns validation); overlapping modules; chained data transforms; self-defeating logic (cache invalidated before read)."
|
|
37
|
+
- id: algorithmic-efficiency
|
|
38
|
+
checks: "Real Big-O of every loop/recursion; O(n^2) hidden as Array.find inside Array.map; N+1 query/fetch patterns; unnecessary computation (sort just to test existence); string concat / regex compile in loops."
|
|
39
|
+
- id: pipeline-efficiency
|
|
40
|
+
checks: "Sum of step times vs total pipeline time — overhead >50% means the pipeline design IS the bug; sequential steps with no data dependency; stages producing output nobody reads; restart-from-stage-1 vs checkpoint."
|
|
41
|
+
- id: orchestration-overhead
|
|
42
|
+
checks: "Hop count user→result — which hops are essential vs ceremony; dispatch overhead vs task size (task < dispatch cost → do it in-place); intent preserved or diluted per hop; coordination tax in multi-agent work."
|
|
43
|
+
- id: abstraction-fit
|
|
44
|
+
checks: "Over-abstraction (factory with one type, plugin system with one plugin, GenericHandler<T> always string); under-abstraction (15 lines copy-pasted 8×); wrong abstraction (UserService doing auth+billing+notifications)."
|
|
45
|
+
- id: state-machines
|
|
46
|
+
checks: "Implicit state from combined booleans (isLoading+hasError+isReady = impossible combos); states that CAN be represented but are impossible WILL be reached; missing transitions (Loading with no path to Error)."
|
|
47
|
+
- id: data-flow-entropy
|
|
48
|
+
checks: "Single source of truth per datum (same data in DB + local state + URL = 3 truths); transformation chain length; data duplication without sync; prop drilling through components that never use it; stale-data patterns."
|
|
49
|
+
- id: caching-intelligence
|
|
50
|
+
checks: "Missing caches (pure function re-called with same inputs, static reference data re-queried); ineffective caches (2% hit rate = wrong key granularity); invalidation correctness; caching at the right layer."
|
|
51
|
+
- id: parallelization-gaps
|
|
52
|
+
checks: "Independent ops awaited serially instead of Promise.all; N individual calls that should be one batch; load-everything-then-process instead of streaming; worker pool sized wrong for wait/compute ratio."
|
|
53
|
+
- id: config-complexity
|
|
54
|
+
checks: "Total config surface vs how many values are EVER changed from default; same value defined in .env AND config AND CLI AND default with undocumented precedence; invalid config caught at startup not first request."
|
|
55
|
+
- id: error-logic
|
|
56
|
+
checks: "Swallowed errors (empty catch, .catch(()=>null)); error info loss (rethrow as generic 'something went wrong', logged at INFO); retry on non-transient 4xx; retry without backoff/idempotency/ceiling; wrong fallback values."
|
|
57
|
+
- id: decision-tree-pruning
|
|
58
|
+
checks: "Arrow anti-pattern (if→if→if→if→logic) — flatten with guard clauses; 40-case switch that should be a lookup map; feature flags always-ON or always-OFF; routing that could be a simple table."
|
|
59
|
+
- id: over-engineering
|
|
60
|
+
checks: "Unused flexibility (EventEmitter with one listener, strategy pattern with one strategy); premature optimization; architecture astronautics (microservices for one dev, event sourcing for CRUD); speculative generality."
|
|
61
|
+
- id: under-engineering
|
|
62
|
+
checks: "Missing validation at boundaries (user input reaches DB unsanitized); missing error boundaries (one component crash kills the page); missing observability on critical paths; complex algorithm with zero comments."
|
|
63
|
+
- id: dead-logic
|
|
64
|
+
checks: "Unreachable code after return/throw; branches guarded by always-true/false conditions; functions defined-never-called-not-exported; dead feature flags; commented-out code blocks; unused imports/variables."
|
|
65
|
+
|
|
66
|
+
falsification: >
|
|
67
|
+
Complexity is guilt until proven innocent — every abstraction, config layer and
|
|
68
|
+
indirection must justify its existence with measurement or be eliminated. Every
|
|
69
|
+
optimization claim is a hypothesis: "this cache speeds it up" → prove it with hit-rate
|
|
70
|
+
numbers; "this abstraction reduces complexity" → count lines/branches before and after.
|
|
71
|
+
Categorise findings as CLAIM-vs-MEASUREMENT, ABSTRACTION-vs-USAGE, CACHE-vs-FRESHNESS,
|
|
72
|
+
PARALLEL-vs-SEQUENTIAL, RETRY-vs-IDEMPOTENT, or CONFIG-vs-HARDCODE. An optimization with
|
|
73
|
+
no measurable improvement is a failed hypothesis — revert it.
|
|
74
|
+
|
|
75
|
+
fix_loop: true
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# motionaudit — Quality Arsenal definition for OmegaOS.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: motionaudit
|
|
6
|
+
domain: motion
|
|
7
|
+
question: "Does it MOVE with purpose — does every animation earn its place and run at 60fps?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*.tsx", "*.jsx", "*.css", "*.ts"]
|
|
14
|
+
|
|
15
|
+
# GATHER — one cheap deterministic signal: properties animated. The compositor rule
|
|
16
|
+
# (only transform/opacity are free) IS machine-checkable. Everything else needs the LLM.
|
|
17
|
+
gather:
|
|
18
|
+
- name: layout-paint-animation
|
|
19
|
+
cmd: "grep -rnE 'transition[^;]*(width|height|margin|padding|top|left|right|bottom|font-size|box-shadow|background-color)|animation:[^;]*(width|height|margin|padding|top|left)' {path} || true"
|
|
20
|
+
when: "*.css,*.tsx,*.jsx"
|
|
21
|
+
- name: reduced-motion
|
|
22
|
+
cmd: "grep -rn 'prefers-reduced-motion' {path} || true"
|
|
23
|
+
when: "*.css,*.tsx,*.jsx,*.ts"
|
|
24
|
+
|
|
25
|
+
# PHASES — the agentic falsification pass investigates each. Motion-designer scrutiny.
|
|
26
|
+
phases:
|
|
27
|
+
- id: motion-inventory
|
|
28
|
+
checks: "Catalog every animation — CSS transitions/keyframes, JS-driven (rAF, Web Animations API, GSAP, Framer Motion), scroll-driven, canvas/WebGL — with element, trigger, properties, duration, easing."
|
|
29
|
+
- id: purpose-verification
|
|
30
|
+
checks: "The hinge — apply the Purpose Test to each animation: does it COMMUNICATE state/causality, ORIENT the user, or CREATE meaning? Remove it mentally — if nothing is lost, it is PURPOSELESS."
|
|
31
|
+
- id: easing-system
|
|
32
|
+
checks: "Easing as a vocabulary — enters decelerate (ease-out), exits accelerate (ease-in); count unique curves; are they named tokens or arbitrary per-component cubic-beziers?"
|
|
33
|
+
- id: duration-consistency
|
|
34
|
+
checks: "Durations on a systematic scale (tokens), each in its appropriate range — micro 80-150ms, entrances 200-400ms, exits faster than entrances; total entry choreography under 800ms."
|
|
35
|
+
- id: choreography
|
|
36
|
+
checks: "Page entrances introduce themselves as a sequence following content hierarchy with consistent stagger; exits are swift and directional; state transitions communicate spatial relationships."
|
|
37
|
+
- id: scroll-animations
|
|
38
|
+
checks: "No scroll hijacking, user controls pace, gentle parallax (10-30%), progress-linked not fire-and-forget, passive listeners, IntersectionObserver unobserved after firing."
|
|
39
|
+
- id: page-transitions
|
|
40
|
+
checks: "Route changes animate with directional logic rather than hard-cut, shared-element continuity where possible, View Transitions API where supported, no long blank screens."
|
|
41
|
+
- id: micro-interactions
|
|
42
|
+
checks: "Every interactive element responds to hover/focus/press with physical feedback (translate/scale, not color-only), consistent timing, popovers appear FROM their trigger."
|
|
43
|
+
- id: loading-skeleton
|
|
44
|
+
checks: "Loading states are skeletons matching final layout (not bare spinners), shimmer is CSS-only, progressive reveal, smooth skeleton-to-content transition."
|
|
45
|
+
- id: webgl-canvas
|
|
46
|
+
checks: "WebGL/P5 justified over CSS, 60fps desktop / 30fps mobile, tiered fallback (WebGL2/WebGL1/static), lazy-loaded, geometries/textures disposed on unmount, paused when off-screen."
|
|
47
|
+
- id: css-performance
|
|
48
|
+
checks: "Animations use ONLY transform and opacity — animating width/height/margin/box-shadow triggers layout or paint; will-change used sparingly; no read-write-read forced reflow in loops."
|
|
49
|
+
- id: reduced-motion
|
|
50
|
+
checks: "prefers-reduced-motion is a designed alternative not a nuclear kill-all — state changes still visible (modal still opens instantly), ambient motion pausable, interaction never blocked."
|
|
51
|
+
- id: mobile-motion
|
|
52
|
+
checks: "Touch-specific :active feedback (not repurposed hover), gesture physics with momentum, safe-area respect, rAF paused when hidden, 30fps minimum under 4x CPU throttle."
|
|
53
|
+
- id: motion-meaning-gap
|
|
54
|
+
checks: "The absence of motion is a finding — list added/removed, counter updates, tab switches, accordions, filtering, sorting that hard-cut where a transition should communicate the change."
|
|
55
|
+
- id: motion-excess
|
|
56
|
+
checks: "Animations that harm — competing simultaneous motion, entrances over 600ms, distracting loops near text, redundant nested animations, gratuitous WebGL that could be CSS."
|
|
57
|
+
|
|
58
|
+
falsification: >
|
|
59
|
+
Every animation is guilty until proven purposeful. "It looks cool" is not a
|
|
60
|
+
reason — FALSIFY each animation's justification: what does the user understand
|
|
61
|
+
faster because of this motion? Every PASS must cite at least 3 concrete checks
|
|
62
|
+
(the grepped property, the measured duration, the frame trace). Categorise
|
|
63
|
+
findings as PURPOSE-vs-DECORATION, SYSTEM-vs-RANDOM, COMPOSITED-vs-EXPENSIVE,
|
|
64
|
+
or PRESENT-vs-MISSING. A page with one perfectly timed animation beats a page
|
|
65
|
+
with twelve good ones. Bias toward FAIL.
|
|
66
|
+
|
|
67
|
+
fix_loop: true
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# perfaudit — OmegaOS Quality Arsenal definition.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: perfaudit
|
|
6
|
+
domain: performance
|
|
7
|
+
question: "Is it FAST ENOUGH for humans to care — or does it bleed milliseconds nobody measured?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*.ts", "*.tsx", "*.js", "*.jsx", "*.css", "*.scss", "*.html", "*.py", "*.sql", "*.png", "*.jpg", "*.jpeg", "*.svg"]
|
|
14
|
+
|
|
15
|
+
# GATHER — deterministic tools, run first, no LLM. Machine-checkable findings.
|
|
16
|
+
gather:
|
|
17
|
+
- name: lighthouse
|
|
18
|
+
cmd: "npx --no-install lighthouse {path} --only-categories=performance --output=json --quiet --chrome-flags='--headless --no-sandbox' || true"
|
|
19
|
+
when: "*.html,*.tsx,*.jsx"
|
|
20
|
+
- name: build-size
|
|
21
|
+
cmd: "du -sh .next dist build out 2>/dev/null | sort -rh || true"
|
|
22
|
+
when: "*"
|
|
23
|
+
- name: largest-bundles
|
|
24
|
+
cmd: "find .next dist build out -name '*.js' -type f 2>/dev/null -exec du -h {} + | sort -rh | head -25 || true"
|
|
25
|
+
when: "*.ts,*.tsx,*.js,*.jsx"
|
|
26
|
+
- name: heavy-assets
|
|
27
|
+
cmd: "find . -path ./node_modules -prune -o -type f \\( -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' \\) -size +200k -print -exec du -h {} + 2>/dev/null | sort -rh | head -25 || true"
|
|
28
|
+
when: "*.png,*.jpg,*.jpeg,*.svg,*.tsx,*.jsx"
|
|
29
|
+
- name: barrel-imports
|
|
30
|
+
cmd: "grep -rnE \"import +(\\* as )?[A-Za-z_]+ +from +['\\\"](lodash|moment|date-fns|rxjs|@mui/material|antd)['\\\"]\" --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' {path} || true"
|
|
31
|
+
when: "*.ts,*.tsx,*.js,*.jsx"
|
|
32
|
+
|
|
33
|
+
# PHASES — the agentic falsification pass investigates each, domain-specific.
|
|
34
|
+
phases:
|
|
35
|
+
- id: core-web-vitals
|
|
36
|
+
checks: "Measure LCP (<2.5s), INP (<200ms), CLS (<0.1), TTFB (<800ms), FCP (<1.8s) on the hinge page; re-run throttled at 3G + 4x CPU and watch the score collapse."
|
|
37
|
+
- id: bundle-bloat
|
|
38
|
+
checks: "Total initial JS compressed (<200KB target); barrel imports pulling whole libraries; duplicate deps at multiple versions; source maps shipped to prod."
|
|
39
|
+
- id: render-path
|
|
40
|
+
checks: "Render-blocking CSS/scripts in the critical path; unnecessary React re-renders; layout thrashing (read-write-read); long tasks >50ms blocking interactivity."
|
|
41
|
+
- id: js-execution
|
|
42
|
+
checks: "Parse cost per bundle; hydration time and mismatch errors; un-throttled scroll/resize handlers; async waterfalls that should be Promise.all."
|
|
43
|
+
- id: image-optimization
|
|
44
|
+
checks: "PNG/JPEG where WebP/AVIF saves 60-80%; images larger than display size; missing width/height (CLS); missing lazy-loading below the fold; missing fetchpriority on the LCP image."
|
|
45
|
+
- id: font-loading
|
|
46
|
+
checks: "WOFF2 used and subset to used glyphs; font-display:swap to prevent FOIT; critical fonts preloaded; layout shift when the web font swaps in."
|
|
47
|
+
- id: caching-strategy
|
|
48
|
+
checks: "Cache-Control + immutable on fingerprinted assets; repeated identical API calls that should be memoized/SWR-cached; deploy invalidates stale CSS/JS hashes."
|
|
49
|
+
- id: ssr-ssg-strategy
|
|
50
|
+
checks: "Each route uses the right rendering mode (SSR/SSG/ISR/CSR); static pages wrongly rendered per-request; SSR data fetching serial instead of parallel; streaming used for TTFB."
|
|
51
|
+
- id: code-splitting
|
|
52
|
+
checks: "Route-based and component-based splitting working; vendor/framework chunks separated; heavy components (charts, editors, maps) lazy-loaded behind dynamic import."
|
|
53
|
+
- id: api-response-times
|
|
54
|
+
checks: "Per-endpoint average <200ms and P95 <1s; over-fetching unused fields; sequential dependent calls on page load; missing pagination on list endpoints."
|
|
55
|
+
- id: n-plus-one
|
|
56
|
+
checks: "Same query template fired in a loop with different params; ORM relationships lacking eager loading; SELECT * where columns suffice; total queries per page load >10."
|
|
57
|
+
- id: db-query-performance
|
|
58
|
+
checks: "Queries >100ms; full table scans from missing indexes; joins/sorts without supporting indexes; large result sets without LIMIT; connection pool sized for concurrency."
|
|
59
|
+
- id: memory-leaks
|
|
60
|
+
checks: "Heap growth over time; detached DOM nodes; event listeners/timers/intervals/sockets never cleaned on unmount; unbounded caches and history stacks."
|
|
61
|
+
- id: resource-hints-third-party
|
|
62
|
+
checks: "LCP image and critical fonts preloaded; preconnect/dns-prefetch for third-party origins; render-blocking third-party scripts that could be deferred or facade-loaded."
|
|
63
|
+
|
|
64
|
+
falsification: >
|
|
65
|
+
Lighthouse scores lie — every green score must be re-verified throttled (3G + 4x CPU,
|
|
66
|
+
cold cache) and twice to rule out a one-off blip. Categorise findings as SCORE-vs-REALITY,
|
|
67
|
+
LAB-vs-FIELD, FIRST-vs-REPEAT, or AVERAGE-vs-P95. Every PASS cites ≥3 concrete
|
|
68
|
+
measurements with actual numbers. "It's fast for me" (warm cache, fast machine) is not
|
|
69
|
+
evidence. Bias toward FAIL — a 100 is earned, never assumed.
|
|
70
|
+
|
|
71
|
+
fix_loop: true
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# refontaudit — Quality Arsenal definition for OmegaOS.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
#
|
|
5
|
+
# Note: refontaudit is a senior REDESIGN engine, not a defect hunter. It observes
|
|
6
|
+
# what exists, classifies every screen KEEP/IMPROVE/RETHINK/KILL, and proposes the
|
|
7
|
+
# 3-5 evolution changes that resolve 80% of friction. Evolution beats revolution —
|
|
8
|
+
# touch the least, impact the most. "PASS" here means a ship-ready, data-grounded,
|
|
9
|
+
# confidence-scored refonte plan, not zero findings.
|
|
10
|
+
|
|
11
|
+
id: refontaudit
|
|
12
|
+
domain: redesign
|
|
13
|
+
question: "Is there a ship-ready refonte plan — does it preserve what works and fix only what data proves broken?"
|
|
14
|
+
weight: 1.0
|
|
15
|
+
threshold: 85
|
|
16
|
+
|
|
17
|
+
applies_to:
|
|
18
|
+
roles: [worker]
|
|
19
|
+
changed: ["*.tsx", "*.jsx", "*.css", "*.html", "*.vue"]
|
|
20
|
+
|
|
21
|
+
# GATHER — git churn is a real deterministic hotspot signal (files changed most = most problematic).
|
|
22
|
+
# Component/route inventory grounds the Keep Audit. No tool can decide KEEP vs RETHINK — the LLM does.
|
|
23
|
+
gather:
|
|
24
|
+
- name: churn-hotspots
|
|
25
|
+
cmd: "git -C {path} log --since='6 months ago' --pretty=format: --name-only --diff-filter=M 2>/dev/null | grep -E 'app/|pages/|components/' | sort | uniq -c | sort -rn | head -30 || true"
|
|
26
|
+
when: "*"
|
|
27
|
+
- name: shadcn-usage
|
|
28
|
+
cmd: "grep -rl '@/components/ui' {path} 2>/dev/null || true"
|
|
29
|
+
when: "*.tsx,*.jsx"
|
|
30
|
+
- name: routes
|
|
31
|
+
cmd: "find {path} -type f \\( -path '*app/*page.tsx' -o -path '*pages/*' \\) 2>/dev/null || true"
|
|
32
|
+
when: "*.tsx,*.jsx,*.ts,*.js"
|
|
33
|
+
|
|
34
|
+
# PHASES — the agentic pass works each. Senior lead-dev + UX-designer judgment.
|
|
35
|
+
phases:
|
|
36
|
+
- id: inventory
|
|
37
|
+
checks: "Crawl every route in scope, screenshot at 1440/1024/375px, map shadcn usage, extract font stack and palette; under 3 routes or no shadcn means wrong project — abort."
|
|
38
|
+
- id: current-ia
|
|
39
|
+
checks: "Build the IA tree (sidebar -> pages -> sub-pages -> modals), classify each screen (list/detail/form/overview/settings/empty), flag orphaned screens and nav-to-nothing stubs."
|
|
40
|
+
- id: current-flows
|
|
41
|
+
checks: "Trace the top 5 user intents from dashboard to completed action; count clicks to primary action, context switches, waiting states; mark friction (>3 clicks, modal-in-modal, full reloads)."
|
|
42
|
+
- id: density-hierarchy
|
|
43
|
+
checks: "Per top-level screen measure items-per-viewport, visual hierarchy depth, primary-action clarity (yes/no/ambiguous), whitespace ratio — density is a feature only with clear hierarchy."
|
|
44
|
+
- id: data-collection
|
|
45
|
+
checks: "Read real data before redesigning — Linear ticket hotspots per page, console-error hotspots, analytics if configured, git-churn hotspots; the top 3 pages are the priority targets."
|
|
46
|
+
- id: user-story-mining
|
|
47
|
+
checks: "Extract 10 user stories (as-a/I-want/so-that) with frequency and friction; prioritize by frequency x friction into P1/P2/P3; this list drives every later proposal."
|
|
48
|
+
- id: keep-audit
|
|
49
|
+
checks: "The hinge of restraint — classify EVERY screen KEEP (works, untouchable) / IMPROVE (good bones, targeted change) / RETHINK (wrong approach) / KILL (no story, no traffic, orphan)."
|
|
50
|
+
- id: clarity-gate
|
|
51
|
+
checks: "5-second Gestalt test per screen — can the user answer 'what is this page for?' and 'what is the primary action?'; score pass/partial/fail; compute current clarity percentage."
|
|
52
|
+
- id: hypothesis-falsification
|
|
53
|
+
checks: "Generate 3 data-grounded hypotheses for why the design fails (worst ticket-hotspot page, worst-friction P1 story, worst clarity screen); only hypotheses that survive falsification become rationale."
|
|
54
|
+
- id: pattern-mapping
|
|
55
|
+
checks: "For each high-friction P1/P2 story match a proven pattern from real reference products (Linear/Vercel/Stripe), grounded in the user story it serves — not 'it looks nice'; flag gaps needing custom solutions."
|
|
56
|
+
- id: ia-proposal
|
|
57
|
+
checks: "The hinge — name the 3-5 specific evolution changes resolving 80% of friction (each citing a user story + data + reference); never change the nav model unless >50% of screens are RETHINK."
|
|
58
|
+
- id: workflow-redesign
|
|
59
|
+
checks: "For each P1 story show before/after click count and context switches with happy path plus 2 edge cases; redesign only flows touching IMPROVE/RETHINK screens, never KEEP screens."
|
|
60
|
+
- id: component-composition
|
|
61
|
+
checks: "Map each new/improved page to a real shadcn component tree with typed composite interfaces; KEEP screens get no new components — this prevents 'while we're here' scope creep."
|
|
62
|
+
- id: interaction-state-model
|
|
63
|
+
checks: "Define keyboard grammar, hover/focus rules, empty/loading/error patterns, and the state architecture (URL vs server vs UI vs selection) so shared links and the back button restore exact state."
|
|
64
|
+
- id: hinge-stress-test
|
|
65
|
+
checks: "Stress the top 3 proposed changes against 10 scenarios — new user/0 data, power user/10k items keyboard-only, mobile 375px, dark mode, long names, RTL, offline, interruption, screen reader, 1000-item lists."
|
|
66
|
+
|
|
67
|
+
falsification: >
|
|
68
|
+
A refonte without user stories is decoration; without data is guessing;
|
|
69
|
+
without a Keep Audit is vandalism. FALSIFY every proposal — it must trace to a
|
|
70
|
+
P1/P2 user story AND a measured hotspot, or its confidence collapses. Evolution
|
|
71
|
+
beats revolution: a senior never reaches for revolution first. Categorise gaps
|
|
72
|
+
as KEEP-TOUCHED (a working screen was redesigned — automatic fail),
|
|
73
|
+
STORYLESS-PROPOSAL (change serving no user story), or HINGE-UNPROVEN (the
|
|
74
|
+
3-5 changes failed 2+ of the 10 scenarios). Every proposal carries an honest
|
|
75
|
+
confidence score — nothing is 100%, senior humility. Bias toward FAIL.
|
|
76
|
+
|
|
77
|
+
fix_loop: true
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# retentionaudit — Quality Arsenal definition for OmegaOS.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
#
|
|
5
|
+
# READ-ONLY: this audit PROPOSES retention opportunities (RICE x Fogg scored),
|
|
6
|
+
# it never edits source. fix_loop is false — output hands off to /planner.
|
|
7
|
+
|
|
8
|
+
id: retentionaudit
|
|
9
|
+
domain: retention
|
|
10
|
+
question: "What would the CPO of a $1B SaaS find that we MISSED to make users stay 3x longer?"
|
|
11
|
+
weight: 1.0
|
|
12
|
+
threshold: 85
|
|
13
|
+
|
|
14
|
+
applies_to:
|
|
15
|
+
roles: [worker]
|
|
16
|
+
changed: ["*"]
|
|
17
|
+
|
|
18
|
+
# GATHER — deterministic retention-surface detectors, run first, no LLM. Machine-checkable findings.
|
|
19
|
+
gather:
|
|
20
|
+
- name: routes
|
|
21
|
+
cmd: "find {path} -path '*/node_modules' -prune -o -type f \\( -name 'page.tsx' -o -name 'route.ts' -o -name '+page.svelte' \\) -print || true"
|
|
22
|
+
when: "*"
|
|
23
|
+
- name: empty-states
|
|
24
|
+
cmd: "grep -rnE 'isEmpty|hasNoData|emptyState|EmptyState|no items|nothing yet|aucun' {path} || true"
|
|
25
|
+
when: "*.tsx,*.jsx,*.vue,*.svelte"
|
|
26
|
+
- name: notification-triggers
|
|
27
|
+
cmd: "grep -rniE 'resend|sendgrid|onesignal|postmark|trigger\\.dev|sendNotification|sendEmail' {path} || true"
|
|
28
|
+
when: "*"
|
|
29
|
+
- name: hooked-mechanisms
|
|
30
|
+
cmd: "grep -rniE 'streak|achievement|milestone|reward|badge|digest|weekly report' {path} || true"
|
|
31
|
+
when: "*"
|
|
32
|
+
- name: invite-share
|
|
33
|
+
cmd: "grep -rniE 'invite|share|inviteLink|shareUrl|copyLink|referral' {path} || true"
|
|
34
|
+
when: "*"
|
|
35
|
+
- name: keyboard-shortcuts
|
|
36
|
+
cmd: "grep -rniE 'useHotkeys|cmdK|cmd\\+k|ctrl\\+|<kbd' {path} || true"
|
|
37
|
+
when: "*"
|
|
38
|
+
|
|
39
|
+
# PHASES — the agentic falsification pass investigates each.
|
|
40
|
+
# Four expert lenses are applied across the phases: Hooked (Eyal), JTBD
|
|
41
|
+
# (Christensen), Power of Moments (Heath), Fogg B=MAT.
|
|
42
|
+
phases:
|
|
43
|
+
- id: hinge-capability
|
|
44
|
+
checks: "THE HINGE — identify the ONE experience that must be world-class for users to stay; compare STATED hinge (copy) vs OBSERVED hinge (where code/commits invest); a divergence is the single most damaging retention bug."
|
|
45
|
+
- id: user-journey
|
|
46
|
+
checks: "Trace every screen from sign-up to power-user; map transitions, entry and exit conditions; this journey feeds the drop-off forensics."
|
|
47
|
+
- id: drop-off-forensics
|
|
48
|
+
checks: "Per screen identify likely churn triggers — unvalidated forms, loaders without progress, blank empty states, blocking modals, auth/pricing walls before perceived value."
|
|
49
|
+
- id: aha-moment-latency
|
|
50
|
+
checks: "Identify the moment a new user goes 'now I get it'; how many steps from signup to aha; what blocks the users who never reach it."
|
|
51
|
+
- id: hooked-loops
|
|
52
|
+
checks: "Eyal lens — for each retention-driving feature score the 4 elements Trigger/Action/Variable-Reward/Investment; 4/4 strong, <=2/4 no loop."
|
|
53
|
+
- id: jobs-to-be-done
|
|
54
|
+
checks: "Christensen lens — per persona surface 3-5 jobs ('When [situation] I want to [job] so I can [outcome]'); does the product serve each job, or does the user hire a competitor/workaround?"
|
|
55
|
+
- id: personalization-debt
|
|
56
|
+
checks: "Per screen/feed/list — is order user-specific or global, are recommendations history-based, are defaults adapted (timezone, recently-used); generic feed = anyone could leave."
|
|
57
|
+
- id: onboarding-completeness
|
|
58
|
+
checks: "The first 7 days set LTV — welcome/checklist, first-task guidance, teaching empty states, day-1/3/7 nudges, measurable activation criteria; onboarding must DELIVER value not teach the UI."
|
|
59
|
+
- id: empty-states
|
|
60
|
+
checks: "Every component that renders with no data must teach + invite + commit (3 elements); a blank rectangle is malpractice; empty-state CTAs must reach value in one step."
|
|
61
|
+
- id: power-of-moments
|
|
62
|
+
checks: "Heath lens — audit peaks (amplify), pits (fix/remove), transitions (mark with ceremony), plateaus (interrupt with surprise); 'fine but never memorable' products churn."
|
|
63
|
+
- id: network-effects
|
|
64
|
+
checks: "One-click invite of a teammate/friend; does the product get MORE valuable as N users join; public shareable artifacts/embeds; compounding UGC."
|
|
65
|
+
- id: monetization-hooks
|
|
66
|
+
checks: "Value-gate placed after aha and before commitment; upgrade trigger contextual (limit reached) not nag-banner; price anchor visible early; clear team-plan path."
|
|
67
|
+
- id: reactivation-flows
|
|
68
|
+
checks: "Win-back for dormant users — D3/D7/D14/D30/D90 email cadence, 'what you missed' digest, value-first re-engagement (never dark-pattern FOMO)."
|
|
69
|
+
- id: discoverability-and-power-user
|
|
70
|
+
checks: "Are powerful features hidden — command-palette completeness, settings organization, changelog visibility; for the top 1% propose keyboard shortcuts, bulk ops, API/export."
|
|
71
|
+
- id: prioritized-roadmap
|
|
72
|
+
checks: "Synthesise all proposals into a RICE-scored list, then Fogg B=MAT (M x A x T) on the top 15; priority = RICE_normalized x (1 + Fogg/27); flag high-RICE/low-Fogg ideas and anti-patterns (vanity hooks, dark patterns, shallow personalization, feature bloat)."
|
|
73
|
+
|
|
74
|
+
falsification: >
|
|
75
|
+
The product implicitly claims users will stick — DISPROVE it. Find every reason
|
|
76
|
+
a smart user would churn after week 1, month 1, month 3. Every claim and every
|
|
77
|
+
proposed opportunity must cite at least 3 concrete checks with actual output
|
|
78
|
+
(grep proving a drop-off friction exists, a competitor URL proving a parity gap).
|
|
79
|
+
"Probably broken" / "competitors all" / "users likely" without evidence is an
|
|
80
|
+
automatic FAIL of the finding. Engagement is not retention — score every proposal
|
|
81
|
+
against month-3 retention, not DAU. This audit is READ-ONLY: it proposes and
|
|
82
|
+
ranks, it never codes — implementation is a separate authorized mission.
|
|
83
|
+
|
|
84
|
+
fix_loop: false
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# secaudit — OmegaOS Quality Arsenal definition.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: secaudit
|
|
6
|
+
domain: security
|
|
7
|
+
question: "Can an attacker make this system work AGAINST its users?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*.py", "*.ts", "*.tsx", "*.js", "*.jsx", "*.go", "*.rs", "*.env*", "*.yml", "*.yaml", "Dockerfile", "package.json"]
|
|
14
|
+
|
|
15
|
+
# GATHER — deterministic security scanners, run first, no LLM.
|
|
16
|
+
gather:
|
|
17
|
+
- name: gitleaks
|
|
18
|
+
cmd: "gitleaks detect --source {path} --no-banner --redact -f json --report-path /dev/stdout || true"
|
|
19
|
+
when: "*"
|
|
20
|
+
- name: semgrep
|
|
21
|
+
cmd: "semgrep --config=p/security-audit --config=p/owasp-top-ten --json --quiet {path} || true"
|
|
22
|
+
when: "*.py,*.ts,*.tsx,*.js,*.jsx,*.go"
|
|
23
|
+
- name: npm-audit
|
|
24
|
+
cmd: "npm audit --json --prefix {path} || true"
|
|
25
|
+
when: "package.json"
|
|
26
|
+
- name: pip-audit
|
|
27
|
+
cmd: "pip-audit -f json --progress-spinner off || true"
|
|
28
|
+
when: "*.py"
|
|
29
|
+
- name: bandit
|
|
30
|
+
cmd: "bandit -r {path} -f json -q || true"
|
|
31
|
+
when: "*.py"
|
|
32
|
+
- name: trufflehog
|
|
33
|
+
cmd: "trufflehog filesystem {path} --json --no-update --fail || true"
|
|
34
|
+
when: "*"
|
|
35
|
+
|
|
36
|
+
# PHASES — the agentic falsification pass investigates each.
|
|
37
|
+
phases:
|
|
38
|
+
- id: hinge-auth-boundary
|
|
39
|
+
checks: "Identify THE auth/authz boundary gating every protected resource; prove it cannot be bypassed by direct URL, HTTP method switch, header injection (X-Forwarded-For, X-Original-URL), path normalisation or case variation."
|
|
40
|
+
- id: injection
|
|
41
|
+
checks: "Trace every user input to a SQL/NoSQL query, shell exec, template, LDAP or eval sink — find string-concatenated queries, missing parameterisation, unvalidated $ne/$gt operators, command injection via child_process."
|
|
42
|
+
- id: xss-output-encoding
|
|
43
|
+
checks: "Every input reflected or stored that reaches HTML/JS/URL/CSS output — find unescaped sinks: innerHTML, dangerouslySetInnerHTML, document.write, v-html; verify context-correct encoding and CSP without unsafe-inline/unsafe-eval."
|
|
44
|
+
- id: broken-access-control
|
|
45
|
+
checks: "IDOR — can user A reach user B's resource by changing an ID? Vertical escalation — can a regular user hit admin routes or self-promote via isAdmin/role params? Sequential IDs, mass assignment, missing per-mutation authz checks."
|
|
46
|
+
- id: secrets-exposure
|
|
47
|
+
checks: "Active secrets in repo, git history, CI config, client bundles or NEXT_PUBLIC_ vars; .env actually gitignored; high-entropy strings and known key prefixes (sk_live_, AKIA, AIza, ghp_); measure blast radius of each leaked secret."
|
|
48
|
+
- id: authn-session-jwt
|
|
49
|
+
checks: "Password hashing (bcrypt/argon2 cost), reset-token entropy and single-use, account enumeration, MFA bypass; JWT alg:none accepted, alg confusion RS256->HS256, weak secret, missing exp/iss/aud validation, tokens in localStorage/URL."
|
|
50
|
+
- id: session-cookies-csrf
|
|
51
|
+
checks: "Session cookies HttpOnly+Secure+SameSite; session rotation on login/privilege change, server-side invalidation on logout; CSRF protection (synchroniser token or SameSite) on every state-changing request."
|
|
52
|
+
- id: ssrf-open-redirect
|
|
53
|
+
checks: "User-controlled URLs reaching server-side fetches — can they hit 127.0.0.1, cloud metadata 169.254.169.254, internal services? Redirect params (next, returnUrl, redirect_uri) — protocol-relative // and @-host bypasses enabling phishing/token theft."
|
|
54
|
+
- id: cors-headers
|
|
55
|
+
checks: "Access-Control-Allow-Origin not wildcard (especially with credentials) and not blindly reflecting Origin; security headers present — HSTS, CSP, X-Frame-Options/frame-ancestors, X-Content-Type-Options nosniff, Referrer-Policy, Permissions-Policy."
|
|
56
|
+
- id: input-validation-uploads
|
|
57
|
+
checks: "Server-side type/length/range/format validation on every endpoint param (schema like Zod/Convex validators); file uploads validate magic bytes not just extension/MIME, store outside web root, block SVG-with-script and path traversal."
|
|
58
|
+
- id: rate-limit-bruteforce
|
|
59
|
+
checks: "Login, registration, password-reset and MFA-code endpoints rate-limited with account lockout; limits not bypassable via X-Forwarded-For rotation or endpoint case/method variation; ReDoS and unbounded pagination/batch as DoS vectors."
|
|
60
|
+
- id: dependency-cve
|
|
61
|
+
checks: "Critical/high CVEs in dependencies from npm/pip audit — verify the vulnerable code path is actually reachable; lockfile committed with integrity hashes; postinstall scripts, typosquats, missing SRI on CDN scripts."
|
|
62
|
+
- id: insecure-design-logging
|
|
63
|
+
checks: "Business-logic flaws (negative price, integer overflow, payment race conditions); insecure deserialization; auth/access failures logged without leaking PII or secrets; stack traces and DB errors not exposed to clients."
|
|
64
|
+
|
|
65
|
+
falsification: >
|
|
66
|
+
Do not check that a defense EXISTS — prove it can be BYPASSED. Every PASS must
|
|
67
|
+
cite >=3 concrete commands run (curl with the attack payload, grep for the sink,
|
|
68
|
+
the scanner finding) with verbatim output. Categorise each finding as
|
|
69
|
+
CLAIM-vs-REALITY, CLIENT-vs-SERVER, AUTH-vs-AUTHZ, CONFIG-vs-RUNTIME or
|
|
70
|
+
FRAMEWORK-vs-APPLICATION. A 401/403 from a probe is evidence of a defense, not
|
|
71
|
+
a failure to investigate. Bias hard toward FAIL — the attacker needs only one path.
|
|
72
|
+
|
|
73
|
+
fix_loop: true
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# seoaudit — Quality Arsenal definition for OmegaOS.
|
|
2
|
+
# Compact + structured: the Gestalt-Popper shell lives in omega_engine.audit_arsenal;
|
|
3
|
+
# this file supplies only the domain — gather tools, phases, falsification rules.
|
|
4
|
+
|
|
5
|
+
id: seoaudit
|
|
6
|
+
domain: seo
|
|
7
|
+
question: "Is the site DISCOVERABLE — can search engines crawl, understand, and rank it?"
|
|
8
|
+
weight: 1.0
|
|
9
|
+
threshold: 85
|
|
10
|
+
|
|
11
|
+
applies_to:
|
|
12
|
+
roles: [worker]
|
|
13
|
+
changed: ["*.tsx", "*.jsx", "*.html", "*.astro", "*.vue", "*.svelte", "robots.txt", "sitemap.xml", "next.config.*"]
|
|
14
|
+
|
|
15
|
+
# GATHER — deterministic SEO-signal detectors, run first, no LLM. Machine-checkable findings.
|
|
16
|
+
gather:
|
|
17
|
+
- name: robots-sitemap
|
|
18
|
+
cmd: "ls -1 public/robots.txt public/sitemap.xml app/robots.ts app/sitemap.ts robots.txt sitemap.xml 2>/dev/null || true"
|
|
19
|
+
when: "*"
|
|
20
|
+
- name: meta-tags
|
|
21
|
+
cmd: "grep -rnE '<title>|name=\"description\"|property=\"og:|name=\"twitter:|rel=\"canonical\"|name=\"robots\"' {path} || true"
|
|
22
|
+
when: "*.tsx,*.jsx,*.html,*.astro,*.vue,*.svelte"
|
|
23
|
+
- name: schema-markup
|
|
24
|
+
cmd: "grep -rnE 'application/ld\\+json|schema.org|@type|JsonLd|itemtype' {path} || true"
|
|
25
|
+
when: "*.tsx,*.jsx,*.html,*.astro"
|
|
26
|
+
- name: heading-structure
|
|
27
|
+
cmd: "grep -rcnE '<h1|<h2|<h3' {path} || true"
|
|
28
|
+
when: "*.tsx,*.jsx,*.html"
|
|
29
|
+
- name: images-alt
|
|
30
|
+
cmd: "grep -rnE '<img|<Image' {path} | grep -vE 'alt=' || true"
|
|
31
|
+
when: "*.tsx,*.jsx,*.html"
|
|
32
|
+
- name: lighthouse-seo
|
|
33
|
+
cmd: "npx --no-install lighthouse {url} --only-categories=seo --quiet --chrome-flags='--headless' --output=json 2>/dev/null || true"
|
|
34
|
+
when: "*"
|
|
35
|
+
|
|
36
|
+
# PHASES — the agentic falsification pass investigates each.
|
|
37
|
+
phases:
|
|
38
|
+
- id: crawlability
|
|
39
|
+
checks: "robots.txt valid with no critical pages blocked; meta robots not accidentally noindex; X-Robots-Tag headers; crawl budget not wasted on filter/search URLs."
|
|
40
|
+
- id: indexability
|
|
41
|
+
checks: "THE HINGE — XML sitemap contains only indexable canonical pages; no orphan pages; no index bloat; duplicate content (HTTP/HTTPS, www, trailing slash) collapsed."
|
|
42
|
+
- id: canonical-tags
|
|
43
|
+
checks: "Every page has a self-referencing canonical; no canonical to non-existent URLs; no chain canonicals A->B->C; consistent across HTTP/HTTPS and www/non-www."
|
|
44
|
+
- id: core-web-vitals
|
|
45
|
+
checks: "THE HINGE — LCP <2.5s, INP <200ms, CLS <0.1 on every template; field (CrUX) data not worse than lab; tested on throttled mobile."
|
|
46
|
+
- id: schema-markup
|
|
47
|
+
checks: "Correct Schema.org JSON-LD per page type (Organization/WebSite homepage, Article blog, Product, FAQPage); validates with no missing required properties; matches visible content."
|
|
48
|
+
- id: meta-tags
|
|
49
|
+
checks: "Unique title 50-60 chars with keyword near start; unique meta description 150-160 chars; complete Open Graph (og:image 1200x630) and Twitter Card tags."
|
|
50
|
+
- id: heading-hierarchy
|
|
51
|
+
checks: "Exactly one H1 per page containing the primary keyword; H2s for sections; no skipped heading levels; headings reflect content hierarchy not styling."
|
|
52
|
+
- id: js-rendering
|
|
53
|
+
checks: "View-source vs rendered DOM contain the same content; critical content and meta tags in initial HTML; internal links as <a href> not onClick routers; SSR/SSG for key pages."
|
|
54
|
+
- id: mobile-friendliness
|
|
55
|
+
checks: "Responsive design with viewport meta; no horizontal scroll; text >=16px; touch targets >=48px; no mobile/desktop content divergence (mobile-first indexing)."
|
|
56
|
+
- id: image-and-url-seo
|
|
57
|
+
checks: "Alt text on every informative image; descriptive file names; WebP/AVIF; lazy-load below fold; short lowercase hyphenated keyword-containing URLs; no session IDs."
|
|
58
|
+
- id: content-quality-eeat
|
|
59
|
+
checks: "Experience/Expertise/Authoritativeness/Trust — author credentials visible, topical depth, external citations, HTTPS, privacy policy, unique value over SERP rivals."
|
|
60
|
+
- id: internal-external-links
|
|
61
|
+
checks: "Every page within 3 clicks of homepage; descriptive anchor text; breadcrumbs; no broken internal/external links; nofollow on sponsored/untrusted links."
|
|
62
|
+
- id: redirects-and-errors
|
|
63
|
+
checks: "No redirect chains or loops; 301 for permanent and 302 only for temporary; custom 404 returning real 404 status (not soft 404); 410 for removed content."
|
|
64
|
+
- id: geo-aeo
|
|
65
|
+
checks: "AI-search readiness — question-answer format, machine-parseable lists/tables, cited factual claims, llms.txt, entity optimization, passage-level citability."
|
|
66
|
+
|
|
67
|
+
falsification: >
|
|
68
|
+
A green Lighthouse SEO score lies — it passes 14 basic checks and says nothing
|
|
69
|
+
about indexation, content authority, or competitive position. Every PASS must
|
|
70
|
+
cite at least 3 concrete checks with actual output (fetch as Googlebot, view-source
|
|
71
|
+
vs rendered DOM, exact-phrase SERP search). Categorise findings as LAB-vs-FIELD,
|
|
72
|
+
DESKTOP-vs-MOBILE, CACHED-vs-RENDERED, TODAY-vs-TREND, or TECHNICAL-vs-CONTENT.
|
|
73
|
+
If Googlebot cannot reach or render a page, it does not exist. Bias toward FAIL.
|
|
74
|
+
|
|
75
|
+
fix_loop: true
|