Both the Codex ultrawork directive and the ultragoal skill now force the agent to actually invoke the real user-facing surface (HTTP via `curl -i`, terminal/TUI via `tmux new-session` + `send-keys` + `capture-pane`, GUI via computer-use / Playwright, CLI stdout, DB diff) instead of treating evidence as a free-form artifact list. A paired CLEANUP step requires teardown of every QA-spawned process, tmux session, browser context, container, bound port, temp file/dir, and QA-only env var, with a one-line cleanup receipt recorded next to the artifact path (ultrawork) or embedded in the `--evidence` string (ultragoal). Missing receipt keeps the criterion in_progress / records BLOCKED. New Stop rule: leftover state from QA means NOT done.
Regression tests in `components/ultrawork/hooks/ultrawork-hooks.test.mjs` pin SURFACE-AS-SCENARIO, the concrete `curl -i` / `tmux new-session` / `computer-use / Playwright` invocations, the paired CLEANUP block with cleanup receipt + `tmux kill-session`, and the leftover-state Stop rule so the mandates cannot be silently regressed. README and CHANGELOGs refreshed; stale 5,821-char claim replaced with measured 10,037 chars / 213 lines. All 9 ultrawork hook tests + 7 aggregate tests pass.
Spell out that omo_codex_daily_active now fires from two sources -
install_completed (CLI installer) and session_start (Codex plugin
SessionStart hook) - so readers understand DAU/WAU/MAU reflects real
Codex usage and not just install events. Opt-out env vars are unchanged.
- README.md (root + packages/omo-codex/): both reasons listed.
- docs/legal/privacy-policy.md: discloses session_start as a second
trigger for the same event, same opt-out posture.
- docs/reference/cli.md: telemetry section now describes both PostHog
streams (omo_daily_active vs omo_codex_daily_active) and both Codex
reasons.
- CHANGELOG.md: adds the plugin-runtime wiring under Unreleased.
Adds a new Codex plugin component `telemetry` that emits a single
omo_codex_daily_active event (reason: session_start) from every Codex
SessionStart hook, with the same UTC-day deduplication, hashed
installation identifier, and four-flag opt-out as the install-time
event. Previously omo-codex telemetry only fired on install_completed,
so DAU/WAU/MAU under-reported real Codex usage.
- New plugin component packages/omo-codex/plugin/components/telemetry/
mirrors the rules/comment-checker/lsp pattern: own src/, tsc build,
vitest tests, package.json (posthog-node dep), hooks/hooks.json.
- src/codex-hook.ts wraps createPluginPostHog().trackActive(..., "session_start")
with safeShutdown so Codex session startup never blocks on telemetry.
- Plugin root hooks.json + workspaces register the new component
alongside rules and ultrawork on SessionStart.
- Aggregate test expectations updated to include the telemetry directory.
- cross-package-equivalence.test.ts pins product-identity constants and
shouldDisablePostHog behavior to stay byte-equivalent between the CLI
installer (src/telemetry/) and the plugin runtime
(plugin/components/telemetry/src/), so the two PostHog sources never
drift on event name, distinct_id base, dedup file path, or opt-out
flags.
- PostHogActivityReason union in the CLI-side posthog.ts gains
"session_start" so future CLI paths can emit the same reason without
a type break.
Switch the production worker route and all hardcoded URLs from
ohmyopenagent.com to omo.dev. Six legacy domains (ohmyopenagent.com,
ohmyopencode.org, ulw.dev, ultrawork.ai, ultrawork.dev,
ultrawork.engineer) are configured to permanently (301) redirect to
omo.dev via Cloudflare Page Rules set up out-of-band via flarectl
and the CF API.
- wrangler.toml: bind worker to omo.dev + www.omo.dev only
- middleware.ts: primaryHost to omo.dev, www to apex redirect retained
- layout.tsx: primarySiteUrl + gaTrackedDomain to omo.dev (GA still G-S0QJFKT46Q)
- sitemap.ts, robots.ts: BASE_URL to https://omo.dev
- npm-downloads/route.ts: usage comment URL refreshed
- web-deploy.yml: environment URL to https://omo.dev
- manifesto.md: domain reality-check line lists omo.dev as canonical
- README*.md (5 langs): npm-downloads badge endpoint to omo.dev
notepad-write-guard:
- The hook was created by create-tool-guard-hooks but tool-execute-before
never invoked it, so the guard was inert.
- It also only matched .sisyphus/notepads, missing the current
.omo/notepads layout introduced by the workspace migration.
- Add the dispatch call alongside writeExistingFileGuard, and extend
NOTEPAD_ROOTS to cover both paths via normalize() + sep. New
integration test pins the wire and the .omo block; the existing unit
test now asserts both paths.
start-work session-plan-affinity:
- PLAN_PATH_PATTERN only matched .sisyphus/plans, so sessions referring
to plans under .omo/plans returned null and start-work missed the
current session's own plan.
- Extend the regex to .(sisyphus|omo)/plans and add findPrometheusPlans
in packages/boulder-state to scan both directories during the
transition. New regression test pins .omo/plans matching; legacy
.sisyphus/plans coverage preserved.