Skip to content

promote: verified staging 9f4dbdb → prod - #17042

Merged
0xSolace merged 71 commits into
mainfrom
promote/verified-9f4dbdb
Jul 23, 2026
Merged

promote: verified staging 9f4dbdb → prod#17042
0xSolace merged 71 commits into
mainfrom
promote/verified-9f4dbdb

Conversation

@0xSolace

Copy link
Copy Markdown
Collaborator

Promotion: staging-verified 9f4dbdb → prod

Authorization: Shadow chose Option C at 06:01 MDT 2026-07-23 in #cc-eliza: promote staging 9f4dbdb to prod NOW for stability; latency fixes ship as fast-follow. Also covered by standing promotion orders Jul 22 21:58 / 22:46 MDT.

Commit: 9f4dbdb78b8f219aea44a91cabf2614be6aa7a5b (exact staging commit, verified serving on https://api-staging.elizacloud.ai/api/health at promotion time).

Content: superset of prior main candidate 8fa117c (verified ancestor). Carries #16925, #16913, #16919, #16887, #16907, #16976, #16969, #16973, #16977, #17019.

Evidence: PROD-GO-2026-07-23.md (staging flip receipts, provisioning E2E green, latency decomposition). Latency fast-follows tracked separately (fast-lane single-LLM-call streaming, persistent bridge connections, #17014 re-land).

Rollback anchor: main@249403b5364d40a8e1db37e2a6b2bbb2e39fee14 (no cloud-DB migrations ride along, schema-safe revert).

Merge method: MERGE COMMIT per promotion pattern (not squash).

Guardrail: prod agent-container image pin (sha-39d18c4) stays untouched; platform-only promotion.

[sol-promote-c]

Shaw and others added 30 commits July 23, 2026 03:11
…no keyboard

A tap on the collapsed pill now forms the bare INPUT bar and nothing more:
it no longer jumps to the HALF detent when a thread exists, and no longer
focuses the composer (popping the keyboard). Revealing the thread is the
grabber tap; raising the keyboard is the composer tap — each its own
deliberate gesture, so the sheet never lurches taller or pops a keyboard
the user didn't ask for.

The touch path needed one structural fix: the compat mouse events the
browser synthesizes after touchend landed on the composer textarea that had
just formed under the tap point, focusing it and re-opening to HALF via
focus-to-expand. The pill handle now preventDefault()s touchend (the
gesture itself runs on pointer events and is unaffected).

Matrix doc, unit/fuzz tests, and the real-browser e2e continuum + PILL-TAP
suites updated to pin the new contract (tap → collapsed detent, composer
unfocused, grabber steps INPUT → HALF → INPUT). Verified: 53 shell test
files green, chat-sheet e2e PASSED on chromium desktop+mobile profiles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Older bundled WebViews (LP3 ships Chrome WebView 113) parse Tailwind 4's
composed custom-property touch-action declaration but resolve its empty
var(--tw-pan-*) slots to the initial `auto` — the browser then claims
vertical drags on .touch-pan-y regions and terminates them with
pointercancel ~8px in. Pin the semantic utility to a literal
`touch-action: pan-y` under body.native / .platform-ios /
.platform-android / .pwa-standalone so nested notification and home
scroll regions keep their gesture contract on installed shells.

Extracted as the standalone, live-on-current-develop piece of #16822
(the pager-hook and e2e portions of that PR are held pending the #16805
topology ruling). Lockdown test pins the literal rule.

Co-authored-by: NubsCarson <NubsCarson@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Route every cerebras-provider model call through operator-set env
(CEREBRAS_BASE_URL > BENCHMARK_BASE_URL > OPENAI_BASE_URL > provider map)
instead of unconditionally clobbering subprocess env with api.cerebras.ai:
runner base-URL resolution, code-agent-matrix cell env, eliza-adapter
_normalize_model_env, mt_bench judge client, tau-bench user-sim/judge
(litellm api_base injected explicitly), woobench evaluator, swe_bench
generated OpenCode config, and the acceptance gate. tau-bench's judge no
longer silently degrades to substring matching on LLM failure — degrade is
opt-in and recorded in the result.

Add orchestrator/provider_forwarder.py: a per-cohort loopback
OpenAI-compatible forwarder (ephemeral per-harness bearer tokens, SSE
passthrough, fail-closed upstream errors) auto-started for non-subscription
cohorts whose resolved endpoint is remote, so publishable hermes/openclaw
native lanes (loopback-only by contract) reach proxied upstreams without
weakening their provenance checks. extra_config endpoint pins fail closed.

Make interrupted-campaign resume account-swap safe: stale-run recovery can
no longer reopen finished run groups; cohort resume retires the killed
attempt's rows (running/failed/succeeded) before workers start; cerebras
cohorts auto-recover stale namespace-less groups at startup; new
full_campaign --assume-quota-reset resumes past a stored retry_at after a
subscription account swap (consumed on first still-paused resume).

Green the subscription provenance/publishability cluster (7 tests red since
#16764): gateway logs created 0600 regardless of umask (+fchmod for reuse),
deterministic audit JSON depth guard replacing the interpreter-dependent
RecursionError assumption, audit_records assertions aligned to durable-v2
counting, publishability fixtures sealed as sha256-chain-v2 records.

Add orchestrator/hf_publish.py + publish-hf CLI: exports/VACUUM-snapshot/
relativization pipeline committing to the gitignored nested results repo and
uploading to a HuggingFace dataset via upload_folder, behind the readiness/
publishability/comparability/artifact gates, a secret scrub, and a host-path
scan for public publishes. Remove the satisfied MULTITASK_ELIZA_USAGE_FIX
gate; reconcile docs/RESULTS_MATRIX.md with the 49-id registry.

Suite: 187 passed. Orchestrator: 640 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Move the three loose topic docs (meeting-voice matrix, orchestrator subagent
runbook, voicebench coverage) into docs/ and index them; delete verified-dead
code (registry/_monolith.py, clawbench groq scripts, unreferenced trust TS
mirror, openclaw-benchmark vendored upstream dirs incl. committed slide
decks, vending-bench ad-hoc smoke, experience compat shim) — the three
ralphy evidence files pinned by the authored-evidence retention contract
(#16296) are retained; rewrite the upstream-flavored openclaw-benchmark and
clawbench READMEs to suite convention; prune 190 stale .gitignore lines
whose target dirs were deleted in #9475; fill doc gaps (entity-voice-bench
had zero docs; agentbench_matrix/framework/lib/multitask-bench missing
AGENTS/CLAUDE) and correct stale READMEs against code (configbench 682
scenarios, judge defaults gemma-4-31b, orchestrator README host paths);
fix stale registry metadata paths/descriptions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n-reply synthesis, cross-persona privacy verify, scheduling jargon/fabrication in user copy

Defect 1 — planner emits tool calls but no synthesized user reply (A2 rows):
- planner-loop: tool-turn reply guarantee — a finished turn that executed a
  successful non-terminal tool but produced no usable final message (undefined,
  blank, or the handled-step placeholder) now runs ONE forced no-tools synthesis
  pass grounded in the tool results; STOP/IGNORE and suppressPlannerReply turns
  are flagged endedWithDeliberateSilence and left silent.
- OWNER_* umbrella params accept natural aliases (target: query/item/task/…,
  intent: reschedule/when/time, minutes: snoozeMinutes) so a planner round is
  no longer burned on "Unexpected argument".
- SCHEDULED_TASKS_HISTORY works without a taskId: id-less reads return recent
  history across all scheduled items instead of erroring MISSING_TASK_ID.
- Completed-today day-state: repository.listCompletedOccurrenceViewsSince +
  LifeOpsService.listOwnerOccurrencesCompletedToday, surfaced as "Owner
  completed today" in the lifeops provider and as sections.completedToday in
  the evening BRIEF composer, whose narrative baseline now leads with wins and
  frames open items as neutral carryovers.
- LifeOps provider guidance: follow-through repair (neutral ack + one smaller
  step + consent), wins-first recap, crisp dated asks save immediately with a
  sensible default.

Defect 2 — F1 cross-persona privacy: verified live that the #15041 FACTS
minimization gate holds (no code change needed); catalog rows flipped with
independent judge scores.

Defect 3 — SCHEDULED_TASKS schema jargon / fabricated confirmations:
- core.simple_completed_side_effect_claim response-handler evaluator: a
  Stage-1 simple-path reply that claims an already-completed scheduling/save
  side effect (no tool ran) is rerouted to the planner so a real action does
  the work — fabricated "I've set two reminders / session-only" confirmations
  can no longer ship.
- Plain-words confirmation guidance in the lifeops provider; deadline phrases
  ("by the 20th") are extracted as dated once-cadences instead of triggering
  an exact-time interrogation.

Harness: CerebrasJudge honors CEREBRAS_BASE_URL / CEREBRAS_JUDGE_MODEL /
EVAL_CEREBRAS_API_KEY so scenario judging can run independently (gemma-4-31b
via the Eliza Cloud OpenAI-compat proxy) without flipping the under-test
provider selection.

All six blocked scenarios pass live (ELIZA_CHAT_VIA_CLI=claude text-planner
lane, independent gemma-4-31b judge, scores 1.00); catalog rows flipped to
verified with model + judge + runId notes.

Closes #16935

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…scaffolding catalog row

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…egenerate action manifest

The brief composer's narrow service interface lacked the new
listOwnerOccurrencesCompletedToday member (caught by workspace typecheck), and
the committed lifeops-bench action manifest carries the updated
SCHEDULED_TASKS taskId description (optional for history).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…untime

Satisfies the test-realness diff gate: no IAgentRuntime casts, no
createMockRuntime — the evaluator and backstop registry run on the production
runtime architecture.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nto My Apps, Tasks→Projects, automations via cloud on mobile

Four launch-screen fixes:

- Pendant transcript is a preview surface: forced into LAUNCHER_PREVIEW_IDS
  (same gate as feed/stream), hidden from the default launcher; the
  /pendant/transcript route stays addressable.
- One apps tile: the cloud-apps "Apps" tile is gone (LAUNCHER_HIDDEN_IDS);
  the Cloud Applications studio is reached from a cloud-gated row inside
  My Apps, and /cloud-apps deep links keep working. Label is now "Cloud Apps".
- The coding-task orchestrator surface presents as "Projects" (tile, header,
  palette, widget, route catalog); tab id "tasks" and /apps/tasks stay stable.
- The workflow surface (automations/workflow/trigger client methods) routes to
  the linked Eliza Cloud agent when the active base is the bundled mobile
  runtime, which never loads plugin-workflow — dedicated tiers serve real
  data, shared tiers surface the designed upgrade state, and no-cloud keeps
  the honest unavailable state (new workflow-surface-routing module).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Design doc for consolidating My Apps into Projects: Project as the one
durable object, app = published project (Cloud-gated publish, per-project
publish page with URL/monetization/analytics), agent publish/manage verbs,
5-phase implementation plan.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#16893 moved the Vite dev child from 'bun --bun vite' to plain Node for
correct WebSocket proxy upgrade semantics, but dropped the .js->.ts
specifier mapping Bun provided implicitly. Dev Smoke lanes export
NODE_OPTIONS=--conditions=eliza-source, which routes workspace packages
to their TypeScript sources whose NodeNext relative imports keep .js
extensions — so vite.config.ts loading died with ERR_MODULE_NOT_FOUND on
@elizaos/cloud-routing src/features.js, killing 'Vite HMR dependency-level
smoke' and 'bun run dev onboarding chat' on develop.

Spawn the Vite child with '--import tsx' (the same treatment the API child
already gets in dev-ui.mjs) in resolveViteCommand and the packages/app
dev scripts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Merge pull request #16962 from elizaOS/promote/verified-a71c622ac2
Wire the loopback provider forwarder into the acceptance gate (same
resolution helpers as cohort wiring, one forwarder for the gate lifetime,
per-harness lane env on smokes and sanity dispatches, teardown surfaced as a
gate step) so a gate pass certifies the exact cohort topology. Fix the
sanity-dispatch cwd (was the repo parent — benchmarks unimportable), clamp
sanity max_tasks to harness smoke limits, accept the designed incompatible
random-baseline outcome, and raise the benchmark-leg timeout to observed
runtime. The forwarder presents its own User-Agent upstream — Cloudflare
403s OpenAI/* UAs on the cloud proxy.

Fix the eliza smoke deflection ("Reply with the single word: PONG" →
canned fallback despite gemma returning a valid PONG envelope): the
say-literal recognizer now parses quantified units ("the single word",
"one word") without accepting bare determiners, and the bench server no
longer wraps identity-only benchmark contexts in the authoritative-context
scaffold that hid the ask from the anchored recognizers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…aging

- hermes_yc_bench was unsatisfiable from a clean clone: upstream deleted the
  calibrated fast_test/medium/hard presets in 38eaea7, an ancestor of
  PINNED_YC_BENCH_REVISION, while _verify_yc_presets still requires them.
  _verify_yc_presets now materializes the deleted TOMLs from the pin's own
  ancestry (PINNED_YC_PRESETS_SOURCE, worktree-only restore; HEAD stays at the
  pin) and still fails closed if restore leaves them missing. Verified against
  a preset-less pinned checkout: presets restore and load as ExperimentConfig
  under the pinned loader. _select_yc_preset also considers the checkout's
  preset dir, which leads PYTHONPATH at run time.
- agent_install.install_hermes falls back to virtualenv when stdlib venv has
  no ensurepip (Debian/Ubuntu without python3-venv).
- agent_install.install_openclaw installs under openclaw/v<version> to match
  openclaw_adapter.client's DEFAULT_BINARY_FALLBACK, so installs resolve even
  without the manifest.
- openclaw-adapter README: default model is gemma-4-31b (matches client.py).
- hermes-adapter AGENTS/CLAUDE: document the two-lane checkout reality
  (native client lane at ~/.eliza/agents/hermes-agent-src tracking main; env
  lane pinned at PINNED_HERMES_ENV_REVISION under benchmark-data/source-audit)
  and the upstream atroposlib submodule breakage workaround.

Tests: benchmarks/tests/test_agent_install.py 14 passed; hermes-adapter suite
155 passed; openclaw-adapter suite 130 passed, 4 skipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(benchmarks): campaign-proof routing, swap-safe resume, HF publishing, suite cleanup
fix(lifeops): repair the three live-proven persona defects — tool-then-reply synthesis, cross-persona privacy verify, scheduling jargon/fabrication in user copy
…structured logger (#16958)

Server-side ttsDebug was a dead diagnostic: it required a sink that no
production code ever installed, so ELIZA_TTS_DEBUG=1 produced zero [tts]
lines while operators believed tracing was on (#16347).

- @elizaos/shared ttsDebug now emits straight through the structured
  logger at info level when the flag is set — no per-host sink wiring
  exists to forget; the dead setTtsDebugSink API is removed.
- /api/tts/local-inference now traces server:local-tts:request/success/
  reject phases, mirroring the cloud proxy's server:cloud-tts:* tracing,
  so both server TTS paths are observable under the flag.
- Emission is covered by listener-stream tests against the real logger
  (no logger mocks) in shared, plugin-elizacloud, and
  plugin-local-inference, including flag-off silence.

Closes #16347

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…iew mutation ratchet and add a baseline-completeness sweep (#16951)

The #14369 ratchet only saw the 9 views listed in its baseline, so a
local-only mutation added to any unlisted first-party shell page shipped
without failing the ratchet. This maps every mutating page module under
packages/ui/src/components/pages into BUILTIN_VIEW_MUTATION_BASELINE —
mapped to registered semantic actions where a chat twin exists
(documents, files, memories, automations, triggers, skills, browser,
relationships) and exempt-with-reason where none can (chat itself,
launcher, native OS surfaces, cloud billing, pendant BLE capture,
release center) — and adds validateShellPageSweepCompleteness, which
walks the real pages directory and fails when a mutating page is neither
baseline-claimed nor exempt. Exemptions are themselves ratcheted: stale
or baseline-conflicting entries fail the sweep.

Closes #16944

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…MENT delete (#16963)

Author the two missing view-chat acceptance-bar scenarios from MVP
workstream 6 (View-chat row): natural "turn on voice" phrasing must drive
the SETTINGS voice section semantically and "delete that document" must
route to the DOCUMENT action - in both cases without the model emitting a
raw selector (no agent-fill/agent-click, no VIEWS synthetic-DOM fallback).

- settings-voice-toggle (live-only, app-control shard): a real model
  selects SETTINGS and drives the voice section's own write path; final
  checks pin the exact PUT /api/config persisted-prefs ledger and the
  voice-settings:apply broadcast ledger, including the #14910 twin
  defaults (silenceMs 650, speechRmsThreshold 0.003).
- live-document-delete (live-only): seeds a real global document through
  DocumentService; a whitelisted connector-admin (ADMIN) non-owner is
  refused by the owner-only mutation wall (document survives a real
  re-list), then the owner's natural delete removes it - asserted against
  store state, not reply phrasing.
- deterministic-settings-voice-actions / deterministic-document-actions:
  keyless twins pinning both payload contracts on the pr-deterministic
  lane, including invalid/out-of-range/not-found/missing-id rejections.
- core documents context now advertises delete: the live run exposed that
  a "save, search, recall"-only Stage-1 inventory makes models refuse
  "delete that document" as unsupported instead of classifying it.
- app-control HTTP loopback additionally captures /api/config (the route
  the SETTINGS voice section writes through); handlers stay exact-path.
- deterministic-action-coverage: SETTINGS leaves KNOWN_UNCOVERED;
  SETTINGS + DOCUMENT join COVERED_ACTIONS and the direct-only baseline;
  live-document-delete classified prose-only (no deterministic
  ACTION_PLANNER fixture - the twins gate the keyless lane).

Closes #16942

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
_load_huggingface hardcoded split="test" for every suite, but upstream
hlt-lab/voicebench shards sd-qa by dialect region (aus/gbr/.../usa) with no
"test" split, so the sd-qa suite always raised ValueError in HF mode.
Upstream VoiceBench reports sd-qa on the USA subset, so map sd-qa -> "usa"
via hf_split_for_suite and keep "test" for the other seven suites.

Verified against the live dataset: sd-qa now loads real audio samples
through _load_huggingface; package suite 33 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…; drop the dead Android post-delivery timeout env

The benchmark import graph resolves @elizaos/core via plugin-openai's tsconfig
to packages/core/dist/node, which does not exist on a fresh runner without a
build step. ELIZA_POST_DELIVERY_SIDE_EFFECT_TIMEOUT_MS has no reader after the
Promise.race removal in this branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same failure class as sd-qa (6bfd3af): upstream hlt-lab/voicebench
shards mmsu by academic subject with no "test" split, so HF-mode loading
always raised ValueError. Upstream VoiceBench reports MMSU across every
subject, so hf_split_for_suite now returns None for mmsu and the loader
unions all splits in sorted-name order (one split at a time, so a small
limit does not download the whole sharded suite).

Verified against the live dataset: mmsu loads real audio samples through
_load_huggingface; package suite 33 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…atency-final

fix: expose exact Cerebras chat latency
The AppUITests view walkthrough locates launcher tiles by exact
accessibility label; the tasks surface now presents as "Projects".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Launch-screen cleanup: pendant transcript preview-gated (off by default),
cloud-apps 'Apps' tile folded into My Apps, Tasks surface renamed to
Projects (labels only), automations routed via linked Eliza Cloud agent
on mobile instead of the false 'not available' state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shaw and others added 17 commits July 23, 2026 06:28
# Conflicts:
#	.github/workflows/coverage-gate.yml
#	packages/core/src/__tests__/message-regression-lane.test.ts
#	packages/scripts/__tests__/coverage-gate-test-only-pr.test.ts
#	packages/scripts/__tests__/coverage-workflow-source-condition.test.ts
#	packages/scripts/__tests__/run-changed-vitest-coverage.test.ts
#	packages/scripts/run-changed-vitest-coverage.mjs
#	scripts/security/coverage-changed-files.self-test.mjs
#	scripts/security/coverage-changed-files.sh
#	scripts/security/coverage-gate.awk
#	scripts/security/coverage-gate.self-test.mjs
…rack pass (#17002)

Carries forward the additive smoke test from #16928 after the core
service-less early-return fix landed on develop via #16808 (8ee057a):
a plugin without a services array must register and unload cleanly
through snapshotPluginServiceClasses/trackPluginServiceClasses without
disturbing another plugin's service ownership.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…16543)

* fix(orchestrator): separate generated scaffolds from agent residuals

Co-authored-by: wakesync <shadow@shad0w.xyz>

* fix(orchestrator): persist scaffold ownership safely

Co-authored-by: wakesync <shadow@shad0w.xyz>

* test(orchestrator): spawn isolated in the broker SKILLS.md advertisement test

writeSkillsManifest (096cb58) intentionally writes SKILLS.md only into
orchestrator-owned isolated scratch. The broker-advertisement test still
spawned non-isolated with a caller-owned workdir and read SKILLS.md from
the caller dir, so the file was legitimately never written: ENOENT before
coverage enforcement ever ran. Spawn with isolateWorkdir and assert against
the session's own result.workdir instead.

Co-authored-by: wakesync <shadow@shad0w.xyz>

* fix(agent-orchestrator): clear lint + changed-file coverage gate for the residuals-ownership stack

- reorder the orchestrator-artifact-ownership import members in
  orchestrator-task-service.ts and completion-residuals.test.ts for the
  biome 2.5.5 organizeImports sweep now on develop (#16814)
- export residualsOrchestratorOwnedArtifacts with structural Pick
  parameters and pin its contract in the canonical task-service suite:
  live ACP ledger wins, session-metadata fingerprints are the
  restart-safe fallback, no session / malformed records yield no
  ownership claims (fail-closed). Running the canonical suite in the
  changed-file lane also brings orchestrator-task-service.ts into LCOV
  (65% locally, above the 50% floor) instead of MISSING.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: retrigger pull request synchronization

Empty commit: the previous push did not produce a pull_request
synchronize event.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: wakesync <shadow@shad0w.xyz>
Co-authored-by: wakesync <wakesync@users.noreply.github.com>
Co-authored-by: Shaw <shawmakesmagic@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…fail-closed harness

The ELIZA_SENSITIVE_LIVE leg of the sensitive-request hosted-page e2e was a
placeholder that unconditionally threw, so supplying the documented
credentials could never turn it green (#16940). Replace it with a real
harness that drives the deployed cloud end to end when the gate is on:

- create over the real /api/v1/sensitive-requests API (API-key actor, real
  Postgres row, sr_ single-use token mint)
- the real hosted page shell at /sensitive-requests/:id serves HTML
- token-gated public view (no audit exposure to token holders)
- sessionless single-use-token submit of a random sentinel -> fulfilled,
  real org-secret row created (secret.set audit carries the secretId)
- replay of the consumed token rejected 409; tampered token rejected 401
  without burning the genuine one; canceled request refuses a late submit
- full audit-trail sequence asserted via the org-credentialed private view
  (the observation contract an agent container holds)
- every response body swept to prove the submitted value never appears in
  any transport payload

Secret target keys are minted per run (org secret names are unique and the
API has no delete endpoint), and 429s from the STRICT submit rate limit are
waited out so the harness is repeatable back-to-back. The connector-DM leg
sends the real Telegram Bot API tap-through DM (the production adapter wire
shape) and then fail-closed polls for the human hosted-page submit; it is
additionally gated on TELEGRAM_BOT_TOKEN + ELIZA_SENSITIVE_LIVE_TELEGRAM_CHAT_ID.

CI behavior is unchanged: without the env the live tests skip with a reason
and the nine deterministic cases still run.

Part of #16940

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…17013)

PR #16970 accidentally committed ~27 MB of locally built fused-inference
shared libraries (.fused-lib/*.so + build stamp) at the repo root. Nothing
consumes them: the voice-live-e2e workflow builds the fused lib in its own
voice-fused-build job into $GITHUB_WORKSPACE/fused-lib and hands it to the
self-hosted jobs as an artifact. Delete the directory and gitignore both
staging-dir spellings so a local stage-desktop-fused-lib.mjs run can never
be swept into a commit again. Flagged pre-merge on #16970 but the PR merged
before the lane removed them.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… side-effect-claim sentence anchor (#16987)

* fix(benchmarks): exclude nested .git repos from HF uploads too

PR #16954 review follow-up: HF_UPLOAD_IGNORE_PATTERNS had .git/** but not
the **/.git/** twin the file's own comment mandates. The local walker
matches directory patterns at any depth, but HfApi.upload_folder's
filter_repo_objects fnmatches the full relative path only — so a nested
git repo under benchmark_results/ would be uploaded to the Hub while
absent from the printed upload set and the secret scrub (the unsafe
direction of a set mismatch). Adds the twin plus an exclusion-parity
test covering both the local walker and an fnmatch simulation of the
HF-side filter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(core): anchor bare 'done —' side-effect claim to sentence start

PR #16966 review follow-up: the done\s*[—–-] branch of
COMPLETED_SIDE_EFFECT_CLAIM_PATTERN false-positived on congratulations
like "Well done — that's every task cleared.", wrongly rerouting a
simple-path reply to the planner. The branch is now anchored to the
start of the (trimmed) reply or of a sentence ((?:^|[.!?]\s+)done),
so "Done — I've set two reminders." still trips the guard while
mid-sentence "well done —" praise passes through. Adds regression
cases for both directions plus the "All done — reminders are set"
route through the reminders-are-set branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(test): point plugin-sql/signal/whatsapp vitest aliases at src/ — typescript/ no longer exists

The stale path made the core vitest lane's @elizaos/plugin-sql alias resolve to
a nonexistent file, surfacing as "Cannot find package '@elizaos/plugin-sql'"
in the coverage lane for any test using the PGLite runtime helper (first
exposed by the #16966 test file; that PR was admin-merged over the red).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Shaw <shawgotbags@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
test(cloud): real fail-closed live harness for the hosted-secret round-trip
fix(ci): isolate Local Inference benchmark backend
…16647)

* fix(cloud): gate the snapshot lane fail-closed and bound hydration

The production provisioning worker repeatedly exhausted its Node heap
processing agent_snapshot work: hydration buffered the entire snapshot
body unbounded (res.json()) then re-stringified it to measure size —
doubling peak memory — with no independent switch for the lane and no
way to keep a restart from resurrecting snapshot jobs.

Fail-closed lane gate (#16639):
- agent_snapshot claiming and startup recovery are disabled unless
  ELIZA_SNAPSHOT_JOBS_ENABLED is exactly 'true'; every other lifecycle
  lane stays independently operable. The stale sweep deliberately keeps
  the lane (a DB-only pending flip, no hydration) so stuck rows drain
  the moment operators enable it.
- Belt at the dispatch: a snapshot job claimed through any other path
  while gated is re-scheduled without burning an attempt — observable,
  never a fabricated success.
- When enabled, the lane is forced sequential (batch 1) so phases
  settle before another payload is allocated.

Bounded hydration:
- fetchSnapshotState streams the body against a raw byte budget —
  bytes past it are never retained; the parse is fail-closed on
  malformed JSON; expanded file-count and byte budgets (workspaceFiles
  + every manifest file set, counting max(declared, decoded) so a lying
  manifest cannot under-declare) are validated before persistence; the
  measured size comes from the counted stream instead of a re-stringify.
- Budgets env-overridable for the staging soak (raw 256MiB, 5000 files,
  expanded 384MiB defaults).

Tests: gate exact-match + claim/recovery exclusion + batch-1, the
dispatch suite arms the gate per snapshot case, streaming budget
rejection, expanded-budget fail-closed. Two composite coverage lanes
join the workflow's process-isolated list (their suites interfere in a
shared process — the exact reason that list exists).

Fixes #16639

* test: arm the snapshot gate in the delete-lifecycle suites

The Agent-not-found and idle-SKIP suites drive the gated snapshot
execution path; per-case/per-suite arm with restore, mirroring the
dispatch suite — never module-wide, since shared-process runs share
the env.

* test(cloud): lift eliza-sandbox changed-file coverage over the 50% gate

Compose the shared-billing, bridge-failureKind, bridge-delta-SSE, and
coding-container-quota suites as isolated 16639 coverage lanes (the gate
runs each changed test file in its own process, so the interference that
kept them out of lane 1 cannot occur there), and cover the remaining
hydration budget edges: the reader-less readBodyWithinBudget fallback on
both sides of the budget, and the manifest file-set counters -- every
component file-set plus configFile, on both sides of the
max(declared, decoded) accounting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Sol <sol@shad0w.xyz>
Co-authored-by: Shaw <shawmakesmagic@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* test(dev): cover source-conditioned Vite imports

* fix(app): align interaction coverage signals

* test(app): refresh chat minimalism baseline

* test(app): classify simple views interaction coverage

---------

Co-authored-by: Shaw <shawgotbags@gmail.com>
… trunk (#17016)

MyAppsView gained a Cloud Apps studio row (navigateBrowserPath onClick) in
e0cb8de, which merged in parallel with the #16951 completeness sweep;
both branches were green alone but the combined trunk fails the sweep with
an unmapped-mutating-page finding for MyAppsView. Map it to BROWSER with the
count pinned at the single observed site.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…16979)

* fix(app-control): humanize settings route failures in chat replies

A failed settings loopback route used to narrate raw internals to the user
('I couldn't change ... : route /api/views/settings/navigate returned 401'),
the class behind the settings-open 'Authentication error' QA report. Map the
failure classes to copy a person can act on:

- 401/403 -> transient session hiccup with an explicit retry affordance
- 404 -> surface not available in this app version
- 408/429/5xx -> temporary error + retry, keeping a descriptive server
  detail and dropping boilerplate status-text bodies
- other client errors -> prefer the server's descriptive error verbatim;
  the technical path/status fallback remains only when nothing better exists

Frontend/narration only: no route, API, or auth behavior changes.

* chore: refresh PR checks

---------

Co-authored-by: 0xSolace <shadow@shad0w.xyz>
Refs #16431.

Co-authored-by: Shaw <shawgotbags@gmail.com>
* fix(ui): staged human copy for provisioning + cold-boot waits

The 30s+ provisioning wait narrated raw backend job states to the user
('Status: pending...', 'Starting your agent (unknown) — 35s elapsed...')
and otherwise sat static, the 'no progress feedback during provision' class
from the 2026-07-22 QA reports. Replace both poll-tick narrations:

- provision job wait: staged copy driven by the real job status
  (getting environment ready -> starting your agent), advancing to
  reassurance copy past 20s and to elapsed-time copy past 60s
- dedicated cold-boot wake wait: expectation-setting copy for the first
  minute, then minute-bucketed progress

Both are bucketed (30s / 1min steps) because consumers seed one chat turn
per unique status text, so per-tick counters would spam the transcript.
No control-flow, polling, or API changes — narration strings only.

* chore: refresh PR checks

---------

Co-authored-by: 0xSolace <shadow@shad0w.xyz>
@0xSolace
0xSolace merged commit c97a73b into main Jul 23, 2026
160 of 195 checks passed
@0xSolace
0xSolace deleted the promote/verified-9f4dbdb branch July 23, 2026 12:04
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR title does not match the required pattern. Please use one of these formats:

  • 'type: description' (e.g., 'feat: add new feature')
  • 'type(scope): description' (e.g., 'chore(core): update dependencies')
    Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, release

@github-actions

Copy link
Copy Markdown
Contributor

LifeOps Multi-Tier Benchmark

Suite: smoke — Tiers requested: large,frontier

large

LifeOps Multi-Tier Benchmark

Tier: large
Suite: smoke

frontier

LifeOps Multi-Tier Benchmark

Tier: frontier
Suite: smoke

Artifacts: lifeops-multi-tier-large-30005445953, lifeops-multi-tier-frontier-30005445953

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants