All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- OAK is in maintenance mode. This project is no longer under active development. I have since started Myco, a new project originally inspired by ideas explored in OAK. Myco goes beyond memory and unlocks true intelligence for your project and your team. Moving over? See the migration guide.
-
Fix MCP server install silently skipped after
MCP_SERVER_NAMEconstant was removed in a prior refactor — pipeline stagesmcp.pyandremoval.pywere importing the constant fromfeatures/team/constants.py, which no longer existed; corrected import tofeatures/swarm/constants.pywith the updated constant name, ensuring the MCP server is correctly identified and installed duringoak initandoak upgrade -
Fix stale PID files blocking daemon restarts — the cleanup routine in
utils/daemon_manager.pycompared the PID filename against a hard-coded string rather than the resolved absolute path; the condition never matched when the file lived in a different directory, so the PID file was never removed on unexpected process exit; path is now normalised withos.path.abspathbefore comparison -
Fix
ModuleNotFoundErroron daemon startup caused by typoopen_agent_kit.confi— corrected toopen_agent_kit.config.pathand reordered the import block to satisfy lint; seeteam/daemon/lifecycle/startup.py -
Fix TypeScript
TS2304errors inrelay-object.ts—CAPABILITY_SWARM_TOOLSandCAPABILITY_SWARM_BROADCASTwere declared after the code that referenced them;constis block-scoped and not hoisted, so the compiler reported them as undefined; moved declarations to the top of the file -
Fix missing
@cloudflare/workers-typespackage causing worker build failures —tsconfig.jsonreferenced the package incompilerOptions.typesbut it was not installed; package added topackage.json -
Pin ChromaDB to
>=0.5.0,<1.0.0inpyproject.toml— ChromaDB 1.x changed its environment-variable handling, causing import errors and runtime failures in the embedding provider chain; pinning to the pre-1.0 series restores compatibility
Note: Session indexing was not active for this period. Changes above are sourced from active project memories rather than indexed sessions.
Gotcha: The
MCP_SERVER_NAMEconstant now lives infeatures/swarm/constants.py. Any pipeline stage or script that imports it fromfeatures/team/constants.pywill silently fail at runtime — search the codebase for the old import path when adding new pipeline stages.
-
CloudRelay client shutdown made graceful and idempotent — The
disconnectmethod incloud_relay/client/_core.pynow explicitly cancels and awaits all pending async tasks, suppressesasyncio.CancelledError, and guards each cancellation behind atask.done()check; prevents leaked tasks and unhandled exceptions during relay disconnection -
Skill deployment workflow formalized — Skill source files now live exclusively under
src/open_agent_kit/features/<feature>/skills/<skill>/as the authoritative template; deployed copies in.claude/,.agents/, and.cursor/are generated bySkillServicewhich substitutes the{oak-cli-command}placeholder with the project's configured CLI alias; useoak skill refreshoroak upgradeto propagate changes — never raw-copy source templates directly
Note: Session indexing was not active for part of this period. Changes above are sourced from project architectural memory rather than indexed sessions.
Gotcha: Raw-copying skill source files to
.claude//.agents//.cursor/bypasses placeholder resolution — the deployed skill will contain a literal{oak-cli-command}string instead of the actual alias. Always deploy viaoak skill refreshoroak upgrade.
- Offline observation buffering in Durable Object — The Cloudflare DO now stores pending observations for disconnected nodes in a local SQLite buffer; observations are drained automatically on reconnect via
GET /obs/pending?machine_id=X, eliminating data loss for temporarily offline team members RemoteObsApplierfor inbound relay observations — Newteam/sync/obs_applier.pyapplies observations received from remote nodes to the local activity store, decoupling inbound sync from the outbox worker
- Team sync narrowed to observations only — Sessions and batches are no longer relayed to peers; only
observations.pyandresolution_events.pystill enqueue to the team outbox; call sites insessions/crud.py,batches/crud.py, andactivities.pycleaned up; substantially reduces relay bandwidth and simplifies the sync contract TeamSyncWorkerrenamed toObsFlushWorker— Responsibility narrowed to flushing buffered observations viarelay_client.push_observations(); heartbeat handling fully delegated toCloudRelayClient— seeteam/outbox/worker.py- Cloudflare DO WebSocket routing switched to tag-based lookup —
acceptWebSocket(ws, [machine_id])paired withgetWebSockets(machineId)replaces the previous reverse-map approach;ws.getTags()[0]provides the machine ID in close handlers with no extra bookkeeping required - Cloud relay split into deployed and template copies — Deployed relay now lives at
oak/cloud-relay/src/; the template for user deployments lives atsrc/.../cloud_relay/worker_template/src/; both must be kept in sync on any wire-protocol change - Python relay client refactored into three focused modules —
protocol.py(Pydantic wire types),client.py(CloudRelayClient), andbase.py(abstractRelayClient/RelayStatus) replace the prior monolithic client module undersrc/.../cloud_relay/ - Team API surface trimmed — Only
status,members,config, andpolicyendpoints remain; all auxiliary team management endpoints removed as part of the relay redesign
- DB migration v11 — legacy team tables dropped —
team_events,team_members,team_api_keys, andpending_joinstables removed from the activity schema;team_outboxis retained; bumpCI_ACTIVITY_SCHEMA_VERSIONinconstants/paths.pyto trigger the migration
Note: Session indexing was not active for part of this period. Changes above are sourced from project architectural memory rather than indexed sessions.
Gotcha:
enqueue_team_eventhas been removed fromsessions/crud.py,batches/crud.py, andactivities.py. Any code that calls this function will fail at runtime. Onlyobservations.pyandresolution_events.pyshould enqueue to the team outbox.
Gotcha: The DO WebSocket tag pattern requires
this.state.acceptWebSocket(ws, [machine_id])at connection time andthis.state.getWebSockets(machineId)for targeted message delivery. The old reverse-mapMap<ws, machineId>is no longer maintained — do not reintroduce it.
- Remove legacy beta-channel code — Removed all beta-channel branching logic from installer scripts, pipeline stages, and test fixtures; simplifies the release pipeline and eliminates the parallel code paths that were maintained since the beta rollout — Refactor repository to remove legacy beta‑channel code
- UI density selector with three display modes — Users can switch between Compact, Normal, and Comfy densities; the preference persists in local storage and applies globally across both Team and Swarm daemon dashboards — Fix UI layout, persist font selection, and enable dark mode
- Dark mode across Team and Swarm daemon UIs — Full dark mode support added to all surfaces including the log viewer, navigation, and layout components — Fix UI layout, persist font selection, and enable dark mode
- Swarm dashboard topology enhancements — Hub node tooltips now display extent counts; node-tool visibility restored after a prior refactor removed it; topology rendering improved for larger swarms — Refactor swarm agent code, enhance dashboard topology and node visibility
- Documentation audits across Team, Swarm, and CLI sections — Validated the docs site build; audited Team, Swarm/Agents, and CLI documentation pages against the live implementation; generated discrepancy reports and corrected pages where docs diverged from current behavior — Validate documentation site build and quality scan, Verify Audit Team docs match implementation, Audit Swarm/Agents docs for consistency with code, Audit CLI docs against implementation and generate discrepancy report
- Font selection persists across sessions — Font preference is now stored in local storage (mirroring the density selector pattern) and restored on reload — Fix UI layout, persist font selection, and enable dark mode
- Swarm agent code refactored for reusable skills — Agent implementation slimmed down; reusable skill abstractions extracted; unused helpers removed — Refactor swarm agent code, enhance dashboard topology and node visibility
- Swarm mode surfaced in team and relay dashboards — Exposed new API endpoints; team and relay dashboard surfaces now display swarm connectivity state and surface swarm-mode controls alongside existing team views — Refactor dashboards to support swarm mode features
- Codebase-wide quality refactor — Full review targeting code reuse, efficiency, and correctness across the project; governance config restored and daemon URL routing corrected — Refactor entire codebase for quality review
- Fix
EISDIRbuild failure caused by importingui/shared/components/ui/configas a single module — Node attempted to read the directory itself; updated all references to import the explicitindex.tsxentry point — Fix UI layout, persist font selection, and enable dark mode - Fix
projectNametypo inLayout.tsx— prop was referenced asprojectNam, causing a runtime render error in both Team and Swarm dashboards — Fix UI layout, persist font selection, and enable dark mode - Fix
/uiroute returning a raw string instead of an HTML template response — the handler was missingtemplates.TemplateResponse; tests now confirm the endpoint returnstext/htmlwith the correct<title>Oak CI</title>— Refactor entire codebase for quality review - Fix duplicate
descriptionentries inmcp_tools.pytool schema — two tool definitions shared identical description strings, causing ambiguity in tool selection and documentation generation — Refactor entire codebase for quality review - Fix
.oak/config.yamlgovernance rules section accidentally removed — restored the missingrules:block and sub-entries (allow,deny,log_allowed) to re-enable fine-grained policy enforcement — Refactor entire codebase for quality review
Gotcha: The density selector relies on CSS custom properties defined in
variables.cssfor all three density levels. If a new theme omits any of these tokens, components silently fall back to default spacing. Always define all three variants (compact,normal,comfy) when extending the theme.
Gotcha: The
FontProviderwrapper was removed from daemon entry points when density support was added. Font persistence is now handled by a standalone local-storage hook — do not re-addFontProviderto new entry points. Seemain.tsxunderfeatures/*/daemon/ui/src/.
- Swarm feature promoted to beta — The Swarm UI and CLI commands are now surfaced as a beta feature; CI builds pass and the swarm binary is included in the release artifact — Fix CI failures and enable beta swarm binary
- Migration helper for secrets from
.envto per-machine YAML config — A migration utility reads legacy.envswarm tokens and backup paths and writes them into the machine-specific override config (.oak/config.<machine_id>.yaml); subsequent upgrades no longer require manual secret copying — Implement migration helper and unify secret handling in YAML config
- All machine-local secrets unified under per-machine YAML config — Swarm tokens and backup directory path moved out of
.envand into.oak/config.<machine_id>.yaml; eliminates the dual-source secret problem and keeps the config portable without exposing secrets in version control — Implement migration helper and unify secret handling in YAML config - Swarm skill cleaned up; unused broadcast/call helpers removed —
swarm_broadcastandswarm_callhelper functions removed; Swarm skill slimmed to its core MCP surface — Refactor swarm skill, clean helpers, restore Cloudflare relay
- Fix Cloudflare relay disconnecting after worker template changes — the
RelayMessageTypeenum hadSwarmSearemoved during a refactor, causing a runtime type error and immediate disconnection; enum member reinstated and all switch cases updated — Refactor swarm skill, clean helpers, restore Cloudflare relay - Fix
MCP_SERVER_NAMEconstant rename causing silentImportErrorin init/upgrade pipelines — reference updated tofeatures/swarm/constants.py; swarm MCP server now correctly installed duringoak initandoak upgrade— Fix CI failures and enable beta swarm binary - Fix stale PID files blocking daemon restarts —
daemon_manager.pycompared the PID filename against a hard-coded string without resolving the full path; normalized withos.path.abspathand added an explicit existence check so the PID file is always cleaned up on unexpected exit — Fix CI failures and enable beta swarm binary - Fix
ModuleNotFoundErroron daemon startup —startup.pyhad a typo importingopen_agent_kit.confiinstead ofopen_agent_kit.config.path— Fix CI failures and enable beta swarm binary - Fix ChromaDB 1.x breaking import and runtime errors — pinned
chromadbto>=0.5.0,<1.0.0inpyproject.toml; ChromaDB 1.x changed environment variable handling in an incompatible way — Fix CI failures and enable beta swarm binary - Fix
@cloudflare/workers-typesmissing frompackage.json— package was listed intsconfig.jsoncompilerOptions.typesbut not installed, causing TypeScript build failures in the worker template — Refactor swarm skill, clean helpers, restore Cloudflare relay - Fix
CAPABILITY_SWARM_TOOLSandCAPABILITY_SWARM_BROADCASTconstants used before declaration inrelay-object.ts— moved declarations to the top of the file to resolveTS2304errors — Refactor swarm skill, clean helpers, restore Cloudflare relay - Fix swarm daemon
/connectroute path mismatch — FastAPI route used a placeholder path instead of/connect, causing navigation failures; updated to@router.get("/connect")to match the React Router expectation — Fix CI failures and enable beta swarm binary
- Secure swarm token storage in environment variables — Swarm tokens are now stored as environment variables rather than written to config files, enabling cross-machine portability without committing secrets to version control; connecting to a swarm from a new machine no longer requires manually copying config — Implement secure swarm token storage in environment variables, Configure secure swarm token storage and resolve UI build failures
- Fix UI build failure caused by uncommitted
ui/shared/lib/directory — Git reported the directory existed on disk but was absent frommain, causing a fatal error during Vite's pre-build step before any TypeScript compilation; fixed by committing the directory and itslog-constants.tscontents tomain— Configure secure swarm token storage and resolve UI build failures
Gotcha: If
CI_CONFIG_SWARM_KEY_AGENT_TOKENis missing or empty, requests to swarm MCP endpoints fail silently with a 401/403 — the error surfaces as a generic network failure with no explicit authentication message in client logs. Always verify the agent token is populated before connecting an MCP client to the swarm. See the agent token retrieval logic inswarm/daemon/client.py.
- Swarm heartbeat advisories and minimum OAK version enforcement — The swarm heartbeat response now carries advisory messages that peers can surface; a new
min_oak_versionfield lets operators enforce a floor version across all swarm members and reject older nodes on connect; includes dedicated health-check endpoints for probing liveness without invoking business logic — Implement swarm heartbeat advisories and min OAK version configuration - Full swarm autonomous agent functionality (in progress) — Ongoing work to make the Swarm Analyst agent fully autonomous, enabling it to independently discover peers, fan out tasks, and aggregate results without manual orchestration — Implement full swarm autonomous agent functionality
- Complete declarative
mcp.yamltool list with tests — The MCP tool registry inmcp.yamlis now fully declarative and accurate; new tests verify the runtime tool registry matches the YAML declaration, preventing silent divergence between config and implementation — Add complete tool list to mcp.yaml and tests - Oak skill packaging, export, and benchmark file strategy — The Oak CI skill bundle can now be exported and packaged for distribution; evaluation/benchmark JSON files follow a defined version-control strategy (tracked in
oak/ci/history/benchmarks directory); export tests confirm the bundle shape is stable across builds — Implement Oak skill packaging, export tests, and benchmark file strategy - Debug-level logging and rotating log files for swarm daemon — Comprehensive debug logging added throughout the swarm daemon; log output now rotates automatically to prevent unbounded disk growth; a rich terminal-style log-viewer UI — matching the team daemon experience — added to the swarm dashboard — Add debug log level and rotating logs to swarm daemon
- Shared log viewer component extracted to
ui/shared/— The terminal-style log viewer is now a single shared React component consumed by both the team and swarm daemon UIs (via the@oak/uialias); eliminates duplicated log-rendering logic and ensures consistent behaviour and styling across both surfaces — Refactor log viewer into shared component for swarm and team daemons - Oak skill template refreshed; schema docs regenerated — The Oak skill template is updated from source and re-exported;
references/schema.md,SKILL.md, and all agent system-prompt files regenerated viagenerate_schema_ref.pyto reflect the current schema; thetest_schema_version_matchesgate intest_skill_service.pynow passes cleanly — Update Oak skill template and regenerate schema docs
- Fix swarm daemon restart endpoint failing silently — the
SWARM_AUTH_ENV_VARconstant was inadvertently removed during a refactor, so the daemon manager never injectedOAK_SWARM_DAEMON_TOKENinto the subprocess environment; the daemon started without a token, causing an auth error and a UI timeout; constant re-added and manager updated to use it when spawning the daemon - Fix swarm
/fetchendpoint returningNonefor thefunctionfield — the FastAPI route handler omitted thefunctionquery parameter from its signature, causing FastAPI to injectNone; addedfunction: str = Query(...)to the handler and ensured it is always echoed in the response
features/team/repository restructure — Renamedfeatures/codebase_intelligence/tofeatures/team/, the innerteam/relay package tofeatures/team/relay/, extracted shared agent runtime logic into a new top-levelfeatures/agent_runtime/package, and moved shared React/Tailwind components intoui/shared/(aliased as@oak/uiin both Vite configs); the.oak/ci/on-disk data path andCI_DATA_DIRconstant are unchanged — Refactor codebase intelligence to team feature structure, Refactor team feature layout, update imports, rebuild UI and daemon- Swarm
deploysubcommand and daemon URL output —oak swarm createnow produces a lightweight local config without requiring Cloudflare credentials; a newoak swarm deploycommand provisions the Cloudflare Worker separately;oak swarm startprints the local daemon URL on launch for immediate access — Refactor swarm create to lightweight config and add deploy command, Add deploy subcommand, start daemon with URL output and config validation - Cloudflare Worker activity monitoring with Slack alerts — Added spike detection for Durable Object reads/writes anomalies; fires a Slack alert when worker activity breaches configurable thresholds, providing early warning before quota overruns — Implement worker activity monitoring and Slack alerts for spike detection
- Multi-swarm support with auto-port assignment — Overhauled the Swarm config schema to support multiple concurrent swarm instances; the daemon now auto-assigns a free port when starting a swarm so manual port configuration is no longer required; includes a richer node analytics/health page and searchable node listing in the Swarm UI — Implement multi‑swarm auto‑port logic and config schema
oak swarm restartCLI and Swarm UI health polling — Addedoak swarm restartcommand for parity withoak team restart; the Swarm UI now polls the daemon health endpoint on mount and surfaces a live connectivity badge; also repaired Swarm UI build failures caused by leftover imports from the shared-status refactor — Implement swarm restart CLI and UI health polling- Custom domain support for Swarm worker deployments — Added a UI input and backend wiring to configure a custom domain when deploying a Swarm worker, mirroring the existing team relay flow; a validation step confirms the domain is reachable before the deployment is committed — Implement custom domain configuration for Swarm worker deployment, Implement custom domain validation for Swarm worker deployment
- Fix Cloudflare DO hibernation
rows_readquota exhaustion — with the WebSocket Hibernation API the DO constructor runs on every wake (not just first start); 12 DDL statements (CREATE TABLE IF NOT EXISTS, etc.) each readsqlite_schemarows, adding up to ~60 rows_read per wake and ~5M rows_read/day—hitting the free-tier ceiling; DDL is now guarded behind a KV-backed_schema_versionflag and only executes when the schema version constant changes; applied to bothrelay-object.ts(SCHEMA_VERSION) andswarm-object.ts(SWARM_SCHEMA_VERSION) — Implement worker activity monitoring and Slack alerts for spike detection - Fix upgrade banner never clearing —
parse_base_release()inversion.pyreturnedNonewhen the version string did not match the expected pattern, causingversion_check.pyto always evaluate the comparison as "upgrade required"; updated the parsing regex to handle the new semantic-version format and added a fallback that treats an unparsable version as equal to the current base release — Refactor team feature layout, update imports, rebuild UI and daemon - Fix UI build failures after restructure —
package.jsonscripts in both the team and swarm daemon UIs referenced a non-existenttsconfig.app.jsonpath; additionally, the shared TypeScript configui/shared/tsconfig.jsonwas deleted during the refactor while downstreamtsconfig.app.jsonfiles still extended it, causingtsc -bto fail with "File not found"; restored the shared config with correct compiler options and updated allextendspaths — Refactor team feature layout, update imports, rebuild UI and daemon - Fix
wranglersubprocess using wrong working directory for worker deployment —worker_deploy_shared.pysetcwdto the swarm root rather than theworker_template/subdirectory, causing Node to fail to resolvewrangler-dist/cli.js;run_cwdnow defaults to the worker template path — Add deploy subcommand, start daemon with URL output and config validation - Fix OTel Codex agent silently dropping telemetry — the
protocolfield was either missing or using an unsupported value; confirmed correct config requiresprotocol = "binary"nested underotel.exporter.otlp-httpin the Codex TOML template — Configure OTel agent for binary encoding usage - Fix empty federated search result cards in Team UI — the
use-network-search.tshook destructured the cloud-relay API response using the keyresults, but the endpoint returns data underdata; every federated result was rendered with an undefined payload, producing blank cards; fixed by updating the destructuring and normalising the shape before passing to the card component — Fix empty federated search result cards in Team UI search rendering - Fix custom domain not honoured during Team Relay deployments — after the repository restructure the
cloud_relay.pydeployment route no longer wroteCLOUD_RELAY_RESPONSE_KEY_CUSTOM_DOMAINto the status response, causing the UI to silently fall back to the defaultworkers.devdomain even when a custom domain was configured; the missing write was restored — Fix custom domain not honored during Team Relay deployments
- CLI namespaces reorganized to match new feature structure — daemon lifecycle commands now live under
oak team(e.g.,oak team start/stop/restart); codebase intelligence commands underoak ci(e.g.,oak ci index/search/config); both namespaces exposeoak team mcpandoak ci mcpfor backward compatibility — Refactor codebase intelligence to team feature structure - Extract shared agent runtime route module — duplicated agent-creation, run-polling, and log-streaming logic was present in both the team and swarm daemon route layers; consolidated into a single shared module so both daemons are thin consumers; ensures consistent response schemas and error handling across the two surfaces — Refactor agent runtime logic into shared route module
Gotcha: The Cloudflare Durable Object constructor re-runs on every hibernation wake, not just the first start. Any DDL executed unconditionally in the constructor counts toward
rows_readquota on every wake. Always gate DDL behind a KV-backed schema-version flag (seerelay-object.tsSCHEMA_VERSION/swarm-object.tsSWARM_SCHEMA_VERSION) and bump the constant only when the schema actually changes.
Gotcha: The OTLP
protocolfield is case-sensitive and must be exactly"binary"or"json". An unsupported value or wrong casing silently disables the exporter with no error log. Additionally, the field must be nested asotel.exporter.otlp-http.protocol— a separate[otel.exporter.otlp-http]TOML table is no longer parsed by the current Codex runtime. Seeotel_config.toml.j2.
Gotcha: The swarm daemon's agent state is held in memory only (
state.py). A daemon restart loses all current agent statuses with no disk or database fallback. Plan for stateless restarts or implement persistence before relying on swarm state in production.
Gotcha: The
wrangler.toml.j2template does not injectcustom_domaininto theroutessection unless the variable is explicitly forwarded to the Jinja context viarender_wrangler_config. After the restructure refactor this argument was dropped, silently deploying workers with the defaultworkers.devdomain even when a custom domain was set. Always passcustom_domainthrough the template context and verify domain resolution in the deployment validation step.
Gotcha: Federated nodes return HTTP 200 with an empty array when they have no matching results — not a 404 or error sentinel. Any UI hook that treats a non-empty response array as the success condition (like the pre-fix
use-network-search.ts) will silently render empty cards. Normalise both the shape and the empty-array case when consuming federated search responses. Seeuse-network-search.tsand the cloud-relayclient.py.
- Federated MCP tool calls with short-TTL SQLite cache — The team relay now caches federated MCP tool call results in a local SQLite table with a short TTL, cutting redundant fan-outs when multiple agents query the same tool in rapid succession; cache hits, misses, and eviction counts are exposed as Prometheus metrics on the team relay observability page — Implement short‑TTL SQLite cache for federated tool calls, Implement SQLite cache layer for federated tool calls
- Policy-driven federated tools toggle — A new
federated_toolspolicy flag (default opt-in) controls whether a node exposes its MCP tools to network peers; UI capability badges now render dynamically from the live policy state instead of hardcoded flags, so the team status page accurately reflects each member's current configuration — Implement federated tools policy toggle and dynamic capability registration, Update federated tools policy toggle and UI badge rendering logic list_nodesMCP tool and federated data aggregation — Newlist_nodesMCP tool enumerates all reachable team nodes; the relay now aggregates memories, plans, sessions, and context across all team members while keeping code search local to the originating node — Implement list_nodes tool and federated data aggregation- Full MCP tool federation with custom tool list preservation — Federation support extended to most MCP tools so cloud agents can query any team member's tools; custom tool lists defined by the user are preserved through the federation layer — Implement federation for MCP tools and preserve custom tool list
- Power-state-aware teams relay — The teams relay now respects macOS power state, allowing the system to sleep normally during idle periods; users can opt in to always-on mode to keep the relay active at all times — Implement power-state aware teams relay with opt‑out
- Response summary limit raised to 15k characters — Agent response summaries can now store up to 15,000 characters (up from 5,000); the activity store was refactored to enforce this unified limit consistently across all code paths, preventing premature truncation of valuable agent output — Update response summary limits to 15k characters, Refactor activity store to enforce unified 15k response summary limit
- Oak Swarm — federated CI across projects — New
swarmmodule introduces a federated layer that lets Oak CI Teams from different projects share knowledge and reasoning with each other (complementing Oak Teams, which connects developers on the same project); the initial sessions established the Swarm protocol design, a Cloudflare Worker scaffold (oak-swarm-<name>), TypeScript wire types, a built-in Swarm Analyst agent, and a new-project onboarding task — Implement Oak Swarm architecture and worker skeleton, Implement Oak Swarm worker initialization logic
- Fix GitHub Actions release step failing on stale release tag — a stale release/tag left over from a prior failed run blocked the "Create GitHub Release" action; deleting the stale tag restored the release pipeline — Fix GitHub Actions release tag error by deleting stale release
- Fix Oak upgrade CLI path resolution for skills and MCP server commands — the upgrade command incorrectly resolved skill and MCP server entry points to
main.pyrather than the correct command path, causing upgrades to silently wire the wrong binary — Fix Oak upgrade CLI command path resolution for skills and MCP servers - Fix hanging auto-refresh on custom agent task runs — the daemon registry aborted silently when
project_configwas absent for a named agent (log:No project config for agent 'analysis'), causing route handlers to throw and the UI polling loop to stall indefinitely; a defensive fallback now loads an empty default config and emits a clear warning, allowing the daemon and UI to continue normally — Debug auto‑refresh dismissal logic for custom agent tasks
- Remove unused keys from
.oak/config.yaml— stale configuration keys that no longer map to any code paths were removed, slimming the config surface and reducing confusion for new users — Refactor .oak/config.yaml by removing unused configuration keys - Resolve Dependabot security alerts and rebase PR 75 — outstanding security alerts addressed and the feature branch brought up to date with main ahead of merge — Refactor PR 75, Resolve Dependabot Alerts, Rebase onto Main
- Add recursive
**/node_modules/glob to monorepo.gitignore— replaces per-app entries with a single depth-agnostic pattern that covers all nestednode_modulesdirectories across Node.js and Cloudflare Worker packages — Fix nested node_modules ignore in mono repo gitignore
Gotcha: The cloud-relay UI auto‑start toggle reads
team.cloudRelay.autoStartfrom local component state, which is only populated whenGET /cloud-relay/statusis queried on mount. Any extension to the start/deploy route that omitsauto_startfrom its response will cause the UI to always show "Auto‑start: off". Seecloud_relay.pyandTeamConfig.tsx.
Gotcha: Rapid consecutive policy edits (e.g. toggling
federated_toolsquickly in the UI) can trigger a WebSocket reconnect storm —update_team_policy()callsrequest_reconnect()on the relay client, which relies on a backoff loop that may not be robust under aggressive saves. Debounce policy updates on the frontend to avoid spin-up loops. Seecloud_relay/client.py.
- Federated network search on all agent surfaces — Oak network search results are now automatically injected into every agent-facing surface; agents no longer need to explicitly call
oak_searchto benefit from network-aware results — Implement federated network search integration for all agent surfaces - CI activity migrations and registry integration — SQL schema migrations for new CI tables landed and the codebase intelligence feature is wired into the production registry, transitioning it from draft to active state — Implement codebase intelligence migrations and registry integration
- Hybrid SQL‑semantic memory consolidation — the Maintenance Agent's memory-consolidation task replaced an O(n) full semantic scan (which timed out after ~10 min on large codebases) with a hybrid SQL-first pre-filter followed by targeted semantic search; agent turn limit raised to 500 and timeout to 300 s — Refactor memory consolidation with hybrid SQL‑semantic search, Update memory-consolidation task with hybrid SQL‑semantic search
- Fix hanging
make check— resolved three pre-existing failures caused by a pytest/xdist version mismatch and a truncated string literal inhooks_prompt.pythat produced a silent syntax error; added per-test timeouts to prevent future CI hangs — Fix hanging tests, add timeouts, stabilize CI pipeline - Fix
ImportErrorcrash on daemon startup —skill_service.pyreferenced the non-existent symbolresolve_ci_cli_comma; corrected toresolve_ci_cli_command, restoring startup for fresh installs — Implement codebase intelligence migrations and registry integration
- Workflow engine refactored for type safety and test coverage — strengthened TypeScript typing, resolved code smells, and expanded the test suite ahead of PR merge — Refactor workflow engine, add type safety, and improve tests
Gotcha:
generate_schema_ref.pymust be run after any schema change and before the test suite — it writesschema.md; omitting it causes tests to read stale schema data. The script is not invoked automatically by the build pipeline.
Gotcha: Always bump
CI_ACTIVITY_SCHEMA_VERSIONinconstants/paths.pywhen adding a migration. A missed bump leaves the database at an intermediate schema version and causes subsequent migrations to fail.
oak ci team resyncCLI command — self-healing command that replays machine events from a snapshot, letting any team node recover from corrupted or orphaned data caused by FK integrity failures without manual intervention or a full re-onboard — Implement machine resync command to recover from FK bug, Implement team resync CLI command to recover machine events from snapshot, Implement team resync CLI command for machine event recovery
- Fix observation upsert silently dropping rows — SQL
INSERTinteam/pull/applier.pyomitted theteam_idcolumn, causing aFOREIGN KEY constraint failederror on every new observation write;team_idis now drawn from the event payload and included in the statement — Implement team resync CLI command to recover machine events from snapshot
In Progress: Cloud relay WebSocket connections are rejecting with a 401 during team sync; root cause under active investigation — Debug Cloud Relay WebSocket 401 for Team Sync commit
Gotcha: The cloud relay auth token is held only in memory on the server side — no persistent storage. Any new node connecting after a daemon restart will receive a 401 with no detail. Re-deploy the relay via Team → Connectivity to reissue the token.
- Beta release channel (
oak-betabinary) —oak-betainstalls side-by-side with the stable CLI so users can opt into pre-release features without disrupting their primary installation; a dedicatedReleaseChannelenum centralizes channel values across the codebase — Implement beta release channel for Oak CLI, Add beta channel support with oak-beta binary - High-fidelity team sync — team synchronization elevated from "quick sync" to full backup/restore-level fidelity; new members now receive complete historical CI data via a new
/sync/startAPI endpoint, with real-time UI status updates reflecting sync progress — Configure high-fidelity sync strategy flag and module, Implement high-fidelity sync module and expose start API, Implement high-fidelity sync API and UI status updates - LocalTransport for server-mode event propagation — Oak Teams server now emits its own session-level events so connected clients see sessions created on the server machine; previously
_init_team_sync()short-circuited in server mode, leaving server-originated sessions invisible to members — Implement LocalTransport to enable server-mode event syncing, Implement LocalTransport to propagate server-mode events - Connection status icon in daemon UI — live connection indicator wired into the team sync UI — Fix build errors and add connection status icon
- Fix team-routes Gateway pattern: persistent auth 401 errors from fragile
if server_modebranches — further hardened the routing layer to consistently authenticate across server and client modes — Refactor team routes to Gateway pattern, eliminate auth 401 errors - Fix
TeamMembers.tsxreporting zero online members —MEMBER_ONLINE_THRESHOLD_MSwas declared but never used; replaced with5 * TIME_UNITS.MS_PER_SECONDso the online count now matches the members page — Fix build errors and add connection status icon - Fix
check_upgrade_needednever flagging an upgrade — function returnedNonewithout settingstate.upgrade_needed, silencing the "runoak upgrade" prompt — Fix build errors and add connection status icon - Fix
CloudRelayErrorCodeenum crash from duplicate members — duplicate enum entries caused aValueErroron import, preventing the cloud relay module from loading — Fix build errors and add connection status icon - Fix CI daemon startup failure on fresh clone — missing initialization step prevented
make setupfrom starting CI; quickstart documentation updated to reflect the correct sequence — Debug CI start failure and clarify quickstart documentation
- Integration tests refactored for comprehensive multi-language coverage — test suite reorganized to exercise all supported programming languages with a consistent, thorough strategy — Refactor Oak integration tests for comprehensive language coverage
Gotcha:
TeamStatus.tsxexpects the backend to return astatusfield; a missing or mistyped field causes the component to silently render an empty status with no error. Add a defensive default or null-check when extending the/teamendpoint.
Gotcha: The outbox worker does not buffer events locally — if the server is offline when a sync is attempted, the payload is discarded immediately. Changes made while the server is unreachable are lost until a new sync cycle runs after reconnection. See
team/outbox/worker.py.
- Oak Teams single-page Join flow — redesigned team onboarding UX replaces the multi-step Cloudflare-Worker-relay approach with a single seamless flow; a client enters the server URL and receives a bearer token in one page, eliminating manual relay configuration — Plan Oak Teams single‑page Join flow architecture, Implement Oak Teams single‑page Join flow API endpoint
Gotcha: The Join flow requires the server's auto-generated machine key to be present in the config override file (
config/team.py). A missing or corrupted file causes join requests to be rejected with a 404 from the relay. Verify the file exists before testing the flow.
Gotcha: The Join approval flow is synchronous — the daemon writes approval immediately to SQLite but the client UI does not poll for status. Users see no feedback until a manual refresh.
Gotcha: Do not use the Join flow on the machine acting as the team server. This causes authentication conflicts. Client machines must join from a separate device using a member API key generated on the server.
- Oak Teams outbox schema and sync worker — new
outboxtable and database migration replace the previous git-based CI sync with a self-hosted team server; a background sync worker queues events for guaranteed ordered delivery — Implement outbox schema and sync worker for Oak Teams, Add outbox schema and migration for Oak Teams sync - Persistent team and relay status banner — new banner beneath
UpdateBannerinLayout.tsxsurfaces live team and cloud relay health across every page; companion dashboard tiles provide an at-a-glance health view on the daemon home screen — Update UI with persistent team status banner and dashboard tiles, Add persistent team status banner and dashboard tiles via enriched status API - Centralized feature-flag system — Oak API refactored around a unified flag registry; feature availability is now controlled via typed, testable guards rather than ad-hoc conditionals, and new flags can be rolled out without code-path changes (part of the 2/25 Oak API refactoring, not previously documented) — Refactor Oak API and implement centralized feature‑flag system
- Secure bearer token for team identity — team join tokens upgraded from plain unique strings to cryptographically secure bearer tokens; the loopback API key is now persisted on first creation and reused across daemon restarts, eliminating unbounded key proliferation in the database — Implement secure bearer token generation and storage for Oak
- Fix Cursor session capture: missing
SESSION_SECRETcaused hook sessions to be silently dropped — identified thatSESSION_SECRETwas absent from the Cursor hook execution environment in the conduit-test-poc project; correcting propagation restores session capture — Debug missing SESSION_SECRET causing cursor session failure, Fix cursor session capture logic, cherry‑pick minimal changes, clean PR - Fix
hooks.pystdin reader returningNoneon empty stream —_stdin_readerleftresult_holder[0]asNonewhen stdin was empty (e.g., non-interactive CI environments), causing downstreamTypeError; now falls back to an empty string — Fix cursor session capture logic, cherry‑pick minimal changes, clean PR - Fix
oak ci hookcrash from unsupported--timeout=30flag — the CLI__main__.pydoes not recognise this argument, causingSystemExitbefore the hook executes; removed the unsupported flag from hook invocations — Fix cursor session capture logic, cherry‑pick minimal changes, clean PR - Fix docs site build failure: Astro 5.17.1 incompatible with Starlight ≥0.34.8 — bumped Astro to 5.18.0 and updated Starlight and Sharp to latest compatible versions — Update Astro, Starlight, Sharp to latest versions
- OAK Agents docs reorganized — sections restructured and architecture diagram refined for clearer onboarding — Update OAK Agents docs: reorganize section refine diagram
Gotcha: Oak Teams sync stores events as plain strings in SQLite — team keys are indexed but not hashed at rest. Secure the daemon database (
.oak/ci/activities.db) with appropriate file permissions.
Gotcha: The persistent team-status banner polls the daemon's enriched
/teamendpoint, which requires theX-OpenAgent-Team-Keyheader. A missing or invalid key returns a generic 401 with no detail — verify the key is set in.oak/config.yaml.
Gotcha:
SESSION_SECRETmust be present in the environment where Cursor hooks execute. If absent, the hook drops the session silently and logs a[DROP]message. Check.cursor/hooks.jsonenvironment configuration if Cursor sessions are not appearing in the activity log.
Gotcha: Oak Teams API keys serve two purposes — loopback (internal daemon communication) and user-generated (external access) — both stored in the same SQLite table. A missing unique constraint or column mismatch can cause silent key duplication. Inspect
team/server/auth.pyif duplicate loopback keys appear after a daemon restart.
- Security remediation roadmap for OAK codebase — comprehensive review of security and correctness issues produced a phased, prioritized remediation plan organized by severity tier — Plan OAK codebase security remediation tiers
- JWT authentication hardening and FTS input sanitization — implements tier-1 items from the security remediation plan; adds robust token validation and sanitizes full-text search queries to prevent injection and authentication bypass — Implement secure search and JWT authentication with sanitization
- SearchBar component for daemon UI — new search widget for in-UI search across sessions and activity — Refactor utilities, add SearchBar, improve CI and tests
- Quick-start guide — new onboarding documentation for first-time users — Refactor utilities, add SearchBar, improve CI and tests
- Utility refactoring with expanded CI test coverage — shared utility modules reorganised with additional unit tests to support the security hardening work — Refactor utilities, add SearchBar, improve CI and tests
Note: The JWT hardening and FTS sanitization in this entry are the first concrete implementation output from the security remediation roadmap planned earlier in the day. Remaining tiers are tracked in the roadmap produced by the planning session.
- Dynamic focus switching for Oak ACP agent templates — users can now switch a running ACP agent's focus to one of four specialized templates (documentation, analysis, engineering, maintenance) via session configuration, enabling context-appropriate assistance without restarting the agent — Implement dynamic focus switching for Oak ACP agent templates, Implement focus transition logic for Oak ACP agent templates
- Full CI integration for ACP interactive sessions — ACP sessions now trigger Oak tool-usage hooks and generate session summaries, replacing the thin Claude wrapper with a fully OAK-intelligent experience that participates in codebase intelligence like any native session — Implement tool usage hooks and session summaries for ACP flow
- "Oak" agent type filter on session activity page — a new filter option lets users isolate sessions originating from the Oak ACP agent, completing end-to-end visibility of the ACP interactive session flow in the daemon UI — Add Oak agent filter option to session activity page
- Automated smoke-test for ACP daemon architecture — HTTP-based smoke-test exercises the running daemon end-to-end including session creation, tool delegation, and activity recording; also unifies agent naming to
oakacross the ACP module and removes leftover scaffolding artifacts — Implement automated smoke‑test for oak daemon and clean up artifacts
- Upgrade command now launches in a detached subprocess from daemon UI — a new helper spawns
oak upgradeas a detached process so the daemon UI remains responsive during upgrades rather than blocking on the CLI subprocess — Implement detached upgrade command helper for daemon UI
- Fix
daemon_client.pypath construction causingFileNotFoundError—discover_daemonused an unresolved relativerel_pathwhen locating the daemon port file; now resolves the full path viaPath(project_root).resolve() / rel_pathand returnsNonegracefully when the file is absent — Implement automated smoke‑test for oak daemon and clean up artifacts - Fix
_run_upgrade_pipelinetype errors inrestart.py—Pathtype was not imported and therun_in_executorcall passed a plaindictinstead of the requiredUpgradePlaninstance; both corrected to resolve Ruff static-analysis errors and prevent runtime type mismatches — Implement detached upgrade command helper for daemon UI - Fix activity route registration typo and missing authentication —
@router.gedecorator typo prevented the endpoint from registering with FastAPI, and activity routes lacked the sharedAuthorizationheader dependency used elsewhere in the daemon — Implement tool usage hooks and session summaries for ACP flow
Gotcha: ACP focus switching injects a system-prompt override at session-config time. Mid-conversation agents will not retroactively reinterpret earlier messages under the new template — focus changes take effect on the next message boundary only.
Gotcha: The ACP smoke-test expects the daemon's activity store directory (
~/.oak/activity_store) to exist and be writable before tests run. If the smoke-test exits with code 1, verify the directory exists with correct permissions and thatdaemon/config.pypoints to that path.
- ACP (Agent Client Protocol) server for editor integration — OAK can now act as a first-class coding agent that editors communicate with via the ACP pipe; a dedicated
acp_serverfeature module exposes agents over ACP with a non-blocking async stdin reader,AgentSideConnectionwrapper, and Typer-basedserveCLI command — Add ACP SDK dependency and constants module for OAK Agent, Implement daemon‑delegation architecture for OAK ACP server and session manager, Implement session manager integration with daemon‑delegation architecture - ACP integrations UI — new
ACPIntegrationscomponent in the daemon UI shows per-editor integration cards (Zed, etc.) with enable/disable toggles; configuration is rendered from the ACP JSON schema and reloads CLI config on mount to stay in sync with backend — Implement daemon‑delegation architecture for OAK ACP server and session manager
- Upgrade banner prompt text made more descriptive — the UI now displays a clearer label when an automatic update is detected and ready to apply, replacing the previous terse restart prompt — Update Upgrade Prompt Text with Descriptive Label
- Fix
ModuleNotFoundErrorforacppackage in tests — a lightweight local stub providing the minimalacpAPI surface (start_tool_call,text_block,update_age) was added to the repository and declared inpyproject.toml, removing the undeclared external dependency that broke the test suite — Implement daemon‑delegation architecture for OAK ACP server and session manager - Fix SQL syntax errors in
plan_detector.py— escaped inequality operator (\!=) and reference to non-existenttimestamp_epochcolumn caused SQLite parse failures; replaced with standard!=and the correctcreated_atcolumn — Implement daemon‑delegation architecture for OAK ACP server and session manager
Note: The ACP server is shipped as an optional dependency (
acpextra inpyproject.toml). The core OAK distribution remains lightweight; install withpip install open-agent-kit[acp]to enable editor ACP integration.
Gotcha: The
acppackage must be installed in the same virtual environment as OAK. If the daemon raisesModuleNotFoundError: No module named 'acp'at startup, verify the package is present (pip show acp) and that the daemon is running from the correct environment.
Gotcha: The
ACPIntegrationscomponent context provider (AcpIntegrationContext) is created and consumed within the same file and is not exported. Composing ACP integration state into other UI pages requires either lifting state to a shared context or extending the export surface.
- Git worktree support — Oak hooks, daemon lookup, and repo-root resolution now work correctly inside
git worktreecheckouts; a dedicatedWorktreeManagerclass wraps Git subprocess calls and maintains an in-memory registry of active worktrees — Add shell guard to OAK hook templates and enable worktree support, Implement smoke‑test harness for OAK worktree initialization - Team Member filter on session activity page — replaces the Machine filter with a member-based grouping that treats all sessions from the same user as one group regardless of machine;
source_machine_idandplan_countfields added to theSessionItemmodel to support the new display — Add source_machine_id and plan_count to SessionItem model, Update session activity filter to display by team member, Update session activity page with Team Member filter and badge logic - Swift language support via Treesitter parser — adds a Treesitter-based parser for Swift and refactors config to allow Oak to reliably search Swift codebases — Add Treesitter parser for Swift and refactor config
- Upgrade banner now reads the CLI command name from runtime config (
config.command_alias) instead of the hard-coded"oak"constant, so users running a custom alias (e.g.,oak-dev) see the correct command in the banner — Configure daemon banner to use command from config - Project Governance skill updated to focus on amending existing constitutions, with RFC/ADR generation demoted to an optional step rather than the default output — Update Project Governance Skill to Optional RFC Generation
- Fix
resolve_main_repo_root()failing inside git worktrees —.gitis a file (not a directory) in worktrees; the function now detects this, reads the target path, and resolves the root correctly — Add shell guard to OAK hook templates and enable worktree support - Fix upgrade banner persisting after daemon restart —
use-statushook cached the running version in localStorage; cleared on restart so the banner reflects the actual running version — Configure daemon banner to use command from config
Gotcha:
resolve_main_repo_root()previously assumed.gitwas a directory. Inside a worktree it is a plain file containinggitdir: <path>. Any code that calls this helper must be tested in both regular checkout and worktree contexts; imports also require the repository root onPYTHONPATHsince worktrees do not automatically inherit the parent repo's module search path.
Gotcha: The Team Member filter groups sessions by user identity, not by machine. If two developers share the same Git username the filter will merge their sessions into one group. The machine-level
source_machine_idfield is still available in theSessionItempayload for tooling that needs it.
Gotcha: The upgrade banner's hard-coded
UI_COMMANDconstant caused it to show"oak"even when users ran"oak-dev"or another alias. After the fix the banner readsconfig.command_aliasat render time — ensure the daemon is restarted after changing your CLI alias so the config propagates.
- Documentation agent prioritizes newer Python versions — root-docs agent now selects the latest available Python interpreter when generating documentation, improving output quality for Python-version-sensitive content — Refactor documentation agent to prioritize newer Python versions
- Fix
ci_project_statsalways reporting zero unique files and zero memory count —get_stats()was missingunique_filesandmemory_countkeys in its return dict;count_unique_filesalso skipped counting when commits had no files. Both fixed inmanagement.pyandoperations.py— Fix CI projects stats agent project count bug - Fix hover styles disappearing on navigation bar components — Tailwind
group-hoverutilities were not triggering because parent elements were missing thegroupclass after a recent refactor — Debug missing hover styles in navigation bar components - Fix governance plugin error caused by missing or misconfigured Oak governance settings — security guidance plugin hook was loading unconditionally at startup and failing when governance was not enabled in the target project — Configure Oak governance settings to fix plugin error
Gotcha: The Tailwind
group-hoverutility requires the parent element to carry thegroupclass. Navigation components that lost this class during a refactor will silently drop all hover effects — check the rendered DOM if hover styles stop working after restructuring layout components.
Gotcha: The security guidance plugin registers its hook via
hooks.jsonand loads unconditionally at agent startup, regardless of whether governance is enabled in the host project. Projects without Oak governance configured will see a runtime error. Setgovernance.enabled: falsein the project's Oak config, or ensure the plugin is only installed in governed projects.
- Brain Maintenance Agent with writable CI tools — autonomous agent that periodically cleans OAK's memory store: deduplicates observations, archives superseded ones, synthesizes cross-session insights, and emits structured health reports to
oak/insights/data-hygiene.jsonlandbrain-maintenance-decisions.jsonl. Includes amemory_writeflag gating write access and amemory-consolidation.yamltask for orchestrated cleanup workflows — Implement Brain Maintenance Agent with Writable CI Tools, Implement Brain Maintenance Agent system prompt and memory_write flag - Content-hash deduplication for CI memory observations — exact-duplicate observations are now detected and discarded before storage, reducing index bloat and improving semantic search signal-to-noise ratio — Implement content-hash deduplication for OAK CI memory system, Implement content-hash deduplication and model performance tuning
- MCP tool parity for Cloud Relay —
list_memories,list_sessions,get_session,search_code, andexecute_querytools are now exposed to cloud-connected agents via the Cloudflare Relay, giving remote agents the same tool surface as local agents; Oak Activity glob handling and schema gaps also resolved — Add missing MCP tools to Cloudflare Relay, Fix MCP tool exposure, refine Oak activity glob handling - Shared skills directory integration across 7 agents — a
.agents/skills/folder reduces per-agent skill duplication and minimizes installation footprint — Implement shared skills folder for 7 agents reducing duplication, Implement shared skills directory integration across 7 agents - Upgrade-needed banner with migration detection — daemon UI now surfaces a persistent banner when pending
oak upgrademigrations are detected, distinct from the version-mismatch restart banner — Implement upgrade-needed banner with migration detection, Implement unified upgrade and restart banner functionality, Implement unified banner component for upgrade and restart states - Power management state machine for daemon UI — centralized controller with dynamic polling adjusts background activity based on system power state, preventing unnecessary resource use and host machine sleep interference — Implement power management state machine for daemon UI, Implement power state machine with centralized controller and dynamic polling
- Cloud Relay HTTP streaming configuration — Implement Cloud Relay HTTP streaming configuration
- Agent Governance sub-module with observability and optional enforcement — hook-level evaluation of tool calls against configurable rules (e.g.,
no-destructive-bash), audit event logging with session correlation, and deny-mode blocking for high-risk operations. Governance events are now included in team backup/restore for cross-machine consistency — Implement CI governance sub-module with deny mechanism, Add governance audit events to backup system - Session summary dedicated column — summaries migrated from
memory_observationstosessions.summarycolumn (schema v5→v6), improving query performance and eliminating duplicate embeddings in semantic search. Backup restore now backfills summaries from legacy observation format — Migrate session summaries to dedicated column, Fix session summary migration and display issues - Inline session title editing with lineage indicators — session detail page now supports editable titles with a
title_manually_editedflag to prevent LLM overwrites, plus visual indicators showing parent/child relationships in the session list — Implement session title editing and lineage indicators - Cloud MCP Relay with one-click Cloudflare Workers deployment — enables remote MCP server access via WebSocket proxy with automatic worker scaffolding, Wrangler deployment, and in-browser connection status UI — Implement Cloud MCP Relay with WebSocket proxy on Cloudflare Workers, Implement one-click Cloud MCP Relay deployment
- Automated custom domain provisioning for Cloud Relay — users can now specify a base domain and Oak automatically generates a subdomain, configures
wrangler.tomlwith a[[routes]]section, and lets Cloudflare handle DNS and SSL provisioning during deployment (domain zone must be in user's Cloudflare account) — Implement automated custom domain provisioning for Cloud MCP Relay, Implement automated custom domain provisioning with Cloudflare - Dynamic session summarization with multi-model support — summaries now adapt to different model providers (Ollama, LM Studio, cloud APIs) with defensive JSON unwrapping to handle context window truncation — Implement dynamic session summarization for multiple models
- Agent auto-start with daemon readiness polling — agents can now be configured to start automatically when the daemon becomes ready, with polling to detect daemon availability — Configure Oak agent auto‑start and daemon readiness polling
- Local Engineering Team Agent with four integrated tasks (build, test, lint, deploy) — unified local-first agent replaces multiple separate agent configurations with a single promptable interface and modal-based task selection — Implement local Engineering Team Agent with four tasks, Refactor Engineering Agent into unified local-first agent and add prompt modal
- User settings page with notification toggle — settings UI allows users to enable/disable desktop notifications for agent completions and other events — Implement user settings page with notification toggle
- Resolution event propagation across machines — resolution actions (resolve/supersede) are now persisted in a
resolution_eventstable and included in backup/restore operations, ensuring team-wide consistency when observations are resolved — Implement resolution event propagation and backup integration, Implement resolution_events propagation across machines via backup/restore - Context Engineering skill documentation and feature registration — new skill for prompt engineering and context optimization workflows — Add Context Engineering skill documentation and feature registration
- Session-aware memory handling with UUIDs — memory submission now includes
sessionIdfor improved traceability and efficient prompt handling — Implement session‑aware memory handling with UUIDs, Add sessionId to memory handling for efficient prompt submission - Machine-specific source ID filters for background processing — queries now scope to the local machine's source ID, preventing cross-machine data leakage in multi-machine environments — Add machine‑specific source ID filters to background processing queries
- Clear orphan entries functionality in ChromaDB DevTools — UI now provides a dedicated button to identify and remove orphaned embeddings that lack corresponding SQLite records, preventing storage bloat from incomplete cleanup operations — Add clear orphan entries functionality to ChromaDB DevTools
- Power state aware daemon behavior — daemon now scales background processing based on system activity with four states: ACTIVE (full processing), IDLE (maintenance only), SLEEP (minimal I/O), and DEEP_SLEEP (paused). This reduces resource consumption when the user stops coding, allowing macOS to enter proper sleep states. Background tasks like SQLite queries and backups now respect power state transitions — Implement power state aware daemon behavior, Debug idle resource consumption issue
- Observation lifecycle management — observations now track status (
active,resolved,superseded) with session-type awareness (planning,investigation,implementation,mixed), enabling agents to distinguish current knowledge from historical context and filter stale observations from context windows — Implement observation lifecycle management system - Personalized session summaries — LLM-generated summaries now use Git/GitHub usernames instead of generic "the user" references, improving searchability and attribution — Fix date filtering and user identity issues in session summaries
- Memory-observation lineage tracking — observations now link back to their source memory, enabling bidirectional navigation between memories and the observations that created them — Add memory-observation lineage support across codebase intelligence
- Session ID metadata for embedding search — summaries and memories now include
session_idin embedding metadata, enabling filtered searches scoped to specific sessions — Add session_id metadata for searchable summaries and memories, Add sessionId to embedding metadata and database - Inline plan detection via response patterns — plans are now detected heuristically from assistant responses when explicit plan hooks are not available, improving plan capture coverage for agents without native plan support — Add inline plan detection via response patterns
- Daemon version mismatch detection and restart UI — when the
oakCLI is upgraded, the daemon now detects the version difference via a background check (every 60s), displays a banner in the web UI, and offers a one-click "Restart Daemon" button, eliminating manualoak ci restartcalls — Implement daemon version mismatch detection and restart UI - Self-healing stale installation check — daemon now detects when its package installation becomes stale (e.g., after
uv tool installoverwrites an editable install) and surfaces a warning in the UI, preventing silent failures from misaligned package paths — Add self‑healing stale installation check to daemon - Self-healing daemon restart logic with watchdog — daemon now automatically restarts after detecting critical failures, with a watchdog process ensuring recovery from crashes — Implement self‑healing daemon restart logic and watchdog
- Project name displayed in daemon UI browser tab title for better multi-project disambiguation — Add project name to daemon UI tab title
- Local-only hook configuration for all AI agents — hook files are now kept out of version control via
.gitignoreentries and.local.jsonvariants, so contributors who clone a repo without Oak installed see no hook errors. Ahooks-local-onlymigration applies the change on upgrade — Configure local‑only GitHub hooks for Oak‑enabled agents
- Agent prompts and model configurations standardized across the agent system — analysis task prompts now follow a consistent structure and model assignments are explicit, reducing ambiguity during task dispatch — Refactor and standardize agent prompts and model configurations
- Team backups page UI layout and messaging updated for clarity — Update team backups page UI layout and messaging
- Documentation site domain migrated from
oak.goondocks.cotoopenagentkit.app— updated all domain references in Astro config, README, QUICKSTART, and issue templates — Map all domain references for Astro docs migration, Update domain references and fix backup restore logic - Activity detection logic refactored across 56 files — improved hook activity pattern recognition and file change detection strategies — Refactor activity detection logic across 56 files
- Agent architecture refactored to merge prompts into scheduler — agent prompts now flow through the unified scheduler interface rather than separate prompt handling paths, improving consistency and reducing code duplication — Refactor agent architecture and merge prompts into scheduler
- Obsolete
backend-python-expertcommand removed from codebase intelligence feature — dead code cleanup reduces maintenance burden and clarifies the CLI surface — Remove obsolete backend python expert command from codebase intelligence feature, Remove obsolete backend-python-expert command - DevTools database operations refactored to use store layer — maintenance operations (VACUUM, orphan cleanup) now route through the unified store abstraction instead of raw SQL, improving consistency and testability — Refactor devtools to use store layer for database operations
- License updated to 2025-2026 date range with business name as copyright holder — Update license copyright year and holder name
- Batch processing performance improved — batch sizes increased from 10 to 50 items per cycle with parallel processing, significantly reducing memory processing time — Optimize batch processing and database performance
- Codebase refactored into six parallel build streams for independent testing — core, daemon, indexing, memory, activity, and agents can now be tested and validated separately, reducing CI time and enabling targeted development — Refactor OAK codebase into six parallel build streams for independent testing, Refactor OAK codebase into six parallel work streams
- Built-in agent task YAMLs no longer copied into
oak/agents/during installation — the registry now loads built-ins directly from the package, reducing installation footprint and preventing accidental overwrites of user customizations. A cleanup migration removes existing copies on upgrade — Remove built‑in agent task copies and add cleanup migration, Refactor installation to remove built‑in agent task copies generate_schema_ref.pyrelocated from installed skill directory tosrc/open_agent_kit/features/team/scripts/, keeping the build-time script out of agent skill payloads and reducing installed footprint — Refactor schema generation script placement to feature source tree, Refactor generate_schema_ref.py relocation to centralized scripts folder- Hooks-reference documentation cleaned for end-user focus — removed Oak contributor sections and added a "not" section to clarify feature boundaries — Update documentation with Oak‑not section and clean hooks reference
- Fix
ci_project_statsalways reporting zero unique files and zero memory count —get_stats()was missingunique_filesandmemory_countkeys in its return dict;count_unique_filesalso skipped counting when commits had no files. Both fixed inmanagement.pyandoperations.py— Fix CI projects stats agent project count bug - Fix critical executor bug in
_get_effective_execution()causing incorrect task dispatch — standardized analysis task prompts as part of the same cleanup — Fix critical executor bug and standardize analysis task prompts - Fix missing Logs tab in Daemon UI navigation — tab was silently dropped during a left-nav reorder — Fix missing logs tab in Daemon UI navigation
- Fix session lineage auto-linking after plan execution — child sessions now correctly link to parent when executing a plan, resolving orphaned session chains — Fix session lineage auto-linking in Claude Code
- Fix Cursor plan capture detection — plan files created by Cursor are now properly detected and linked to sessions in the codebase intelligence system — Fix Cursor plan capture detection in codebase intelligence
- Fix governance hook event casing mismatch —
HOOK_EVENT_PRE_TOOL_USEconstant was kebab-case (pre-tool-use) but Claude Code sends PascalCase (PreToolUse), causing deny responses to never apply. Now normalizes both sides for comparison — Implement CI governance sub-module with deny mechanism - Fix CLI help text listing
rfcas a primary command when it's agent-only — help output now accurately reflects the command hierarchy withoak cias the primary CI entrypoint — Fix CLI help text accuracy and command separation - Fix MCP server plan resolution and tool call handling — plans now show resolved state correctly during polling, and tool call descriptions are clearer for debugging — Fix plan resolution and tool call handling in MCP server
- Fix "today" filter showing incorrect results due to timezone mismatch — date filtering now correctly handles timezone differences between server and client — Fix date filtering and user identity issues in session summaries
- Fix VS Code Copilot hook crashes — centralized hook formatting and fixed schema validation errors that caused the Copilot integration to crash after recent refactors — Fix VS Code Copilot crash by centralizing hook formatting, Fix VS Code Copilot schema crash after refactor, Fix undefined hook error in VS Code Co‑Pilot integration
- Fix early migration order to refresh agent list — migrations now run in correct order to ensure the agent list is refreshed before the upgrade pipeline processes it — Fix early migration order to refresh agent list for upgrade pipeline
- Fix Oak daemon upgrade error handling — raw error messages are now hidden from users during upgrades, replaced with user-friendly messaging — Fix Oak daemon upgrade error handling to hide raw errors
- Fix "Compact All" button leaving ChromaDB in locked state — the button now triggers a daemon restart after deleting the collection, ensuring the database is cleanly reopened in a fresh process context without manual intervention — Fix Compact All button to restart daemon after deletion
- Fix session summary title generation failing for non-reasoning models — the title extraction regex now handles models that don't emit chain-of-thought reasoning, preventing empty or malformed titles — Fix session summary title generation for non‑reasoning models
- Fix environment and dependency resolution issues affecting Agents SDK and Oak CLI installations — improved path handling and dependency isolation to prevent conflicts between editable installs and tool installs — Fix environment and dependency issues for agents SDK and Oak CLI
- Fix Homebrew tap build failures and update installation documentation to reflect
brew install goondocks-co/oak/oak-cias the recommended macOS install method — Fix Homebrew tap and update Oak CI installation docs - Fix daemon self-restart failing after Homebrew upgrade —
sys.executablepointed to the old deleted Cellar path, causingFileNotFoundError. Now uses/bin/sh -c "sleep N && oak ci restart"which always resolves to the current version on$PATH— Implement daemon version mismatch detection and recovery - Fix Homebrew formula PyPI CDN propagation race condition —
brew installcould fail if the PyPI simple index hadn't propagated the new version yet. Formulapost_installnow retriespip install5 times with 30s backoff, and the tap workflow usespip download --no-depswith 20 retries over 10 minutes — Fix Homebrew tap and update Oak CI installation docs - Fix session auto-linking selecting stale parent —
find_linkable_parent_sessionnow filters by project ID and returns the most recent eligible session, preventing child sessions from linking to unrelated older sessions across projects - Fix Cloud Relay page losing custom domain on refresh — the
/api/cloud/statusendpoint now includescustom_domainin its payload so the UI consistently uses the saved domain after page reload - Fix Cloud Relay spurious error toast on WebSocket connect — the
onErrorhandler now only sets error state when the event payload contains an actual error message, suppressing false toasts on normal connection establishment - Fix
plan_detector.pydefault argument causingFileNotFoundError—known_plan_file_pathnow defaults to an empty string with a guard that skips file I/O on empty input, preventing test-suite failures - Fix Cloud Relay worker deployment missing
wrangler.jsonc— scaffolding now generates a minimalwrangler.jsoncwith worker name, compatibility date, and main script path sonpx wrangler deploycan locate the entry point automatically
Note: The Brain Maintenance Agent uses a
memory_writeflag to gate write access to the memory store. Without this flag set, the agent runs in read-only/analysis mode. Health reports persist tooak/insights/as JSONL files so they survive daemon restarts and can be queried without a database.
Gotcha: The
ci_project_statstool reported 0 unique files when any commit had an empty file list — the oldif not commit.files: continueguard prevented counting files from other commits. After the fix, counts are aggregated across all commits using a set for deduplication. Agents that cached the old zero values should callci_project_statsagain to get accurate counts.
Note: The unified upgrade/restart banner consolidates two previously overlapping UI states —
update_available(version mismatch requiring daemon restart) andupgrade_needed(schema/config migrations requiringoak upgrade) — into a single banner component with distinct messaging for each state.
Note: The shared
.agents/skills/directory is the new canonical location for skills shared across multiple agents. Per-agent skill copies are no longer installed duringoak upgrade; agents now resolve skills from the shared directory at runtime.
Note: The power management state machine for the daemon UI introduces a
usePowerStatehook that centralizes polling intervals. Components that previously polled at fixed intervals now derive their polling rate from the shared power state, reducing CPU and network overhead during idle and sleep states.
Gotcha: Governance hook event names use different casing across agents — Claude Code sends
PreToolUse(PascalCase), but constants may be defined aspre-tool-use(kebab-case). The governance engine now normalizes all event names with.lower().replace("-", "").replace("_", "")to handle all variants.
Gotcha: Session summaries were previously stored as
memory_observationswithmemory_type='session_summary'. After the v5→v6 migration, they live insessions.summary. Backup restore includes a backfill function (_backfill_session_summaries_from_observations) to handle legacy backup files that still use the old format.
Gotcha: Governance audit events are stored in
governance_audit_eventsand are now included in team backups. If restoring a backup from before governance was implemented, the audit table will be empty but functional.
Gotcha: SQLite's VACUUM command cannot run within a transaction context — attempting to do so raises
OperationalError: cannot VACUUM from within a transaction. DevTools maintenance operations now explicitly close any active transaction before running VACUUM.
Gotcha: ChromaDB delete operations can fail silently and leave orphaned entries. The new "Clear Orphan Entries" button in DevTools identifies embeddings that lack corresponding SQLite records and removes them with retry logic to handle transient failures.
Gotcha: The version mismatch detection writes a stamp file (
.oak/ci/cli_version) only when the CLI runs, so it adds no overhead to normal operation. However, therestartDaemonAPI call must be awaited before updating the UI — otherwise stale data may be displayed.
Gotcha: When automatic built-in task installation is disabled, any missing built-in task files will cause runtime errors if agents reference them. Ensure required tasks are present in
oak/agents/before running the pipeline, or rely on the registry's built-in loader.
Gotcha: The project name in the browser tab is sourced from
window.projectNameinjected by the server. If this variable is missing or undefined, the title defaults to just the static suffix.
Gotcha: After the
hooks-local-onlymigration, hook config files (e.g.,.cursor/hooks.json,.windsurf/hooks.json) are gitignored and exist only on machines with Oak installed. Hooks already degrade gracefully when files are absent, so contributors without Oak are unaffected — but developers must runoak upgradeto regenerate local hook files after a fresh clone.
Gotcha: The daemon self-restart route must not use
sys.executablebecause Homebrew upgrades delete the old Cellar path. If you seeFileNotFoundErrorduring restart, verify that theoakbinary on$PATHpoints to the current version (which oak).
Gotcha: The "Compact All" button in DevTools deletes the ChromaDB collection, but ChromaDB holds file locks that persist until the process exits. Without a daemon restart, subsequent re-indexing fails with database lock errors. The fix triggers an automatic restart after deletion to cleanly reopen the database.
Gotcha: VS Code Copilot hook crashes were caused by schema validation running before hook formatting centralization. If you see hook errors after an upgrade, run
oak upgradeto regenerate hook configurations with the corrected schema handling.
Gotcha: Inline plan detection uses heuristic response patterns (e.g., numbered steps, "Implementation Plan" headers). False positives are possible for assistant responses that resemble plans but aren't. The detector favors recall over precision — plans are better captured twice than missed.
Gotcha: Power state idle detection requires a fallback to
start_timewhenlast_hook_activityis None. Without this, the daemon stays in ACTIVE state forever if no hooks fire after startup (e.g., daemon starts and user walks away). The fix useslast_activity = daemon_state.last_hook_activity or daemon_state.start_time.
Gotcha: Resolution events are stored separately from observations in the
resolution_eventstable. When backing up/restoring, both tables must be synchronized — if resolution events are missing, observations may incorrectly appear as unresolved on the target machine.
Gotcha: Machine-specific source ID filters in background processing queries prevent cross-machine data leakage but require the
source_machine_idcolumn to be populated. Observations created before this column existed will have NULL source IDs and may be filtered out unexpectedly.
Gotcha: The
store_resolution_eventhelper requires the observation ID and action status to be passed explicitly. Forgetting to provide these arguments leads to silent failures or incorrect event logging.
Gotcha: Observation lifecycle status defaults to
active. When querying memories viaci_memoriesorci_search, usestatus=activefor current knowledge andinclude_resolved=trueonly for historical documentation (e.g., changelogs). Resolved observations represent what was true, not what is true.
Gotcha: Session origin types (
planning,investigation,implementation,mixed) are inferred from file changes and code patterns. Planning-originated observations are more likely to become stale after implementation work completes — the auto-resolve system uses semantic similarity to detect when newer observations supersede older ones.
Gotcha: The batch processing size (now 50 items per cycle) is a magic number that was refactored into a configurable constant. If processing appears slow, check that the batch size hasn't been inadvertently reduced, and ensure parallel processing is enabled to avoid database locking issues.
Gotcha: Ollama often uses a smaller default context window than LM Studio for the same model, causing output format instructions at the end of long prompts to be truncated. This leads models to return JSON (e.g.,
{"summary": [...]}) instead of plain text. The_unwrap_json_summary()function insummaries.pyhandles this defensively.
Gotcha: Cloud relay WebSocket connections require an active worker deployment to validate. The connection handler checks for worker availability before establishing the WebSocket, and errors are shown only when new actual errors occur rather than showing transient states.
Gotcha: The
title_manually_editedflag prevents LLM-generated titles from overwriting user edits. However, if a user clears the title field and saves, the flag remains set — the title won't auto-regenerate until the flag is explicitly cleared.
Gotcha: Custom domain provisioning for Cloud Relay requires the domain zone to reside in the user's Cloudflare account. If the zone is managed elsewhere, automatic DNS/SSL provisioning will fail silently and the worker will fall back to the default
workers.devURL.
Gotcha: UI state for saved custom domains is not persisted across page refreshes — users may need to re-save the domain after refreshing the Cloud Relay settings page.
Gotcha: Content-hash deduplication compares the full text of observations before insertion. Two observations with identical content but different metadata (e.g., different
session_idormemory_type) are treated as duplicates — only the first is stored. If you need to record the same insight across multiple sessions, vary the observation text slightly or rely on session-level attribution via thesession_idmetadata.
Gotcha: Session-linking microsecond precision —
SESSION_LINK_IMMEDIATE_GAP_SECONDSandSESSION_LINK_STALE_GAP_SECONDSthresholds are defined in whole seconds, but timestamp comparisons include microseconds. Sessions that end within the same second as a new one starts may be misclassified as stale or immediate depending on microsecond ordering. This is most visible under rapid "clear context and continue" operations.
Gotcha: The restore API does not automatically generate governance audit entries for restored data. If your workflow requires a full audit trail across restores, trigger audit logging manually after a successful restore.
- Homebrew tap (
goondocks-co/oak) for macOS installation with auto-generated formula and CI workflow to keep the formula in sync with PyPI releases — Add Homebrew tap for oak‑ci with auto‑generated formula and CI sync - OAK-managed file tracking in
oak remove— agent task YAMLs anddaemon.portare now recorded viaStateServiceand automatically cleaned up on removal, while preserving user content (constitution.md, RFCs, plans) and backup history — Implement OAK‑managed file cleanup in oak remove
- Fix
oak/daemon.portnot created on fresh installs when no git remote is defined, causing daemon startup failures — Fix daemon port creation and enforce Python version requirement - Fix
oak removeleaving behind OAK-generated agent task files anddaemon.port, requiring manual cleanup — Fix oak remove to delete agent task files and daemon port - Enforce Python version requirement in install script and documentation — users installing via
pipxoruvmust now specify--pythonto avoid Homebrew defaulting to an unsupported interpreter (e.g., 3.14) — Fix daemon port creation and enforce Python version requirement
Gotcha: Homebrew formula for oak-ci uses
python -m venvdirectly (notvirtualenv_create) because Homebrew's helper passes--without-pip. Key details: (1)venv.pip_installuses--no-depsso deps won't install — the formula usessystem libexec/"bin/pip", "install"instead, (2)homebrew-pypi-poetrequiressetuptools<81on Python 3.13, (3)bin.install_symlink libexec/"bin/oak"is needed to expose the binary.
Gotcha: The removal logic now distinguishes between OAK-managed files (agent task YAMLs,
daemon.port) and user-generated content. If custom files are placed inoak/agents/with names matching theagent-*.yamlpattern, they may be incorrectly treated as OAK-managed and removed duringoak remove.
Gotcha: If the
--pythonflag is omitted when installing withpipxoruv, Oak may be installed against an unintended Python interpreter (e.g., Homebrew's Python 3.14), leading to runtime errors from incompatible dependencies likechromadbandpydantic.
- Published
oak-cipackage to PyPI (v1.0.2) with cross-platform install script supporting macOS, Linux, and Windows PATH detection — Publish oak-ci 1.0.2 and fix install script - Concise feature request issue template for GitHub — Add concise feature request template to repo
- CI workflow with idempotent install scripts, mypy gating, and custom domain for GitHub Pages documentation — Configure CI workflow and idempotent install scripts
- Agent-kit templates refactored for consistent placeholders (
{{ agent_name }},{{ skill_name }}) with automatic injection during upgrades — Refactor Oak agent‑kit templates for consistent placeholders and upgrade auto... - Repository history cleaned and squashed for public open-source release — Refactor repository history for clean public release
.oak/state.yamlexcluded from version control and leftover installer migrations removed for clean first-run experience — Configure .oak/state.yaml exclusion and remove leftover migrations- Agent indexer configured to ignore build artifact directories — Configure agent to ignore build artifact directories
- Fix GitHub Pages broken links,
baseurlconfiguration, and hard-coded documentation URLs across README, QUICKSTART, and issue templates — Fix GitHub Pages links, update baseurl, and correct documentation URLs - Fix install script failing to add agent binary to PATH on macOS due to incorrect shell detection logic — Publish oak-ci 1.0.2 and fix install script
- Daemon UI TaskList CPU usage reduced from ~10% to ~2% idle via
React.memo,useCallback, debounced search, and batched API requests — Refactor TaskList to Reduce CPU Usage in Oak Daemon UI - Test suite audited: stale imports removed, test-to-source mapping updated, orphan tests flagged — Debug test suite audit and stale import cleanup
Gotcha:
.oak/state.yamltracks applied migration names. If migrations are removed from the codebase but their names remain in state.yaml, the migration runner may attempt to reference non-existent modules, causingImportErroror silent failures during startup. After a clean release, ensure state.yaml is reset or excluded from version control.
Gotcha: The install script must handle both user-local and system installations. On macOS,
~/.local/binmay not be on PATH by default — the installer now appends it to the appropriate shell profile (.zshrc,.bash_profile), but users with custom shell setups should verify manually.
Gotcha: GitHub issue templates must be placed in
.github/ISSUE_TEMPLATE/with the.ymlextension. A missing or misnamed file will silently not appear in the issue creation UI.
- Token-based authentication for daemon API and UI with file-backed secrets — Implement token‑based authentication for API and UI
- Automatic backup fallback with configurable interval and UI countdown timer — Implement automatic backup fallback and UI timer update
- Unified backup system with user-controlled settings and pre-upgrade hooks — Configure unified backup system with user‑controlled settings
- Refresh button on Activity plans page with lightweight backend logic — Add Refresh button to Activity plans page with lightweight backend logic
- Security hardening roadmap for CI daemon API — Configure security hardening roadmap for CI daemon API
docs-site-syncagent for Astro documentation build and accessibility validation — Implement docs-site-sync agent for Astro build and accessibility- Machine-specific config overlay for Oak CLI with per-host settings — Implement machine‑specific config overlay for Oak CLI
- Fresh install cleanup logic in migration framework — Refactor migration framework for fresh install cleanup
- Debug tooling for analysis agent build vs upgrade generation workflow — Debug analysis agent build versus upgrade generation process
- Analysis skill for querying Oak CI databases with auto-generated schema references — Implement analysis skill for Oak CI database queries
- Scheduled backup agent with UI controls for automated CI data protection — Implement scheduled backup agent with UI controls
- Root check and daemon cleanup logic to
oak upgradecommand — Add root check and daemon cleanup to Oak upgrade command - CI/CD pipelines and packaging strategy for PyPI release — Configure CI/CD Pipelines and Packaging Strategy for PyPI Release
- Machine ID injection across codebase for multi-machine backup disambiguation — Refactor machine ID injection across codebase
- Pluggable tunnel sharing for CI daemon with Cloudflare and ngrok providers — Implement pluggable tunnel abstraction for Oak CI sharing
- Tunnel configuration UI and sharing help documentation on the Team page — Add tunnel configuration UI and help docs
- Configurable CI backup directory via
OAK_CI_BACKUP_DIRenvironment variable — Configure CI backup directory via environment variable transcript_pathcolumn on sessions for transcript recovery and orphan detection — Add transcript_file_id column to sessions for recovery- "Complete Session" button on session detail page for manual session completion — Fix related session links and modal double‑click bug
- Database-backed agent schedules with UI management — Implement database-backed schedules and UI
- Quick-access panel in daemon UI for CLI agent commands — Configure daemon UI quick‑access panel for CLI agents
- Generic agent summary hook with Markdown rendering support — Implement generic agent summary hook and Markdown rendering
- OTLP logging integration for Codex agent — Implement OTLP logging for Codex integration
- Comprehensive Claude Agent SDK documentation covering Ollama and LM Studio local model integration — Add comprehensive Claude Agent SDK documentation and UI refresh
- Token usage tracking in executor for cost optimization and resource monitoring — Audit and outline Claude Agent SDK improvements
- OTEL (OpenTelemetry) support with dynamic notify configuration in Oak daemon — Configure OTEL support and dynamic notify in Oak daemon
- Session summary extraction from transcripts on session stop — Implement daemon summary extraction for session stop
- OTLP telemetry integration for Codex agent — Implement OTLP telemetry integration for Codex
- Session change summary logging in daemon — Update daemon to log session change summaries
- Dynamic project root discovery for documentation agent tasks — Implement dynamic project root discovery for documentation tasks
oak ci synccommand for daemon and backup alignment — Implement oak ci sync for daemon and backup alignment- Activity backup and health monitoring via
oak ci sync— Update oak ci sync for activity backup and health - Upgrade logic for built-in task templates with stable identifier support — Implement upgrade logic for built‑in task templates
- Filter chips and context indicator for daemon log viewer — Add filter chips and context indicator to daemon log viewer
- Minimum activity check before generating session titles — Add minimum activity check before generating session titles
- Safe reset all processing state with confirmation dialog — Implement safe reset all processing state with confirmation
- Python, JavaScript, and TypeScript language support for Oak — Add Python, JavaScript, TypeScript support to Oak
- Row highlight for memory page search results — Add row highlight for memory page search results
- Collapsible left navigation and pause-scroll logs — Implement collapsible left navigation and pause‑scroll logs
- Watchdog timeout for Cloud Agent SDK — Implement watchdog timeout for Cloud Agent SDK
- Dynamic agent discovery in Daemon UI — Configure Daemon UI for Dynamic Agent Discovery
- OpenCode agent integration with CI plugin support — Add OpenCode agent integration with CI plugin and cleanup
- Session search endpoint and UI integration for finding sessions — Implement session search endpoint and UI integration
- User-driven session linking with embedding-based suggestions — Implement user‑driven session linking with embeddings
- Skills subcommand and upgrade detection for Gemini agent — Add skills subcommand and upgrade detection for Gemini
- Cross-platform hook installation helper for consistent setup — Implement cross‑platform hook installation helper
- Deterministic CI daemon port derived from git remote URL — Implement deterministic CI daemon port via git remote URL
- Privacy-preserving CI backup identifier using hashed paths — Implement privacy-preserving CI backup identifier
- Persistent SQLite-backed agent run history with separate UI tabs for history and configuration — Implement SQLite run history and UI tabs
- Reusable Activity component for the daemon UI, improving consistency across different views — Refactor daemon UI and add reusable Activity component
- "Reprocess Observations" button with hash recompute functionality for memory management — Add Reprocess Observations Button and Hash Recompute
- Memory threshold strategy and re-processing plan for better memory management — Implement memory threshold strategy and re-processing plan
- Session linking and auto memory observation creation for improved traceability — Implement session linking and auto memory observation creation
- Codebase intelligence architecture and roadmap planning — Plan codebase intelligence architecture and roadmap
- Documentation Agent refactored to split root files and handle per-directory documentation separately — Refactor documentation agent to split root files
- Open Agent Kit skills consolidated into two primary skills (oak and oak-ci) for simpler installation — Refactor Open Agent Kit into Two Consolidated Skills
- Backup system redesigned with 3 unified functions (
create_backup(),restore_backup(),restore_all()) replacing 4+ code paths — Add backup/restore feature with new CLI commands - Oak constants refactored to align with flattened directory structure (
oak/instead ofoak/ci/) — Refactor Oak constants to align with flattened directory structure - Documentation updated: agents guide, CI models reference, and lifecycle diagrams — Update Oak documentation: agents, CI models, lifecycle diagrams
- Stale agent capability data removed from configuration — Refactor config to remove stale agent capability data
- Documentation site migrated to Starlight with updated Makefile and RFC-001 — Update Oak docs: Starlight site, Makefile, and RFC‑001
- Upgrade detection rewritten to manifest-driven hook checks supporting plugin, OTEL, and JSON hook types — Refactor upgrade detection to manifest‑driven hook checks
- Tunnel code refactored to eliminate magic literals — Audit tunnel code for magic literals
- Refactored terminology from "Instance" to "Task" across codebase for clarity — Refactor terminology from Instance to Task across codebase
- Agent schedules now persisted to database instead of in-memory storage — Update agent schedules to database persistence
- Makefile refactored to remove
.venvdependency for cleaner builds — Refactor Makefile to remove .venv dependency - Refactor Agent Instance to Configuration across UI and API — Refactor Agent Instance to Configuration across UI and API
- Configure plan capture workflow for Claude sessions — Configure plan capture workflow for Claude sessions
- Removed unused issue provider functionality — Refactor codebase: Remove unused issue provider
- Enabled all CI features by default in Oak — Refactor Oak to enable all CI features by default
- Refactored agent hook installation to manifest-driven approach — Refactor agent hook installation to manifest‑driven approach
- Refactored MCP server installation to cross-platform Python API — Refactor MCP server installation to cross‑platform Python API
- Refactored scheduling system to use cron YAML instead of saved_tasks — Refactor scheduling system: remove saved_tasks and add cron YAML
- Refactored Oak session handling to write directly to database — Refactor Oak session handling to direct DB writes
- Refactored manifest to isolate CI settings and add plan hooks — Refactor manifest to isolate CI settings and add plan hooks
- Moved CI history backups into
oak/ci/historydirectory — Refactor CI history backups into oak/ci/history directory - Refactored session titles and summary generation logic for better readability — Refactor session titles and summary generation logic
- Updated daemon and dashboard session sorting to show latest activity first — Update daemon and dashboard session sorting to latest activity
- Session lineage card now collapsible with lint cleanup — Update session lineage card collapsable behavior and lint cleanup
- Adjusted agent timeouts and fixed stale hook configuration — Fix stale hook configuration and adjust agent timeouts
- Fixed MCP server resilience to daemon restarts with token refresh, guard reset, and 3-attempt retry loop — Debug CI daemon API hook integration and auth headers
- Fixed UI agent resume button not appearing for CodeX sessions after model name format change to
GPT-5.3/codex— Fix UI agent bug and add Gemini resume CLI command - Fixed Gemini CLI not recognizing
resumecommand with space-dash-space variant — Fix UI agent bug and add Gemini resume CLI command - Fixed
/backup/lastendpoint returning empty 200 instead of 404 when no backup exists - Fixed React error #310 in SessionDetail.tsx caused by hooks called after early returns
- Fixed MCP server 401 errors by adding daemon token file reading and Bearer header injection
- Fixed Windsurf agent freeze caused by
show_outputhooks blocking event loop — Fix Windsurf agent freeze by removing show_output hooks - Fixed ChromaDB session cleanup leaving orphaned embeddings after SQLite deletion — Add cleanup logic for embedded ChromaDB sessions
- Fixed
/devtools/compactendpoint raisingNameErrordue to undefined variable reference — Debug daemon devtools failure after corrupted state cleanup - Fixed built-in Oak tasks not flagged as
is_builtinin agent registry, causing incorrect UI display - Fixed
prompt_batchestable missingcreated_atcolumn causing query failures - Fixed cascade assistant infinite loop when
lastSelectedCascadeModelfield is empty in Windsurf settings - Fixed activity routes missing from FastAPI application causing 404 errors on
/activity/...endpoints - Fixed related session links not navigating in daemon UI and link-session modal requiring double-click — Fix related session links and modal double‑click bug
- Fixed sharing configuration placed on wrong page and stabilized flaky async tests — Fix sharing configuration placement and stabilize test suite
- Fixed
uv tool installsilently destroying editable installs by detecting PEP 610direct_url.jsonand conditionally passing-e— Configure CI backup directory via environment variable - Fixed missing
.oak/agents/directory afteroak initcausing downstream failures — Fix missing agents directory after oak init - Fixed
hooks.pyusingPath.cwd()instead of project root, causing silent data loss when Claude Code changes working directory — seehooks.py - Fixed
get_backup_dirresolving relative to cwd instead of project root, causing misplaced backups in tests — seebackup.py - Fixed session schema drift: SQL queries referencing renamed
sessions.session_idand removedstarted_at_epochcolumns — seesessions.py - Fixed
SessionLineagequery running whensessionIdis undefined after refactor removedenabledguard — seeSessionLineage - Renamed agent tasks now correctly installed during upgrade (name-based lookup replaced with stable identifiers) — Implement upgrade logic for built‑in task templates
- Fixed Vite configuration causing UI build failure — Configure minimal Vite config to fix UI build
- Fixed UI build error related to dependency injection setup — Fix UI build error and outline DI plan
- Fixed filter chips in Logs page clearing entire log list instead of filtering — see
Logs.tsx - Fixed
indexStatsvariable not defined in Dashboard.tsx causing TypeScript build failure — seeDashboard.tsx - Fixed session summary not rendering as Markdown in MemoriesList component — see
MemoriesList.tsx - Fixed DevTools maintenance card layout wrapping below header instead of beside it — see
DevTools.tsx - Fixed Daemon UI bugs and added developer tools — Fix Daemon UI bugs and add developer tools
- Fixed failing hook import in CI test suite — Debug failing hook import in CI test suite
- Fixed plan capture workflow for Claude sessions — Configure plan capture workflow for Claude sessions
- Fixed MCP upgrade dry run inconsistencies — Debug MCP Upgrade Dry Run Inconsistencies
- Fixed Claude code causing 100% CPU hang — Debug Claude code causing 100% CPU hang
- Fixed agent executor behavior after refactor — Fix agent executor behavior after refactor
- Fixed CLI crash from
AttributeError: 'list' object has no attribute 'items'caused byregistered_groupsbeing overwritten with a list during refactoring - Fixed failing test
test_plan_service.py::test_create_plan_from_issueby removing call to non-existent issue provider - Fixed system health card truncating summarization model name by replacing hard-coded slice with CSS
text-overflow: ellipsis - Fixed dashboard displaying incorrect session count by using
count_sessions()instead of recent sessions count - Fixed orphaned memory entries by adding cascade delete for dependent observations
- Fixed upgrade service leaving empty parent directories after settings file deletion
- Fixed orphan-recovery logic not detecting plans due to
PROMPT_SOURCE_PLANconstant mismatch - Fixed CI backup filename leaking full path by using privacy-preserving hash — Fix CI backup filename privacy bug
- Fixed agent executor crash on unexpected errors by adding broad exception handling — see
executor.py - Fixed CI process hanging when MCP configuration is missing by adding defensive check and fallback — see
.mcp.json - Fixed macOS hook hang caused by missing
timeoututility by using portable alternative — seeoak-ci-hook.sh - Fixed startup indexer globbing entire home directory due to unescaped path characters
- Fixed daemon startup failure caused by
sleepreceiving non-numeric argument - Fixed TypeScript build error from missing
Switchcomponent export — seeSchedules.tsx - Fixed duplicate parent suggestions by checking existing linked sessions before proposing
- Fixed
VectorStore.find_similar_sessionsmethod signature mismatch with call site - Fixed
rebuild_indexendpoint type error when stores areNoneby adding explicit dependency injection - Fixed session lineage not displaying by wiring
useSessionLineagehook result into component render - Fixed agent removal not cleaning up plugin directory and opencode.json by adding deletion logic to pipeline stages
- Fixed plan file not being captured by adding
postToolUsehook entry - Fixed skill upgrade detection only checking first agent by iterating over all configured agents
- Fixed MCP tools endpoint returning empty response due to malformed constant definition — see
mcp_tools.py - Fixed upgrade service only reporting Claude hook updates by rewriting detection loop to iterate all agent directories
- Fixed memory listing UI incorrectly showing plan entries by adding type filter
- Fixed UI build failure caused by missing
react-scriptsdependency - Fixed CI plan capture and Markdown UI rendering issues — Fix CI plan capture and Markdown UI rendering
- Fixed backup and restore feature completion status — Debug backup and restore feature completion status
- Fixed
/plansAPI endpoint returning 500 error when no plans exist by ensuringget_plans()always returns a list — seestore.py - Fixed session summary endpoint returning empty strings by adding missing
Summarizer.process_sessioncall - Fixed
RetrievalEnginenot being exported correctly from its package, causingImportError— seeretrieval/__init__.py - Fixed race condition where concurrent hook calls could corrupt in-memory state by adding thread-safety around state mutations
- Fixed off-by-one error in
PromptBatchActivities.tsxthat skipped rendering the last activity - Fixed backup process not triggering recomputation of
computed_hash, leading to stale backups — seebackup.py - Fixed
parent_session_idforeign key not being re-established during backup restore - Fixed deletion routine causing orphaned Chroma embeddings by reordering operations to delete from Chroma before SQLite commit
- Fixed watcher showing inflated file counts after deletions by adding
watcher_state.reset()after full rescan — seewatcher.py - Fixed batch status being set to 'completed' before patches were applied, causing the loop to skip processing
- Fixed first prompt in session incorrectly marked as plan by checking prompt text against known patterns
- Fixed duplicate plans appearing by adding
session_idfilter toget_plansquery - Fixed internal server error caused by missing newline before
ActivityStoreclass definition - Fixed legacy null-check for
source_machine_idcolumn that caused unnecessary conditional logic in restore - Fixed summary capture activity and Cursor hook payload handling — Add summary to capture activity and fix cursor hook
- Fixed notification deduplication dropping events due to timestamp suffix in event key — see
notifications.py - Fixed Claude Code transcript parsing to handle nested message format (
{type: "assistant", message: {...}}) — seetranscript.py - Fixed notification installer guard logic incorrectly skipping script generation — see
installer.py - Fixed CI command package missing submodule exports causing import failures — see
ci/__init__.py - Fixed OTEL route accessing manifest as dict instead of Pydantic model — see
otel.py - Fixed response summary not captured when user queues a new message while Claude is responding (interrupt bypasses Stop hook) — added fallback capture in
UserPromptSubmit— seehooks.py - Fixed stale session recovery race condition where resumed sessions were immediately marked stale due to empty prompt batch — see
sessions.py - Fixed backup restoration failing when run from different working directory due to relative path check — see
backup.py - Fixed SQL query referencing non-existent
parent_reasoncolumn in sessions table — seehooks.py - Fixed syntax errors in
hooks.pycaused by incomplete edits leaving stray characters — seehooks.py - Fixed notification config template auto-generating unwanted language field — see
notify_config.toml.j2 - Fixed prompt batch finalization logic duplicated across routes by extracting to shared helper — see
batches.py
- Session URLs in changelog now link directly to daemon UI for better traceability
- Executor now uses runtime lookup of daemon port for greater deployment flexibility
- Hook timeout increased to reduce flaky failures during heavy local LLM workloads
- Session end hook now auto-generates pending titles from session summary for better discoverability
- Codex VS Code extension OTel configuration validated — project-local
.codex/config.tomlis syntactically correct but extension only reads global config — Configure OTel settings for Codex VS Code extension - Quality gate (
make check) cleaned up: removed blocker comments and verified full test suite passes — Refactor blocker comments and run full quality gate check
Gotcha: The Codex VS Code extension only reads the global
codex.tomlfor OTel settings — project-local.codex/config.tomlis ignored by the extension. Place OTel configuration in the global file if targeting the extension.
Gotcha: Backup directory paths configured via
OAK_CI_BACKUP_DIRmust be absolute. Relative paths silently resolve to cwd, which can produce unexpected file locations if the process changes directories.
Gotcha: The
uv tool installcommands infeature_service.pyandlanguage_service.pypreviously destroyed editable installs. If you experience stale daemon assets orPath(__file__)resolving tosite-packages, verify withoak --python-path -c "import open_agent_kit; print(open_agent_kit.__file__)"— the path must contain your source tree.
Gotcha: Agent YAML files must be placed in
oak/agentswith the exact same filename as the built-in version; otherwise the registry will not find them and the default task will be used. A missing or renamed file silently falls back to the core definition.
Gotcha: The daemon port file is now expected at
oak/instead ofoak/ci/. Documentation or tooling referencing the old path will fail to load runtime configuration.
Gotcha: The
UpgradeServiceperforms a dry-run check first. Runningoak upgradecompares template files against the latest version and reports "already up to date" if no differences are found. It does not trigger the asset build step — runoak buildexplicitly after modifying skills.
Gotcha: The next auto-backup time is calculated as
last_backup + interval. If no previous backup exists, an immediate backup is scheduled. This approach avoids cron complexity but may drift if backups take longer than expected.
Gotcha: Astro's
output: 'static'mode triggers prerendering for all routes without dynamic data. Ensure the docs site has no server-only routes before enabling this optimization.