Commit Graph

563 Commits

Author SHA1 Message Date
Jason (Json) a4ae339903 docs: prefer gh attach for PR media (#127417) 2026-08-21 13:55:28 -06:00
Josh Avant ccbfa6c3a3 feat(ui): explain decision receipts in Activity (#126007)
* fix(audit): project safe decision receipt displays

* docs(agents): preserve audit display privacy

* fix(ci): satisfy audit receipt guardrails
2026-08-21 11:33:32 -07:00
Vincent Koc 73ff2d2f45 fix(agents): distinguish review routing from enforcement (#126216) 2026-08-20 23:47:14 -07:00
Peter Steinberger 147edf47f3 fix(auth): keep a retired auth JSON from stranding a migrated store (#126562)
* fix(auth): keep a retired auth JSON from stranding a migrated store

Runtime failed closed with AUTH_PROFILE_MIGRATION_REQUIRED whenever a retired
credential file was present, even when the canonical SQLite store already held
the agent's profiles. One leftover auth.json therefore made a fully migrated
install unusable, and the gateway lifecycle preflight refused start/restart on
top of it, so every channel and provider stayed offline until Doctor ran.

A legacy file is now only fatal when the canonical store cannot serve
credentials. Doctor's importer never overwrites a usable stored credential, so
a file sitting beside a populated store is unarchived bytes, not pending
migration: runtime logs a one-time warning and keeps serving. An empty store
with a credential file still fails closed and never falls through to
environment auth. Startup degrades that owner to configured-unavailable
instead of refusing to boot, which lets the lifecycle preflight go away.

* refactor(secrets): retire the auth-profiles.json vocabulary

Auth profiles moved to SQLite, but operator-facing surfaces still named the
retired JSON file. The duplicate-agentDir error told operators to copy
auth-profiles.json to share credentials, which does nothing and lands the
second agent in a migration-required state; `openclaw migrate plan codex`
reported a target file that is never created; and the secrets picker labelled
candidates with a filename that no longer exists.

Renames the SecretTargetConfigFile discriminator to "auth-profile-store" and
corrects the operator-facing text, the migrate plan target, and the docs that
described the file as a live target. Genuine legacy-filename uses in doctor,
the security fixer, and migration fixtures are unchanged.

Also deletes resolveSecretPlanTargetByPath and ResolvedSecretPlanTarget from
the plugin SDK. They have no callers in core, plugins, or tests, and the
symbols are absent from the latest stable tag, so they carry no compatibility
obligation and are removed rather than deprecated. Their inline parameter type
was the only thing putting the retired filename on the public SDK surface.

* improve(wizard): warn about device-code phishing

The device-code prompt only warned against sharing the code, and only when an
expiry was known. Device-code phishing works the other way around: the attacker
starts the login and gets the victim to enter the attacker's code. Codes
delivered over a chat channel are the risky case and carry no expiry hint, so
the warning is now unconditional and covers received codes, matching the Codex
CLI prompt.

Also documents the Codex auth handoff: a subscription profile is installed as
in-memory external auth rather than persisted, and token refresh is inverted
so the refresh token stays in OpenClaw's store.

* fix(test): make transcript read-failure injection order-independent

server.sessions.compaction-read-errors.test.ts injected its failures with
mockRejectedValueOnce, which fails the NEXT call to loadTranscriptEvents
globally. Under --isolate=false a shard shares one worker, so any sibling
transcript read could consume the one-shot rejection before the compaction RPC
issued its own; compaction then ran against the real reader and returned ok,
failing three assertions. This shard was already red on main; a prior repair
fixed the mock's initialization order but left the call-order dependency.

Key the injection on the seeded sessionId instead, so unrelated readers cannot
consume it and the re-read case counts only its own session's reads.

Also updates two expectations invalidated by this branch: the duplicate-agentDir
remediation text, and the plugin SDK export ratchet, shrunk by the two retired
secret-plan exports.
2026-08-20 00:42:41 -07:00
Peter Steinberger b740c68bb5 fix(pr): distinguish owner review from independent approval (#126475) 2026-08-19 16:37:34 -07:00
Peter Steinberger 8c3b3c6ea8 feat(agents): link PRs to public work sessions (#126057)
* feat(agents): link PRs to public work sessions

* fix(agents): preserve cron prompt cache for PR links
2026-08-18 21:13:27 -07:00
Josh Avant 916aca13f3 feat: record subagent execution lineage (#122015)
* feat(audit): record subagent execution lineage

* fix(audit): type-check spawn lineage validation

* docs: preserve spawned-run lineage invariants

* fix(audit): preserve lineage for worker spawns

* fix(audit): bind worker lineage to live authority

* fix(audit): keep lineage carrier private

* fix(sessions): preserve ACP participant recording

* fix(audit): keep lineage out of runtime bearer

* fix(audit): keep lineage type private

* test(audit): match current worker claim shape

* test(audit): preserve readonly lineage result

* fix(audit): redeem spawn lineage privately

* fix(audit): preserve lineage redemption on copy

* test(audit): prove nested worker spawn lineage

* fix(audit): restore execution identity CI gates
2026-08-17 21:41:30 -07:00
ClawSweeper 1d65e7b449 test: default trusted checks to local execution (#125120)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-16 23:45:50 -07:00
Peter Steinberger 59c661bf66 fix(gateway): prevent large history from blocking chat startup (#124994)
* fix(gateway): bound startup history materialization

Apply SQLite byte limits before loading history payloads and share a yielded, fingerprinted Claude CLI snapshot across concurrent startup clients. Preserve marker, cursor, redaction, and external identity semantics, and clarify that shrink-only ratchet updates need no separate approval.

* test(browser): await all lazy command groups

* fix(gateway): bound history snapshot state

* fix(gateway): preserve oversized history responsiveness
2026-08-16 23:43:40 -07:00
Peter Steinberger a2b5345b2b docs(agents): require explicit advisory authorization 2026-08-16 22:17:03 -07:00
Peter Steinberger 24435f5e9a docs(agents): harden live-test and capture-inspection requirements
Live verification of user-facing behavior is the default before landing,
with skips requiring a stated infeasibility in the PR; captured
screenshots/videos count as evidence only after the agent inspects them
in frame.
2026-08-16 18:49:27 -07:00
Peter Steinberger a0f4d5462a refactor(channels): carry typed approval-prompt bindings through signal/imessage send seams (#124742)
The Signal and iMessage channel plugins inferred approval prompts by
regex-sniffing rendered message text (header matching like 'Exec approval
required', /approve command parsing), violating the transport-only channel
doctrine: approval actions must stay typed until channel encoding.

The typed envelope already existed (channelData.execApproval with
approvalId/approvalKind/allowedDecisions) and every payload-level delivery
path consumed it; the regex paths were redundant re-derivation at the raw
send seam plus restart recovery for in-memory iMessage poll state.

- Signal: delete send-level prompt sniffing entirely; all approval sends
  already flow through typed structured-payload or native-handler paths.
- iMessage: sendMessageIMessage takes a typed approvalPrompt binding
  (id/kind/decisions) from the native approval handler instead of an
  approvalKind flag plus text re-parsing.
- iMessage poller: persist pending poll targets in the plugin keyed store
  so restart recovery no longer regex-scans chat history; typed recent-chat
  discovery for handle-only DM targets stays. Split poll-target ownership
  into approval-reaction-poll-targets.ts (max-lines).
- Plugin SDK: remove extractApprovalReactionPromptBinding — beta-only
  surface, never in a stable release, so no deprecation window applies;
  AGENTS.md now records that rule.

Accepted tradeoff: approval prompts delivered by a pre-upgrade process are
not rediscovered from chat text after restart (<=24h transient state;
persisted reaction bindings and event-driven tapbacks still work).
2026-08-16 12:57:34 -07:00
Peter Steinberger 55240929f5 fix: avoid nesting dedicated Linux workers (#124636)
* fix: avoid nesting dedicated Linux workers

* fix: preserve worker routing prerequisites

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 08:25:04 -07:00
Josh Lehman 56798ae085 fix(cli): accept inherited flags after nested subcommands (#116587)
* fix(cli): accept auth agent flag after subcommands

* openclaw-87a: normalize inherited skills options

* test(cli): classify curator leaf JSON flags

* test(cli): cover all auth agent leaves
2026-08-15 09:52:24 -07:00
Peter Steinberger c9da900a96 docs(agents): third cleanup pass — sentence-level dedup, CI-guard citations, deployed-agent bullet relocation (#124078)
Three audit lanes over the remaining sections:

- Repair Doctrine/Code/Tests/Start: merge bullets that restate the same
  obligation (read-broadly pair, LOC+closeout, verification pair, helper-rent
  pair, narrow-API pair, over-engineering pair, test-value trio); relocate the
  consolidate-duplicated-setup clause into the test-audit skill's authoring
  gate; split the Codex hard gate into its own bullet.
- Architecture: cite CI enforcement instead of restating it (coercion-helper
  guard owns isRecord carve-outs); defer additive-SQLite criteria to
  docs/reference/database-schemas.md (verbatim coverage); merge the channel
  transport-only trio, hot-path pair, and process-stable/freshness trio;
  every approval gate untouched.
- Platform/Ops: delete the three deployed-agent bullets (generated-media wake,
  message_tool_only, memory wiki) — deployed agents read runtime prompts and
  docs, not this repo's AGENTS.md, and docs/tools/media-overview.md,
  docs/gateway/config-channels.md, and the memory-wiki plugin surfaces cover
  every clause (wiki-maintainer skill gains the verify-contact-data line);
  move SwiftUI Observation + provider-schema bullets to Code; compress Mac
  signing to its doc pointer.
- ClawSweeper: 13 wording compressions; every schema field name and gate kept.

Adversarial no-loss audit ran over the diff; its four findings (external-API
live-test weakened by a feasibility qualifier, dropped orchestration-only
clause, existing-vs-obsolete abstraction flip, oversold channel-doc pointer)
are all restored/fixed.
2026-08-15 02:43:38 -07:00
Peter Steinberger f6ed40d649 docs(agents): fact-check, disambiguate, and further slim root AGENTS.md (#124053)
* docs(agents): fact-check, disambiguate, and further slim root AGENTS.md

Second cleanup pass over root AGENTS.md driven by three audit lanes
(fact-check vs repo, confusion/contradiction hunt, cut candidates):

- Fact fixes: delete the @buape/carbon pin rule (dependency no longer exists
  in any manifest or pnpm-lock.yaml); fix the reply-format example to a real
  file (extensions/telegram/src/bot-access.ts).
- Confusion fixes: define checkout classes once in Commands and merge the
  three conflicting test/check bullets onto them; state that the mock-gateway
  harness verdict satisfies channel-visible proof as an explicit exception to
  mandatory UI screenshots; complete the Map scoped-guide list (src/tui, test)
  and note deeper subtree guides; inline the dangling 'Start-section evidence
  bar' reference; gate issue-closing and public-comment posting on explicit
  authority; scope the NO_REPLY rule to ClawSweeper hook sessions; clarify
  auto-provisioning vs Architecture's compat-fallback deletion rules.
- Cuts/moves: scripts/pr gotchas, throttle-lock recovery, non-main merge
  procedure, media-upload mechanics, and merge-ref-race recognition into
  $openclaw-pr-maintainer; QA private build flag into $openclaw-qa-testing;
  release-branch CI dispatch refs and release-ci-summary limits into
  $release-openclaw-ci; Vitest ENOTEMPTY race into $openclaw-testing;
  WebVNC screenshot etiquette into $crabbox; delete bullets duplicated by
  those skills (prompt snapshots, QA YAML) and the obsolete rebrand-doctor
  bullet; compress the preflight, Codex gate, SQLite-additive, ClawSweeper,
  and Execution Identity wording without dropping any invariant.

* docs(agents): exempt extended-stable canonical dispatch from the target_context_ref rule
2026-08-14 23:40:48 -07:00
Peter Steinberger 83319bad60 docs(agents): dedupe root AGENTS.md and move workflow detail into owning skills (#124027)
* docs(agents): dedupe root AGENTS.md and move workflow detail into owning skills

Root AGENTS.md loads into every session; ~9.5KB of it duplicated content
already owned by skills (crabbox, openclaw-testing, release-openclaw-*,
openclaw-pr-maintainer, openclaw-changelog-update) or restated the same
invariant in multiple sections. Skills absorb the root-only operational
details first (Testbox/Crabbox mechanics, backport default target, fork-code
landing variant), then root keeps hard policy and routing only.

Also fixes skill drift found during the audit: positional testbox status id,
missing remote-unavailable local-fallback policy, delegated-flag reject list,
and aligns the early performance dispatch fail_on_regression flag with the
Full Release Validation profile gate (true stable / false beta).

* docs(agents): derive fail_on_regression from release profile in dispatch example
2026-08-14 22:34:27 -07:00
Josh Avant 97a53a9b35 feat: audit admitted channel participant identity (#122863)
* feat: audit admitted channel participant identity

* fix: preserve Telegram identity through thread recovery

* fix: signal held gateway process groups

* fix: keep audit evidence passive in collect routing

* fix: validate copied channel participant evidence

* fix: bind channel participant evidence to host ingress

* fix: honor Telegram proof credential roles

* fix: restart held Telegram proof through gateway

* fix: repair channel identity CI regressions

* test(matrix): bind thread routing owner

* fix: preserve direct DM SDK compatibility

* fix: bind channel provenance at host runtime

* test(feishu): provide channel context builder

* fix: defer record-bound channel runtime resolution

* fix: keep channel admission evidence core-private

* fix(audit): bind channel admission to plugin lifecycle

* fix(audit): bind ingress provenance to final context

* refactor(audit): split admission scope keys

* test(queue): cover combined metadata carriers

* refactor(audit): keep lifecycle helpers private

* fix(queue): preserve combined turn authority

* test(channels): provide ingress context builders

* test(channels): align integrated CI fixtures

* test(clickclack): resolve model-loop ingress

* docs: preserve channel participant evidence invariant
2026-08-14 08:57:01 -05:00
Peter Steinberger 312397ab4d feat(providers): add GLM 5.3 support (#123523) 2026-08-13 23:34:50 -07:00
Peter Steinberger 909453e6a5 docs(agents): default to fixing broken CI (#123369)
Red main, a red merge gate, and flaky-by-construction assertions were
treated as someone else's problem often enough to be worth a rule: fix
them in the landing PR rather than waiting them out or routing around
them. Keeps the two real exceptions explicit so the default cannot be
argued away.
2026-08-13 16:45:39 -07:00
Peter Steinberger bc8e51ce37 refactor(memory-core): strengthen dreaming boundaries (#123138)
Replace assertion-driven cleanup with real runtime narrowing and typed owner contracts across memory-core dreaming.

Reject the unsound one-file lint ratchet and document repository-wide rules against checker-gaming and baseline-driven enforcement.

Co-authored-by: Amp <amp@ampcode.com>
2026-08-13 11:32:25 -07:00
Peter Steinberger e0cd23d81f docs(agents): require screenshot/video proof for UI-visible and gateway-behavior changes (#122920)
Adds hard policy: UI-visible changes need before/after screenshots or a
short video as PR evidence; gateway-behavior changes provable in the
Control UI need an isolated dev-gateway live run with a recorded video.
Documents the verified video upload flow (user-attachments endpoint,
mp4/webm both served) and the bare-URL embed rule for GitHub's player.
2026-08-12 19:32:43 -07:00
Josh Avant 562391b9af feat(audit): explain denied operator approvals (#119815)
* Audit: add durable decision receipts

* Audit: route generic decision facts through writer

* Audit: satisfy strict decision count typing

* Test: align decision writer type coverage

* Refactor: isolate decision receipt projection

* Fix: preserve ambiguous approval correlation

* Fix decision coverage across pages

* Fix approval coverage across corrupt pages

* Fix decision summaries across retention and paging

* Remove superseded decision fact count path

* Keep session-derived approval links conservative

* Test decision paging at owner boundary

* Audit: bind approval receipts to exact execution

* Test: keep decision receipt coverage focused

* docs(agents): preserve decision receipt ownership

* Docs: refresh Plugin SDK split baselines

* Docs: require opt-in for future decision facts

* Fix: bound decision receipt inspection
2026-08-12 05:23:29 -05:00
Josh Avant 3b01ea7905 fix(audit): show authenticated users for Gateway runs (#122484)
* fix(audit): show authenticated users for Gateway runs

* fix(audit): keep profile labels out of sessions

* test(qa): verify session label retention at storage

* fix(sessions): preserve canonical profile ownership

* test(qa): require full identity inspection proof

* docs(agents): preserve execution identity ownership boundary
2026-08-12 08:50:37 +00:00
Josh Avant 35d764076e fix(audit): ignore inherited execution identity evidence (#122418)
* fix(audit): require owned admission data

* docs(agents): preserve owned admission invariant
2026-08-11 23:19:17 -05:00
joshavant 8c1880a54a docs(agents): preserve invoker evidence invariant 2026-08-11 21:52:21 -05:00
joshavant 8646c19a25 docs(agents): preserve execution identity audit invariants 2026-08-11 00:03:25 -05:00
Josh Avant 73a9eed95b refactor(audit): add canonical admitted-run context (#120534)
* feat(audit): carry canonical admitted execution context

* fix(agents): preserve admitted context across retries

* fix(worker): fence legacy launch dialect

* test(gateway): track approval temp dirs

* fix(plugin-sdk): preserve harness attempt compatibility

* fix: close delegated run authority at owner boundaries

* fix: internalize delegated authority validators

* refactor: split delegated authority proof surfaces

* refactor: centralize command admission identity

* test: claim runtime tool authority

* fix(gateway): keep lifecycle cleanup within static budgets

* fix(agents): revalidate harness policy authority

* fix(agents): fence awaited approval capability results

* test(copilot): supply required harness capability fixtures

* fix(agent): preserve scoped embedded run admission

* fix(agent): preserve keyless and worker authority

* test(agent): bind incomplete-turn authority

* docs: preserve execution authority invariants

* chore(plugin-sdk): regenerate API baseline

* fix(gateway): notify pending claim closure

* fix(gateway): revalidate delegated tool authority

* fix(plugin-sdk): keep source guard internal

* fix: close delegated authority races

* fix: revalidate delegated side effects

* fix: close harness authority projection gaps

* fix: align authority integration types

* fix: isolate settled harness finalization

* fix: fence recovery identity finalization

* fix: preserve committed session worktrees

* fix: preserve worker placement agent identity

* fix: fence active harness tool work

* fix(plugins): restore embedded run admission owner

* chore(plugin-sdk): compose integrated surface budgets

* fix(copilot): keep finalization attempt type internal

* fix(plugins): complete admission owner type imports

* test(harness): use settled finalization attempt shape

* fix(security): retain exact side-run and approval authority

* fix(security): preserve protected authority through terminal sweep

* fix(agents): follow moved recovery store owner

* fix(ci): align integrated authority owners with gates

* fix(plugins): distinguish embedded agent adapter export

* chore(plugin-sdk): regenerate API baseline after rolling integration

* refactor(gateway): keep session authority within owner budgets

* fix(gateway): keep session helpers private

* docs(plugin-sdk): name the V2 parameter subpath

* chore(integration): reconcile worker and SDK surfaces

* docs(plugin-sdk): require the V2 host API floor

* chore(plugin-sdk): regenerate after proxy-auth integration
2026-08-10 23:15:20 -05:00
Dallin Romney a808b0d96a docs(release): reconcile stable maturity issue signals (#120515)
* docs(release): reconcile stable maturity issue signals

* docs(release): preserve stable label audit context

* docs(release): reconcile open labelled fixes
2026-08-10 16:13:34 +08:00
Peter Steinberger a8714eea9a docs(agents): add test-audit authoring gate and net-neutral bug-fix doctrine
- Rename openclaw-test-audit skill to test-audit; add an authoring-gate mode
  invoked whenever tests are written, not only during sweeps.
- Repair Doctrine: capture the failing repro before editing; regression tests
  must fail on pre-fix code. Bug fixes default to net <=0 production LOC via
  the refactor that absorbs the fix, not a bolted-on guard.
- ClawSweeper policy: production-vs-test LOC reviewMetrics entry is now
  unconditional for code PRs, counted with judgment; net-positive bug-fix
  deltas become risks findings with bestSolution naming the absorbing refactor.
2026-08-09 19:24:36 -07:00
Shakker cd5ec0027c docs: keep maintainer leads hands-on (#121225) 2026-08-09 21:25:34 +01:00
Peter Steinberger a3e79236aa fix(state): preserve rollback across additive columns (#121075)
* fix(state): tolerate compatible additive columns

Preserve same-version rollback compatibility for bare nullable SQLite columns while continuing to reject constrained schema drift. Treat the historical shared_host CHECK definition as a named compatibility boundary.\n\nRefs #121061

* fix(state): keep additive registry internal

* test(state): keep constrained preflight fixture
2026-08-09 08:29:19 -07:00
Peter Steinberger c70aee247e refactor(scripts): migrate JavaScript tools to TypeScript (#121005)
* refactor(scripts): migrate JavaScript tools to TypeScript

* fix(ci): keep changed-scope preflight zero-install

* fix(ci): preserve zero-install script owners

* fix(ci): complete script migration follow-through

* fix(release): keep stable closeout zero-install

* fix(scripts): preserve standalone execution boundaries

* fix(scripts): repair standalone loader boundaries

* fix(scripts): normalize gateway observation ids

* fix(scripts): keep Docker packager standalone

* test(scripts): preserve rebase cleanup helpers

* test(sessions): use tracked temp directory
2026-08-09 07:21:35 -07:00
Peter Steinberger 428c00a0a2 docs: prefer token-based user-attachments upload for PR/issue media
Replace the artifact-store-first guidance with the direct
uploads.github.com/user-attachments endpoint (same CDN as drag-and-drop,
works with gh auth token); Crabbox artifact publishing stays as the
fallback for non-media artifacts or endpoint failure.
2026-08-08 20:05:37 -07:00
Peter Steinberger 7492f6937c docs(agents): replace exact-head re-review gate with 12-hour review window 2026-08-08 10:50:18 -07:00
Peter Steinberger 00a5db443a refactor: remove obsolete commit helper 2026-08-06 18:10:10 -07:00
Ayaan Zaidi ed8d1e71d1 docs(agents): require exact-head ClawSweeper re-review after post-review pushes (#119069)
The no-round-trip clause from #111385 covered the unchanged-head case; once rank-up moves are applied the old comment attests stale code. Head unchanged: land without re-review, as before. Head changed after review: one exact-head re-review, land when no actionable finding and no remaining rank-up move.
2026-08-04 08:22:03 +05:30
Peter Steinberger 0839f12ccd docs: add pathfinder rule, LOC review metric, and test-duplication clause to AGENTS.md (#118330) 2026-08-02 18:11:29 -07:00
Peter Steinberger 577f2f45fb docs(agents): drop stale packages/ scoped-guide reference 2026-08-01 22:18:00 -07:00
Peter Steinberger 4669db230a docs(agents): require architectural root-cause repairs 2026-07-31 11:06:32 -07:00
Ayaan Zaidi 73ab157e6f docs(agents): calibrate defaults ambition and security tradeoff in Product Doctrine 2026-07-30 08:44:40 +09:00
Peter Steinberger 3f4d65a672 feat(harness): report copilot code-mode engagement on the attempt result (#115913)
* feat(harness): report copilot code-mode engagement on the attempt result

* test(copilot): prove code-mode engagement through the production tool bridge

* docs: describe the normalized codeModeEngaged value for native harnesses
2026-07-29 14:44:15 -04:00
Ayaan Zaidi 987522fdcc docs(vision,agents): layer calibration, interface-on-demand, telemetry opt-in, whole-document guidance rules 2026-07-29 20:13:45 +09:00
Ayaan Zaidi e92da4c8ba docs(agents): reword imported review rules in repo voice 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 9182999eb6 docs(agents): add context-budget, tool-description, cache-invalidation, and review-premise rules 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 344a8e48df docs(agents): mock-gateway proof satisfies gate without discouraging live proof 2026-07-29 19:54:37 +09:00
Ayaan Zaidi c9f8c05598 docs(agents): add vitest in-flight edit rule and mock-gateway proof recipe 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 620bf5a9c0 docs(agents): restructure root AGENTS.md around product doctrine and deduped policy 2026-07-29 19:54:37 +09:00
Vincent Koc 25c375e47f refactor: reuse canonical record guards (#115810)
* docs(agents): standardize canonical record guards

* refactor(model-catalog): use canonical record guard

* refactor(scripts): use canonical record guard

* refactor(ui): use canonical record guard

* refactor(codex): use canonical record guard

* refactor(agents): use canonical record guard

* refactor(sessions): use canonical record guard

* refactor(doctor): use canonical record guard

* refactor(infra): use canonical record guard
2026-07-29 11:43:36 +02:00
Peter Steinberger 1755087bca docs: add grep-discoverability naming rules for agents 2026-07-27 16:27:30 -07:00