Type: Plan Status: Tombstoned Systems: Process Author: HypAware team Date: 2026-05-20 Related: LLP 0002
Tombstoned. The executed V1 finishing plan. v1.0.0 has shipped. Its live
## Decisionswere lifted into LLP 0002; this file is kept for historical phasing only. Original body follows verbatim.
This replaces the old phase 10-13 path in
hypaware-implementation-plan.md.
V1 no longer depends on extracting first-party plugins into separate
repos, moving server code out, making gascity external, or doing donor
cleanup as a release gate.
The V1 target is:
A fresh user can run
npx hypaware, choose what to capture, install a persistent daemon, attach Claude Code and/or Codex when selected, and query locally captured logs/traces/metrics/conversations without manually installing plugins or editing config.
- Publish and run as
hypaware. - Keep
hypas a CLI alias. - Keep the first-run picker flow.
- When daemon install is requested from
npx hypaware, install a persistent global package first, then point launchd/systemd at the stable global binary. - First-party plugins remain bundled in this repo under
hypaware-core/plugins-workspace. @hypaware/centraland@hypaware/gascityare not V1 scope.- No Collectivus config or recording migration is required for V1.
package.jsonexposes onlyhyp, marks the package private, and does not provide thehypawarebinary required bynpx hypaware.- The normal CLI path loads workspace plugin manifests, but does not activate the plugins before command dispatch. Plugin commands, capabilities, clients, sources, sinks, skills, and init presets are therefore not reliably available outside smoke-specific paths.
- The source registry can start and stop sources, and the sink driver can export ready partitions, but there is no primary daemon that boots the kernel, starts configured sources, runs sink ticks, watches config, and reports health.
- There is no launchd/systemd installer for HypAware yet.
- The walkthrough writes config, but the V1
npx hypawarepath needs to finish the whole first-run experience: compose selected bundled plugins, install daemon, attach selected clients, install skills, and print a working first query. - Central and gascity are present in the plugin workspace, but should be excluded from the V1 default path and V1 acceptance gates.
npx hypawareworks from a fresh install and starts the picker on a TTY.- The picker can select Claude Code, Codex, raw Anthropic/OpenAI API capture, OTEL, local cache, and local Parquet export.
- The generated config is explicit and reproducible at
~/.hyp/hypaware-config.json. - The daemon is installed as a persistent user service:
- macOS: launchd user LaunchAgent.
- Linux: systemd user service.
- The daemon starts all configured sources and runs the sink export loop.
- Claude Code attach and Codex attach are idempotent and reversible.
- Local query works against newly captured data.
- All V1 smokes emit a
DEV_RUN_IDand can be verified throughhyp queryorctvs queryover logs, spans, metrics, and captured datasets. - V1 docs do not claim central, gascity, repo extraction, or migration are part of the release.
- No external first-party plugin repos.
- No standalone server repo.
- No central/enterprise sink as a V1 gate.
- No gascity V1 gate.
- No Collectivus config migration.
- No manual plugin install step in the default V1 path.
Goal: make the package runnable as npx hypaware while preserving the
existing hyp command.
Files:
package.jsonbin/hyp.js- New
bin/hypaware.js, if the shared entrypoint needs a clearer name. - README install sections.
Work:
-
Remove
"private": truewhen the package is ready for pack/publish testing. -
Expose both binaries:
{ "bin": { "hypaware": "./bin/hypaware.js", "hyp": "./bin/hypaware.js" } } -
Keep
bin/hyp.jsonly as a compatibility shim if needed. -
Make no-arg behavior intentional:
- TTY: start the V1 picker walkthrough.
- non-TTY: print concise help and exit 0.
-
Preserve
hyp smoke <flow>as an internal developer path. -
Add
npm pack --dry-runcoverage to ensure bundled plugin manifests, plugin source files, skills, and smoke harness files are included.
Smoke:
hyp smoke package_bin_boot
Assertions:
node ./bin/hypaware.js --helpexits 0.node ./bin/hypaware.js smoke core_boot_noopstill works.- A packed tarball contains:
bin/hypaware.jssrc/core/**hypaware-core/plugins-workspace/**/hypaware.plugin.json- plugin entrypoints and skill assets.
Telemetry:
- Emit
command.runforhelp,smoke, and no-arg dispatch. - Attributes:
dev_run_id,hyp_component=cmd-dispatch,hyp_command,status,error_kind.
Goal: CLI, daemon, walkthrough, and smokes all boot the same bundled plugin runtime.
Files:
src/core/cli/dispatch.jssrc/core/runtime/loader.jssrc/core/runtime/workspace.jssrc/core/registry/*src/core/config/schema.jssrc/core/config/validate.jshypaware-core/smoke/**
Work:
- Introduce a single
bootKernel({ configPath, hypHome, mode, runId })helper. - Load the config, load bundled plugin manifests, resolve dependencies, and activate selected plugins before command dispatch.
- Treat bundled plugins as available, not implicitly active. Active plugins come from config or from a command's explicit boot profile.
- Add a V1 bundled allowlist:
@hypaware/ai-gateway@hypaware/otel@hypaware/claude@hypaware/codex@hypaware/local-fs@hypaware/format-parquet@hypaware/format-jsonl
- Keep
@hypaware/centraland@hypaware/gascityloadable for developers, but exclude them from default picker options, default configs, V1 docs, and V1 smokes. - Ensure plugin-contributed commands, source registrations, sinks, clients, skills, and init presets are available after boot.
- Ensure
hyp attach,hyp detach,hyp skills install,hyp status,hyp query, andhyp plugin listuse the same boot path.
Smoke:
hyp smoke cli_bundled_plugins_activated
Assertions:
hyp plugin listshows active bundled plugins from the generated config.hyp attach --client claude --dry-runreaches the Claude client adapter.hyp attach --client codex --dry-runreaches the Codex client adapter.hyp status --jsonreports configured sources and daemon state without requiring central or gascity.
Telemetry:
- One
kernel.bootroot span per process. - One
plugin.activatechild span per active plugin. - Logs for skipped bundled plugins with
status=skippedandhyp_reason=not_configured.
Goal: implement the long-running HypAware daemon independent of launchd/systemd installation.
Files:
- New
src/core/daemon/runtime.js - New
src/core/daemon/status.js - New
src/core/daemon/pid.js - New
src/core/daemon/logs.js src/core/registry/sources.jssrc/core/sinks/driver.jssrc/core/cli/core_commands.js
Work:
- Add daemon commands:
hyp daemon run --foregroundhyp daemon status --jsonhyp daemon stophyp daemon restart
daemon runshould:- boot the kernel from the selected config
- start every configured source through
kernel.sources.start - run sink ticks on an interval
- write PID and health state under
~/.hyp/hypaware/run - write daemon logs under
~/.hyp/hypaware/logs - handle
SIGTERMandSIGINTby stopping sources and flushing telemetry
- Define the daemon health model:
startinghealthydegradedstoppingstopped
- Surface per-source status using the existing source registry
status()contract. - Surface per-sink status from the sink driver:
- last tick time
- last successful export
- failed outbox count
- next scheduled tick
- Add a lightweight config reload path:
SIGHUPreloads config.- Sources with changed config call
reload. - Removed sources call
stop. - New sources call
start. - Sink schedule changes take effect on the next tick.
- Make foreground mode suitable for smoke tests with temp
HYP_HOMEand deterministic ports.
Smoke:
hyp smoke daemon_foreground_start_stop
Assertions:
- Daemon reaches
healthy. - Configured
ai-gatewayandotelsources report started. SIGTERMstops both sources.- A status file records
stoppedafter shutdown. - Traces contain
source.start,source.stop, anddaemon.shutdown.
Telemetry:
- Root span:
daemon.run. - Child spans:
kernel.boot,source.start,sink.tick,source.stop,daemon.shutdown. - Metrics:
hyp_daemon_uptime_mshyp_sources_startedhyp_sink_ticks_totalhyp_sink_exports_total
Goal: install the primary daemon as a persistent user service on macOS and Linux.
Reference donor code:
collectivus/src/daemon/index.jscollectivus/src/daemon/macos.jscollectivus/src/daemon/linux.jscollectivus/src/cli/install.jscollectivus/src/cli/uninstall.jscollectivus/src/cli/status.js
Files:
- New
src/core/daemon/install.js - New
src/core/daemon/platform.js - New
src/core/daemon/macos.js - New
src/core/daemon/linux.js src/core/cli/core_commands.js
Work:
- Add user-facing commands:
hyp daemon installhyp daemon uninstallhyp daemon starthyp daemon stophyp daemon restarthyp daemon status
- macOS:
- Write
~/Library/LaunchAgents/com.hyperparam.hypaware.plist. - Use
ProgramArgumentspointing at the stable globalhypawarebinary. - Pass
daemon run --foreground --config <path>. - Use
RunAtLoadandKeepAlive. - Send stdout/stderr to
~/.hyp/hypaware/logs/daemon.out.loganddaemon.err.log. - Manage with
launchctl bootstrap,bootout,kickstart, andprint.
- Write
- Linux:
- Write
~/.config/systemd/user/hypaware.service. - Use
ExecStart=<global hypaware> daemon run --foreground --config <path>. - Use
Restart=always. - Manage with
systemctl --user daemon-reload,enable,restart,stop, andstatus.
- Write
- Add dry-run rendering for tests:
hyp daemon install --dry-run --json- returns the planned plist/unit content and target paths.
- Add clear failure messages for unsupported platforms.
- Ensure uninstall stops the service but does not remove config, recordings, exports, or user client settings unless explicitly asked.
Smoke:
hyp smoke daemon_install_render
Assertions:
- macOS plist render includes the configured binary path, config path, log paths, label, and foreground daemon command.
- Linux unit render includes the configured binary path, config path, restart policy, and foreground daemon command.
- Rendered service files do not reference
collectivus.
Manual V1 gate:
- macOS install/restart/status/uninstall on a real user account.
- Linux install/restart/status/uninstall on a real user account with systemd user services.
Telemetry:
- Spans:
daemon.install,daemon.uninstall,daemon.start,daemon.stop,daemon.status. - Logs include platform, target path, service label/name, and exit status from the platform manager.
Goal: npx hypaware guides a fresh user to a working daemon-backed local
capture setup.
Files:
src/core/cli/walkthrough.jssrc/core/cli/core_commands.jssrc/core/config/schema.js- plugin client adapters under
hypaware-core/plugins-workspace/*/src - README quickstart
Work:
- No args on a TTY starts the picker.
- Picker inputs:
- capture Claude Code conversations
- capture Codex conversations
- capture raw Anthropic API traffic
- capture raw OpenAI API traffic
- receive OTEL logs/traces/metrics
- Export inputs:
- keep local query cache only
- export local Parquet files
- configure later
- Prompt for retention days with default
30. - Compose an explicit config:
- include only selected bundled plugins plus required dependencies
- include
@hypaware/ai-gatewaywhen Claude, Codex, raw Anthropic, or raw OpenAI is selected - include Anthropic upstream when Claude or raw Anthropic is selected
- include OpenAI upstream when Codex or raw OpenAI is selected
- include
@hypaware/otelwhen OTEL is selected - include
@hypaware/local-fsand@hypaware/format-parquetwhen local Parquet export is selected
- Write config to
~/.hyp/hypaware-config.json. - If invoked through
npxand the user chooses daemon install:- install the stable global package first
- resolve the global
hypawarebinary - install launchd/systemd service pointing at that binary
- Attach selected clients:
- Claude Code via the Claude plugin adapter
- Codex via the Codex plugin adapter
- Offer skill installation for selected clients:
- Claude skills to
~/.claude/skills - Codex skills to
~/.codex/skills
- Claude skills to
- Start or restart the daemon.
- Print:
- config path
- daemon status
- client attach results
- first query command
Non-interactive flags:
hypaware init --yeshypaware init --no-daemonhypaware init --client claudehypaware init --client codexhypaware init --source otelhypaware init --export local-parquethypaware init --retention-days 30hypaware init --from-file <config.json>
Smoke:
hyp smoke walkthrough_picker_to_first_query
Assertions:
- A temp HOME and temp HYP_HOME are used.
- Non-interactive picker selections generate a config containing the expected plugin list and upstreams.
- Dry-run daemon install chooses the stable binary path.
- Claude and Codex attach dry-runs produce expected file edits without touching the real HOME.
- The daemon foreground smoke captures at least one synthetic AI gateway exchange and one OTEL log.
hyp querycan read the captured rows byDEV_RUN_ID.
Telemetry:
- Spans:
walkthrough.start,walkthrough.pick,walkthrough.write_config,daemon.install,client.attach,skills.install,walkthrough.finish. - Logs include selected source ids, selected export ids, retention days, and attach outcomes.
Goal: selected clients are wired correctly, idempotently, and reversibly.
Files:
hypaware-core/plugins-workspace/claude/src/**hypaware-core/plugins-workspace/codex/src/**src/core/cli/core_commands.jshypaware-core/smoke/**
Work:
- Add
--dry-runand JSON output to attach/detach commands where missing. - Ensure Claude attach writes only the needed settings keys and preserves unrelated user settings.
- Ensure Codex attach writes a
hypawareprovider using:base_url = "http://127.0.0.1:<gateway-port>/v1"- Responses API support.
- OpenAI auth behavior compatible with Codex.
- Ensure detach only removes HypAware-managed settings.
- Add idempotency tests:
- attach twice has no duplicate settings
- detach twice succeeds
- attach after detach restores the expected state
- Ensure attach fails clearly if the generated config did not include
@hypaware/ai-gateway.
Smoke:
hyp smoke client_attach_idempotent
Assertions:
- Temp Claude settings and temp Codex config are modified as expected.
- Attach/detach operations leave unrelated keys intact.
- Attach emits
client.attachtelemetry withstatus=ok. - Missing gateway emits
status=failedanderror_kind=cap_missing.
Goal: prove the daemon captures real local data and makes it queryable.
Files:
hypaware-core/plugins-workspace/ai-gateway/src/**hypaware-core/plugins-workspace/otel/src/**hypaware-core/plugins-workspace/local-fs/src/**hypaware-core/plugins-workspace/format-parquet/src/**src/core/sinks/driver.jssrc/core/query/**hypaware-core/smoke/**
Work:
- AI gateway:
- verify Anthropic upstream passthrough
- verify OpenAI
/v1passthrough - verify
/v1/responsescapture for Codex - verify failed upstream responses are recorded with status and error fields
- OTEL:
- verify logs, traces, and metrics are accepted through OTLP HTTP
- verify daemon self-telemetry loops back into local storage
- Local query:
- verify
hyp querycan read AI gateway, logs, traces, and metrics - verify queries can filter by
DEV_RUN_ID
- verify
- Local export:
- verify local-fs sink exports Parquet batches
- verify failed exports land in the failed outbox
- verify forced export works from CLI
Smokes:
hyp smoke gateway_claude_capturehyp smoke gateway_codex_capturehyp smoke otel_loopback_capturehyp smoke local_parquet_export
Assertions:
- Every smoke writes at least one row to its target dataset.
- Every smoke can query those rows by
DEV_RUN_ID. - Exported Parquet files can be read back and contain the expected dataset rows.
- Daemon self-telemetry includes source start, request capture, sink tick, export success, and shutdown spans.
Goal: users can tell whether HypAware is working and get actionable repair commands.
Files:
src/core/cli/core_commands.jssrc/core/daemon/status.jssrc/core/config/validate.js- README troubleshooting section
Work:
hyp statusshould show:- config path
- daemon installed/running state
- active plugins
- source status
- sink/export status
- Claude attach state
- Codex attach state
- recent error count
hyp status --jsonshould return stable machine-readable output for smokes and support tools.- Add validation diagnostics for common broken states:
- configured client without ai-gateway
- Codex selected without OpenAI upstream
- Claude selected without Anthropic upstream
- local export selected without encoder
- port conflict on source start
- daemon installed with missing binary
- Add repair suggestions:
hyp daemon restarthyp daemon installhyp attach --client claudehyp attach --client codexhyp init --from-file <path>
Smoke:
hyp smoke status_diagnostics
Assertions:
- Healthy config reports healthy.
- Broken config reports degraded with specific diagnostics.
- JSON status includes no central or gascity requirements.
Goal: make V1 understandable, testable, and releasable.
Files:
README.mdhypaware-design.md, only if the design needs a V1 scope notepackage.jsonfinish-v1.md
Work:
- Update README quickstart:
npx hypaware- what the picker does
- where config lives
- where data lives
- how to query
- how to attach/detach Claude and Codex
- how to install/uninstall/restart daemon
- Document V1 scope:
- bundled plugins
- local capture
- local query
- local Parquet export
- Claude Code and Codex attach
- macOS/Linux user daemon
- Document out-of-scope:
- central
- gascity
- repo extraction
- Collectivus migration
- Add release checklist:
npm test, if presentnpm run lint, if presentnpm run typecheck, if presentnpm pack --dry-run- all V1 smokes
- manual daemon install on macOS
- manual daemon install on Linux
- Decide version bump:
- for the first public V1 package, use
1.0.0 - remove pre-V1 wording from README and package description
- for the first public V1 package, use
Final V1 smoke command:
hyp smoke package_bin_boot
hyp smoke cli_bundled_plugins_activated
hyp smoke daemon_foreground_start_stop
hyp smoke daemon_install_render
hyp smoke walkthrough_picker_to_first_query
hyp smoke client_attach_idempotent
hyp smoke gateway_claude_capture
hyp smoke gateway_codex_capture
hyp smoke otel_loopback_capture
hyp smoke local_parquet_export
hyp smoke status_diagnosticsFinal manual gate:
npm pack
npx ./hypaware-*.tgz
hypaware status
hypaware daemon restart
hypaware query "select count(*) from ai_gateway_messages"
hypaware query "select count(*) from traces"
hypaware query "select count(*) from logs"
hypaware daemon uninstall- Package/bin identity.
- Shared kernel boot and bundled plugin activation.
- Foreground daemon runtime.
- Daemon install renderers and platform commands.
- First-run picker completing config, attach, skills, daemon install, and daemon start.
- Claude/Codex attach hardening.
- Local capture/query/export smokes.
- Status diagnostics.
- README and release gate.
The key dependency is phase 2. Until normal CLI boot activates bundled
plugins, daemon work and npx hypaware work will keep hitting false
capability and command gaps.