Commit Graph

7905 Commits

Author SHA1 Message Date
Peter Steinberger 8638d50ce6 fix(ci): cover core-driven extension impact in PR fallback (#124579)
* fix(ci): cover core-driven extension impact in the PR fallback plan

Fixes #124412

* fix(ci): self-gate extension inventory changes
2026-08-16 06:12:44 -07:00
Peter Steinberger d437a4a4b4 fix(test): route extension roots through bounded planner (#124553)
* fix(test): route extension roots through bounded planner

* test: cover bounded Codex fallback shards
2026-08-16 05:35:17 -07:00
Peter Steinberger ee4bd4aa47 fix(scripts): give the artifact mtime repair a millisecond of headroom
checks-node-core-tooling-2 failed on main (run 31943910358) with
'expected 1786879225197 to be >= 1786879225197.2246': the repaired output
mtime landed a fraction of a millisecond below the input it had to clear.

isArtifactSetFresh repairs output mtimes to exactly ceil(newestInput), so
it leaves zero headroom for sub-millisecond write rounding or lagging
metadata on CI filesystems. When the repair lands at or below its input
the mtime fast path never engages, and every later invocation in that
checkout falls back to re-hashing every input byte -- the expensive path
this repair exists to avoid, gating the d.ts emit that is the slowest
build-all phase (25.9s of a 61s build).

Neither macOS APFS nor an idle Linux ext4 Testbox reproduces the
shortfall in 300 runs, so the repair now clears the newest input by a
whole millisecond instead of matching it. The assertion pins that
headroom, making the test deterministic where it was previously
load-dependent (fails 615 vs 616 without the fix).
2026-08-16 04:40:23 -07:00
Peter Steinberger b07c6b2b8b fix(computer-use): macOS live-proof rig deadlocks on operator device approval (#124536)
* fix(computer-use): unblock the macOS live-rig proof flow

The rig ran its operator CLI and its proof runner from one state dir, so both
shared one device identity. A paired operator device is pinned to the scopes of
its first connect, and `nodes list` connects first for `node.pair.list`
(operator.pairing); the proof runner then needs operator.write, which is a scope
upgrade the gateway never approves silently and which no rig client can approve
for itself. The proof runner is a GATEWAY_CLIENT/BACKEND client, so on a
loopback auth-none gateway it is admitted unpaired with the scopes it asks for:
giving the CLI its own `cli-state` identity is enough, and `agent-state` now
never accumulates a pairing row.

`nodes list` also read `node.list` through the plain CLI client while
`nodes status`/`describe` used the diagnostics ladder. On any gateway where the
CLI must pair, the unfiltered list silently dropped connected/commands/
computerUse and `--connected` failed outright, so the documented rig gate could
not confirm the node. Both call sites now use `callNodeDiagnosticsGatewayCli`.

Docs drop the `devices approve <requestId>` instruction, which was circular:
that invocation is its own new device identity.

* test(cli): share the runtime-log formatter across nodes CLI e2e files

The extracted diagnostics-auth file stringified captured log arguments directly, which the type-aware core lint stripe rejects (no-base-to-string). Move the existing formatter into the shared node test helpers instead of duplicating it.
2026-08-16 04:25:03 -07:00
Peter Steinberger f19f62cb77 perf(node-host): prewarm worker bundles (#124427)
* perf(node-host): prewarm worker bundles

* test(gateway): gate worker finalization responsiveness

* fix(node-host): negotiate bundle prewarming

* fix(protocol): refresh worker prewarm models

* fix(node-host): preserve prewarm upgrade compatibility
2026-08-16 00:41:42 -07:00
Jason (Json) bccbb8a0c7 fix(memory): make persistence promises receipt-backed (#120989)
* fix: require memory persistence receipts

* fix(memory): bind persistence failures to tool owners

* fix(memory): preserve Codex persistence ownership

* test(plugin-sdk): account for owner metadata export

* test(codex): split owner timeout regression

* fix(memory): cover durable deletes across runtimes

* test(codex): type dynamic mutation fixtures

* fix(agents): fail closed ambiguous side-effect owners

* fix(memory): fail zero-row delete receipts
2026-08-16 00:50:10 -06:00
Peter Steinberger 03be260e5b fix(lint): assertion SAFETY ratchet — exempt as-unknown, absorb merge drift (#124445)
* fix(lint): exempt as-unknown from SAFETY ratchet and rebaseline for merge drift

* chore(lint): refresh assertion baseline after rebase
2026-08-15 23:10:02 -07:00
Peter Steinberger 6aa27d6ecd refactor: retire August compat windows (embedding API, pi aliases, target parser, spawning hook, setup exports, WhatsApp inbound aliases) (#124416)
* refactor(plugin-sdk): retire embedded Pi aliases

* refactor(channels): retire explicit target compatibility

* refactor(plugins): retire subagent spawning hook

* refactor(plugin-sdk): retire shipped channel setup exports

* refactor(whatsapp): retire inbound callback aliases

Proof: focused build and WhatsApp E2E green; broad WhatsApp suite 188/189 files green. extensions/whatsapp/src/monitor-inbox.policy.test.ts flakes only in the parallel batch and passes isolated (10/10).

* refactor(plugin-sdk): retire memory embedding registrar

Migrate every bundled provider and manifest to registerEmbeddingProvider and contracts.embeddingProviders. Preserve memory-specific batching, local-service acquisition, index identity, and auto-selection through the canonical generic registry adapter, then remove the parallel registrar, registry, diagnostics, contracts, tests, and docs.

* chore(plugin-sdk): tighten retired surface budgets

Pin the post-retirement public SDK surface to 144 entrypoints, 4,312 exports, 2,564 callable exports, and 1,133 deprecated exports; agent-harness-runtime now permits exactly nine deprecated exports.
2026-08-15 22:43:47 -07:00
Peter Steinberger 1384e277af refactor(types): enforce chained-assertion guard in AI and UI (#124361)
* refactor(types): drain chained-assertion ledger — ai and ui

* refactor(ui): extract chat state contract

* fix(ai): preserve strict Claude request cleanup

* test(ui): synchronize terminal timeout clock

* fix(ui): validate observer digest before run mutation
2026-08-15 22:25:42 -07:00
Peter Steinberger 6335e358f3 fix(ci): keep Crabbox dependencies intact after pnpm dlx (#124423)
* fix(ci): isolate Crabbox pnpm dlx state

* fix(ci): clarify hydrated modules errors
2026-08-15 22:13:26 -07:00
Peter Steinberger 203aafc415 feat(lint): SAFETY-comment assertion ratchet + repo deslop skill (#124359)
* feat(lint): add SAFETY-comment assertion ratchet

* feat(skills): add repo deslop skill

* fix(lint): refresh initial assertion baseline

* chore(lint): align assertion baseline with main

* chore(lint): sync baseline with current assertion ledger

* test(ui): stabilize Control UI E2E waits

* chore(lint): sync narrowed assertion ledger

* chore(lint): sync fully drained assertion ledger

* fix(lint): close assertion ratchet bypasses
2026-08-15 22:03:48 -07:00
Peter Steinberger acbbff19ba refactor(types): drain chained-assertion ledger — extensions (#124378)
* refactor(types): drain chained-assertion ledger — extensions

* fix(types): parse Matrix summary events at the boundary

* style(types): satisfy extension map lint

* style(types): name the Tlon image marker cleanly

* fix(browser): preserve deep MCP snapshots iteratively
2026-08-15 20:55:01 -07:00
Josh Lehman a0498f7a9c fix: restore native OpenAI web search in packaged runs (#124215)
* oc-e13.2: preserve web search failure evidence

* oc-e13.2: include provider owners in runtime plans

* oc-e13.2: prepare provider owners before harnesses

* oc-e13.2: retain provider selections in runtime owners

* oc-e13.2: keep harness selection helper internal

* test(agents): cover prepared runtime registry loads

Co-authored-by: Josh Lehman <550978+jalehman@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-15 20:30:41 -07:00
Peter Steinberger bb68ad057c refactor(types): drain chained-assertion ledger — agents (#124354)
* refactor(types): drain chained-assertion ledger — agents

* fix(agents): preserve non-configurable stream iterators

* refactor(agents): call provider failover hook directly
2026-08-15 20:28:31 -07:00
Peter Steinberger 6bbc57e526 refactor(types): drain chained-assertion ledger — core (#124351) 2026-08-15 19:41:31 -07:00
Peter Steinberger 1ab85edb0e fix(workers): bundle workspace rsync receiver (#124339) 2026-08-15 19:23:05 -07:00
Jason (Json) 4be10d44d5 fix(ci): avoid false Crabbox auth failures during readiness (#119700)
* fix(ci): trust Crabbox doctor for broker readiness

* fix(crabbox): preserve doctor auth compatibility

* fix(crabbox): retain legacy auth validation

* fix(ci): trust structured Crabbox doctor readiness

Punchcard-Session: calm-meadow-summit-bc

* fix(ci): trust structured Crabbox doctor readiness

* fix(ci): satisfy Crabbox readiness types

* test(ci): use managed temp directory helper

* test(ci): stabilize Crabbox readiness fixtures

* test(ci): preserve temp helper baseline

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-15 19:47:19 -06:00
Peter Steinberger 78502eda6d feat(workers): run device sessions from Gateway bundles (#124037)
* feat(workers): run device sessions from Gateway bundles

Install the current Gateway bundle before a device environment becomes ready, verify it at attach and tunnel boundaries, launch only from the immutable namespaced bundle directory, and retire stale environments for idempotent reprovisioning. Remove the local execution mode and preserve the node-local build claim only as temporary inventory metadata for the final projection/cleanup slice.

* docs(runners): record Gateway bundle cutover

* test(ci): repair runner validation fixtures

# Conflicts:
#	src/scripts/test-projects.test.ts

* fix(workers): surface outdated node recovery

Keep legacy runner inventory diagnostic-only while exposing the update-and-reconnect action through node, environment, provider, placement, and Control UI surfaces.

* fix(workers): reject legacy inventory with recovery

* fix(workers): bundle worker deploy closure

* test(workers): close bundle cutover gates

* fix(workers): compose browser runtime at build

* fix(workers): satisfy bundle cutover gates

* fix(workers): route temp runtime through infra

* docs(workers): align bundle host guidance

* fix(ui): fence outdated session destinations
2026-08-15 17:46:44 -07:00
Josh Lehman 3bb7fdd40b fix: restore frozen Codex release validation (#124204)
* oc-c45: fix frozen Codex release resolution

* fix(release): keep frozen Codex suites fail closed
2026-08-15 15:38:57 -07:00
Peter Steinberger ceb469abb3 refactor(release): remove summary test facades (#124259) 2026-08-15 12:41:03 -07:00
Pavan Kumar Gondhi 8668aeb969 fix(discord): bind transcript capture to source account [AI] (#118579)
* fix(discord): bind transcript capture to source account

* style(agents): keep transcript tool wiring compact

* fix(transcripts): declare account binding channels

* fix(transcripts): report effective capture account

* fix(transcripts): enforce account lifecycle ownership

* fix(transcripts): preserve cross-surface control

* fix(copilot): preserve transcript channel context

* fix(transcripts): fail closed for legacy channel owners

* fix(transcripts): add trusted legacy recovery

* fix(transcripts): preserve auto-start cleanup ownership

* fix(transcripts): reject untrusted account starts

* fix(transcripts): keep persisted ownership authoritative

* fix(transcripts): harden legacy recovery

* fix(transcripts): preserve agent ownership boundary

* fix(transcripts): scope account binding to source channel

* fix(transcripts): preserve unattributed owner isolation

* fix(transcripts): own configured captures by account

* docs(plugins): clarify transcript auto-start ownership

* test(transcripts): cover account-less recovery

* docs(transcripts): scope legacy recovery by provider

* fix(discord): reuse eligible account ordering for transcripts

* test(discord): use neutral transcript account fixtures

* fix(transcripts): keep accountless recovery local

* fix(discord): resolve transcript accounts by voice capability

* fix(transcripts): bound account resolution failures

* fix(transcripts): bound account tool output

* fix(transcripts): honor unresolved provider accounts

* fix(transcripts): preserve binding when providers are missing

* fix(transcripts): fail closed on unknown binding provenance

* fix(transcripts): qualify account lifecycle capability

* fix(transcripts): normalize provable legacy owners

* fix(transcripts): bind scheduled capture to caller authority

* fix(transcripts): preserve scheduled caller identity tuple

* fix(transcripts): preserve channel-less scheduled authority

* fix(plugin-sdk): publish transcript provider types

* fix(transcripts): use exact lifecycle ownership tokens

* fix(transcripts): preserve local ownerless lifecycle access

* fix(transcripts): allow local configured capture control

* fix(transcripts): preserve scheduled caller channel

* fix(transcripts): retain named-agent legacy recovery

* fix(transcripts): deny unrelated remote channels

* fix(doctor): validate transcript owner inference

* fix(transcripts): restrict legacy remote recovery

* fix(ci): align transcript Doctor checks

* fix(transcripts): require Doctor-owned legacy metadata

* fix(transcripts): reject unowned remote capture starts

* fix(transcripts): reject unbound Discord lifecycle calls

* fix(transcripts): distinguish legacy owner rows

* test(discord): keep unavailable account fixture typed

* fix(transcripts): mark current imports for Doctor

* fix(transcripts): complete account ownership validation

* fix(discord): restore transcript package boundary

* fix(discord): preserve bundled transcript entry boundary

* docs(transcripts): clarify Discord auto-start account

* fix(transcripts): bind account-owned imports

* fix: preserve transcript and cron policy state

* fix(cron): preserve scheduled transcript authority

* fix(discord): keep legacy transcript rows local

* fix(transcripts): narrow account ownership boundary

* fix(transcripts): preserve trusted caller ownership

* fix(discord): enforce transcript source authorization

* fix(ci): bound Control UI gzip build variance

* test(qa): align transcript scenario contracts

* fix(agents): repair rebased caller context

* fix(discord): restore rebased account ownership

* test(discord): restore voice account fixtures

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-08-15 12:10:43 -07:00
Peter Steinberger 394648c702 refactor(test): remove test-force testing facade (#124225) 2026-08-15 11:46:30 -07:00
Josh Avant fc4d5d744f fix(sessions): prevent cleanup from deleting readable transcripts (#123495)
* fix(sessions): make transcript archival atomic

* fix(sessions): stabilize SQLite archive CI

* test(gateway): synchronize lifecycle patch race

* fix(sessions): finish archive recovery accounting

* fix: key transcript archives by generation

Remeasure physical disk usage after archive publication so budget results and pruning use the bytes actually present on disk.

Refs oc-8e9

* fix(sessions): normalize doctor archive generations (oc-a28)

---------

Co-authored-by: Josh Lehman <550978+jalehman@users.noreply.github.com>
2026-08-15 09:59:59 -07:00
Josh Lehman 8cfcc3155a test: align onboarding TTY prompts (oc-efc) (#124199) 2026-08-15 08:58:16 -07:00
Peter Steinberger b365f7ec89 test: move core coverage to owner boundaries (#124184)
* test: move core coverage to owner boundaries

* ci: lower plugin SDK surface budget
2026-08-15 07:42:53 -07:00
Peter Steinberger 4f68eee80a refactor(test): remove unused testing bag members (#124175)
* test(tooling): remove unused testing bag members

* fix(test): preserve partial spawn result stubs
2026-08-15 06:18:23 -07:00
Peter Steinberger cc9883a3d3 fix(ci): invalidate session catalog sdk declarations (#124165) 2026-08-15 06:52:35 -06:00
Peter Steinberger c98ae0f99c test(scripts): remove duplicate parser facades (#124167) 2026-08-15 05:37:04 -07:00
Peter Steinberger 1610771b1d test(tooling): remove obsolete runner facades (#124159) 2026-08-15 04:47:33 -07:00
Peter Steinberger 94a0661322 fix(cua): initialize execution resources on first use (#124156) 2026-08-15 04:30:08 -07:00
Peter Steinberger abf0ef6513 fix(computer-use): repair artifact verification and post-approval descriptor found by the Linux gate (#124128)
* fix(cua-computer): prove Linux X11 live vertical

* test(computer-use): authenticate isolated Linux rig

* fix(gateway): refresh computer use after node approval

* refactor(cua-computer): resolve the plugin manifest by static import

* fix(gateway): break plugin runtime import cycle

* fix(computer-use): bind live rig to committed helpers
2026-08-15 03:53:23 -07:00
Peter Steinberger 23f84a851a fix(build): bound CLI metadata render fanout (#124153) 2026-08-15 03:52:33 -07:00
Peter Steinberger fe5fa802fa feat(lint): enforce no-chained-type-assertions (#124119) 2026-08-15 02:13:37 -07:00
Peter Steinberger 2c0de878c6 fix(release): preflight plugin npm trusted publishers (#124095)
* fix(release): preflight npm trusted publishers

* fix(release): fully escape npm package path
2026-08-15 01:05:54 -07:00
Peter Steinberger c83c3bc3a9 fix(plugin-sdk): keep published pre-split plugin imports loading after upgrade (#124086)
* fix(plugin-sdk): keep published pre-split plugin imports loading after upgrade

Same bug class as #124041: published plugin artifacts import SDK names at
module top level, so removing them from the barrel makes the installed
plugin fail to load (voice-call/matrix doctor contracts silently never run
their migrations; whatsapp and slack channels fail outright) after a core
upgrade. Verified against the actual npm tarballs (2026.7.2-beta.7):

- openclaw/plugin-sdk/runtime-doctor: voice-call + matrix doctor contracts
  import repair names (archiveLegacyStateSource, detect/repair state DB
  schema, plugin install-path repair, removePluginFromConfig,
  createPluginStateSyncKeyedStore) that moved to doctor-repair-runtime.
- openclaw/plugin-sdk/channel-feedback: whatsapp imports
  shouldAckReactionForWhatsApp (owner policy moved in-plugin by #121257).
- openclaw/plugin-sdk/channel-outbound: slack imports
  resolveChannelProgressDraftRender (render key retired by #122927).

Adds deprecated load-only bridges with named removal windows, bumps the
SDK surface budgets with comments, and locks behavior with unit tests
plus a loader fixture that fails without the bridges.

* test(plugin-sdk): cover the repair bridge in the runtime-doctor facade surface lock
2026-08-15 01:05:08 -07:00
Peter Steinberger a8f1a0d345 test(computer-use): live end-to-end gate for both macOS providers (#123991)
* fix(computer-use): preserve semantic click observations

* fix(cua-computer): isolate desktop and window sessions

* fix(cua-computer): route cursor reads through desktop scope

* test(computer-use): add isolated macOS live proof rig

* style(cua-computer): format driver sessions

* fix(cua-computer): forward lazy desktop tools

* fix(computer-use): narrow live proof artifact path

* test(computer-use): split schema contract coverage

* refactor(cua-computer): unify session start state

* build(computer-use): register live proof entrypoint

* style(computer-use): satisfy full lint contract

* fix(computer-use): harden live proof authority

* fix(cua-computer): keep window authority immutable

* fix(computer-use): close partial sessions safely
2026-08-14 23:37:53 -07:00
Peter Steinberger 1320a0bff9 feat(lint): reject widen-then-assert type laundering (#124003)
* feat(lint): add no-widen-then-assert guard

* refactor: preserve typed boundary evidence

* refactor(types): remove redundant unknown aliases

* fix(agent): preserve replay sanitizer fallback

* fix(lint): close widen-then-assert nested-chain and const-alias bypasses
2026-08-14 22:10:19 -07:00
Peter Steinberger a32a7ae9af feat(cua-computer): verify the managed driver artifact on Windows and Linux node hosts (#123986) 2026-08-14 21:08:13 -07:00
Peter Steinberger d6e6d67adc fix(plugins): uninstall fully removes isolated npm plugin files (#123973)
* fix(plugins): remove isolated npm projects on uninstall

Ordinary uninstall now removes the whole owner-managed per-plugin npm project, including packed archives and transitive dependency debris, while shared roots and retained update generations keep their existing lifecycle behavior.

* fix(plugins): preserve failed install cleanup

Allow persistence-failure compensation to remove only a planner-validated isolated npm project root, while continuing to reject shared or ambiguous cleanup targets.
2026-08-14 21:03:12 -07:00
Peter Steinberger aec8096bbc refactor(gateway): remove obsolete worker test seams (#123970) 2026-08-14 20:30:34 -07:00
Peter Steinberger 2276dca1d3 fix(ci): route the protocol coverage record guard through record-shared
The inlined isRecord in 7e54cc9d19 tripped the coercion-helper declaration
guard on main (runs 31859544700+); the dependency-light scripts/lib/
record-shared.mjs seam is the sanctioned owner for scripts that must run
without workspace package resolution.
2026-08-14 19:44:29 -07:00
Peter Steinberger 7e54cc9d19 perf(ci): make push/PR preflight dependency-free and prune the store archive
The manifest planner closure and the protocol coverage script import only
node builtins and relative files (verified importing the full closure with
an empty node_modules under native type stripping), so push/PR preflight
drops the pnpm store restore and install (~30s off the barrier every lane
waits behind). Manual dispatches keep the tsx path for frozen targets, and
the coverage script inlines the record guard under the documented
dependency-free exception.

The store archive accretes every prior lockfile generation through
prefix-key restores (measured 2.05 GiB, ~36s restore in every hosted job);
the warmup writer now prunes to the current lockfile closure before saving.
2026-08-14 19:25:16 -07:00
Peter Steinberger a2d1b0c03b perf(ci): anchor storage-state stripe balance with measured file walls
Run 31856622489's compact-small-14 owned a 335s wall because the
storage-state hosted split packed state-migrations (27s), sqlite-snapshot
(24s), and session-cost-usage (10s) into one stripe against uniform default
weights. Anchor those files with CI checkmark walls from run 31814517685 and
lift the group hint to its observed 235s so the halves pack realistically.
2026-08-14 18:41:30 -07:00
Peter Steinberger ad508a51c2 perf(ci): overlap two tsgo graphs inside each test-type stripe
Each graph is a serial single-project build, so tsgo gains little past four
cores; run 31852071103 measured ~34s/graph on 8 vCPU versus ~42s on hosted
4-core. Overlapping two fresh shard processes per CI stripe (--concurrency 2)
uses the idle cores and roughly halves the stripe body; local runs keep the
heap-bounded serial default.
2026-08-14 17:11:39 -07:00
Peter Steinberger 7f891f4a78 fix(ui): stale tabs keep dispatching after gateway updates (#123882)
* fix(ui): reject stale bundled clients at connect

* chore: keep release notes out of runtime fix

* fix(ui): preserve stale-build admission invariants
2026-08-14 17:05:10 -07:00
Peter Steinberger 0a6b95a3df feat: cloud workers for the codex runtime (remote-exec placements) (#123743)
* feat(gateway): add remote-exec cloud placements

* feat(codex): run cloud turns through remote exec

* fix(sandbox): quote ssh_config path directives containing whitespace

Crabbox lease keys default to ~/Library/Application Support/... on macOS;
unquoted IdentityFile/UserKnownHostsFile/CertificateFile arguments tokenize
on the space and fail as 'extra arguments'. Found via live remote-exec
cloud-worker proof.

* test: consolidate gateway maintenance schedule coverage

* fix(ci): invalidate plugin sdk declarations on state changes
2026-08-14 16:46:56 -07:00
Peter Steinberger 98a8e0d63f fix(macos): prevent mismatched CUA driver endpoints (#123845)
* fix(macos): make CUA driver endpoint handoff atomic

* ci: record approved CUA env budget increase

* test: satisfy changed-gate hygiene

* style(macos): use failable endpoint string conversion

* fix(macos): strip retired CUA worker environment

* ci: constrain CUA env budget approval

* test(macos): isolate inherited CUA environment
2026-08-14 16:04:43 -07:00
Peter Steinberger 3ef7f590a7 fix(ci): invalidate plugin SDK declarations on auth changes (#123861)
* fix(ci): invalidate plugin sdk declarations on auth changes

* test(ui): await device migration overlay updates
2026-08-14 15:21:29 -07:00
Pavan Kumar Gondhi d5e89de906 fix(synology-chat): deliver attachments without forwarding source URLs [AI] (#119941)
* fix(synology-chat): host outbound attachments

* fix(synology-chat): isolate hosted media routes

* fix(synology-chat): harden hosted media limits

* fix(synology-chat): inspect hosted media content

* fix(synology-chat): reject ambiguous media routes

* fix(synology-chat): retain indeterminate media capabilities

* fix(synology-chat): mask public callback URLs

* fix(synology-chat): align callback sensitivity metadata

* fix(synology-chat): reserve media capability query keys

* fix(synology-chat): release rejected staged media

* fix(synology-chat): preserve ambiguous media handoffs

* fix(synology-chat): scan complete active media preamble

* fix(synology-chat): report validated attachment readiness

* fix(synology-chat): bound public media capability probes

* fix(synology-chat): bound hosted media responses

* test(synology-chat): model response headers read-only

* fix(synology-chat): bound hosted media reads

* fix(synology-chat): bound hosted media delivery

* fix(synology-chat): retain media through active serves

* fix(plugin-sdk): lease hosted media readers atomically

* fix(synology-chat): close hosted media review gaps

* test(synology-chat): clean up hosted media state

* fix(system-agent): canonicalize sensitive config paths

* fix(system-agent): honor runtime config sensitivity hints

* fix(config): inherit sensitive metadata

* fix(synology-chat): close latest review findings

* test(system-agent): keep config recovery checks lint-clean

* fix(system-agent): redact structured config secrets

* fix(synology-chat): harden active-content sniffing

* fix(security): close hosted media review gaps

* fix(security): close remaining hosted media review findings

* fix(system-agent): narrow dynamic owner ids safely

* fix(system-agent): narrow dynamic channel ids safely

* test(channels): isolate hosted media proofs

* fix(security): close config and hosted media review gaps

* test(plugin-sdk): split outbound media retention coverage

* test(plugin-sdk): isolate capacity store fixtures

* test(system-agent): assert config secrecy invariant
2026-08-14 17:05:20 -05:00
Peter Steinberger d27e318072 improve: make git installs use a blobless clone (#123835)
* perf: use blobless clone in git installer

* refactor(install): move clone-filter rationale above the call

Keep the file's comment convention (comments on their own lines) instead of a
150-column trailing comment, and record why blob:none is preferred over
--depth 1 plus why no fallback is needed.

Narrow the ordering test's source needle to the stable prefix so it stops
duplicating the behavioral flag assertion and no longer breaks whenever the
clone flags change.
2026-08-14 14:38:21 -07:00