Repository navigation
Promote Dev_new_gui → main (2026-07-15 tech-debt drain + dependabot targeting fixes) - #11767
Merged
Merged
Conversation
…very + stub Redis in tests (#11144) 4 tests in tests/orchestration/test_causal_error_recovery.py failed on Dev_new_gui: FailurePatternDetector and sibling CausalErrorRecovery call .get()/.smembers()/.incr() on _get_redis(), which returns None when the circuit breaker is open (Redis unavailable in CI). The None deref raised AttributeError swallowed by a broad except, so learn/detect/record silently no-opped. Runtime: guard 'if redis is None' in 7 methods across both classes, logging explicit '... degraded — Redis unavailable' and returning safe defaults. Tests: inject minimal in-memory async+sync fake Redis so learn→detect→statistics and the feedback loop roundtrip without a live Redis. 20/20 file, 225 orchestration pass; black/isort/compile clean.
…1216) ChatWorkflowManager._current_lightweight_mode was set on the shared singleton at loop entry, reset in finally, and read during streaming — so two concurrent drivers of _execute_llm_continuation_loop (a real lightweight chat + the internal delegation subagent) could interleave and mis-tag the lightweight_mode_used cost badge. Replace the instance attribute with a module-level task-local ContextVar: each asyncio task carries its own value (concurrency isolation) and token-based set/reset restores the caller's value for nested drives — no hot-path parameter threading. Adds test_lightweight_mode_isolation.py proving concurrent drivers don't clobber (fails under the old implementation). black/isort/compile clean.
…Mixin (#11244) Both async tests imported the removed LLMHandler class (renamed to LLMHandlerMixin in the role-based restructuring) and failed with ImportError. They were half-migrated — already calling the current _prepare_llm_request_params — so only the import/instantiation was stale. Instantiate LLMHandlerMixin via __new__ (the tests mock every method they touch) and mock the newer _discover_ollama_from_slm() to return None so it falls back to the mocked endpoint. Full file now 6 passed (was 4 passed, 2 ImportError). black/isort clean.
… stale resolver tests (#11246) _resolve_web_fetch_cache_ttl reads config.misc.web_fetch_cache_ttl (a str SSOT field defaulting to ''), but the guard only checked 'is None' — so the unset (common) case hit int('') → ValueError → logged a WARNING on every call and at import. Treat empty/None as 'use default' silently; only a non-empty non-integer value warns. The resolver tests still patched os.environ but the resolvers read config.misc (loaded once at import), so overrides never applied (test_env_override failed even in isolation; siblings passed by accident). Patch config.misc.* instead; reframe the MaxBytes 'invalid string' case to the zero-fallback path. test_cache.py now 22 passed (was 20/2); no spurious warning when unset. black/isort clean.
…tive ports (#11224) Recurring SLM auditor: agent port_scanner captures bind address; asyncio loop flags sensitive+non-loopback ports as SecurityEvent (metadata only), deduped per node. PortInfo schema declares address so heartbeat ingest keeps it. 32 tests. Verified locally (black/flake8/pytest green; Semgrep OSS passed); required checks pending on backlogged self-hosted runner.
docs/developer/AGENT_MATURITY_LEVELS.md mapping the one-agent→specialists→orchestrator→automated-team ladder to concrete AutoBot constructs; linked from docs README. All references verified; docs-only.
#11089) find_similar_trajectories only isolated by tenant_id (#11015). In single-company mode tenant_id/org_id is frequently empty/identical across users, so a low-privilege user's trajectory could be retrieved into a different user's plan (intra-tenant cross-user injection). Add a user_id retrieval filter — ChromaDB where-clause ($and with tenant) + client-side backstop — gated by AUTOBOT_TRAJECTORY_USER_SCOPED (default TRUE = strict isolation; false to opt back into org-level shared learning). Thread user_id from both callers (orchestrator, workflow_planner); user_id already captured on write. 4 new tests + wiring test green; black/isort/compile clean. (code-quality red = pre-existing repo-wide Ansible drift #1629 on base, unrelated.)
The code-quality 'Check Ansible agent code drift (#1629)' step failed repo-wide because the canonical autobot-slm-backend/slm/agent/{agent.py,port_scanner.py} gained the GH#11224 security-posture-audit bind 'address' feature but the Ansible role copy was never synced — so ansible-deployed SLM agents lacked the #11224 bind-address capture (fleet audit inert on them). Synced the two canonical files into ansible/roles/slm_agent/files/slm/agent/. detect-agent-code-drift.sh reports 'in sync'; code-quality now green (was the repo-wide failing step). Both files py_compile.
…te + register (#11249) BaseProvider.chat_completion is a concrete wrapper (rate-limiter + backoff) around the @AbstractMethod _chat_completion_impl. Five providers still OVERRODE the concrete chat_completion and never implemented the abstract hook → class stayed abstract → TypeError: Can't instantiate abstract class → registration threw (caught at debug) → provider silently missing. On Ollama-only deployments all LLM chat was dead ('No available provider'). Renamed chat_completion → _chat_completion_impl in OllamaProvider, CustomOpenAIProvider, GroqProvider, HuggingFaceProvider, VLLMBaseProvider (+ test MockProvider) so they run inside the base wrapper. Added AST-based TestProviderConcreteness guard. All 5 verified concrete; 6 tests pass; black/isort/compile clean.
… disposal policy (#11129) Phase 2 of Company OS #11129. Projects gain an active→archived→pending_disposal→disposed lifecycle (replacing hard delete), governed by an SLM-configurable disposal policy (retention + optional second-pair-of-eyes approval; default immediate). Disposal deletes the linked non-shared codebase-analytics CodeSource (clone + index) but never the GitHub repo. Backend: lifecycle columns + merge migration (unifies pre-existing #11253 double head); delete_source_and_cleanup service; project_disposal cascade; disposal_policy SLM reader; archive/restore/dispose endpoints + DELETE reroute (emits approval_requested); celery-beat disposal sweep. Frontend: SLM disposal-policy panel; Company OS archive/delete/restore UI + i18n (11 locales). Reviewed via subagent-driven development (8 tasks + per-task reviews + Opus whole-branch review: MERGE). Fixed 2 production bugs found in review (post-commit session.refresh; NULL disposal_scheduled_at sweep exclusion). LLC suite 1096 passed. P3 tracked in #11271. Closes #11129
…erriding the wrapper) — Ollama/chat was dead (#11250) BaseProvider.chat_completion is a concrete wrapper (rate-limiter + backoff) around the abstract _chat_completion_impl. Five providers overrode the wrapper instead of implementing the abstract, leaving __abstractmethods__ non-empty so the class could not instantiate — registration threw (caught at debug) and the provider silently vanished. With Ollama gone and Bedrock unconfigured, the registry had no available provider and ALL chat failed (Company OS CEO chat returned only the clarify fallback). Rename the override to _chat_completion_impl in OllamaProvider, CustomOpenAI, Groq, HuggingFace, VLLMBase; they now also run inside the base rate-limit/backoff wrapper. Verified all five __abstractmethods__ empty; Ollama registers + chats live.
…1258) (#11259) The code-sync drift/resolve path synced code + pip + restart but skipped Alembic — so a merge that added DB columns deployed the new ORM but left the schema stale (UndefinedColumnError → 500s; Company OS went down twice on llc_work_items.requires_approval_before and llc_projects.code_source_id until migrations were applied by hand). Add _run_alembic_migrations() to _run_post_sync_steps for backend components that ship migrations (autobot-backend), between pip-install and restart, so the schema is current before the app starts. Uses 'upgrade heads' (tolerates parallel-branch multiple heads), loads the deployed .env for DATABASE_URL, and surfaces failures loudly in the step log + backend logs (non-fatal to the sync).
…aise test passes (#11248) (#11273) test_raises_on_4xx_response constructed aiohttp.ClientResponseError(None, None, status=400) — request_info=None makes str(exc) raise (it reads request_info.real_url), so the except block's logger.error(..., exc) crashed with a secondary exception before _send_webhook's real 're-raise' reached the caller, and pytest.raises(ClientResponseError) never saw the expected error. The service code is correct (log + raise); only the test's mock exception was malformed. Construct a proper RequestInfo (url/method/headers/real_url) so str(exc) works. Verified: notification_service_test now 45 passed on BOTH py3.10 and py3.12 (was 1 failed). One item off the #11248 test-remediation umbrella. black/isort clean.
…11261) (#11267) * feat(chat): wire trajectory learning into the single-agent chat loop (#11261) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. * fix(chat): lazy capture semaphore, bounded retrieval, capture after memory enqueue (#11261) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…nce (#11262) (#11268) * feat(workers): priority tiers so audit preempts low-priority maintenance (#11262) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
… detector (#11264) (#11274) * feat(security): confidence-gated hard-block mode for prompt-injection detector (#11264) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…11265) (#11275) * feat(security): SHA256 file-integrity manifest verified at startup (#11265) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…11276) * feat(delegation): harden governed delegation for enablement — depth/fan-out guards, observability, validation plan (#11266) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…fixes 37/38 (#11248) rag_service_events_test patched services.rag_service.publish_live_event, but the code calls publish_event (from events.bus; no publish_live_event exists) → every patch raised AttributeError at setup (whole file erroring). Renamed the 14 patch targets to publish_event + fixed the matching stale docstring in rag_service.py. 37 of 38 tests now pass (1 residual per-test mock-interception anomaly flagged on #11248). Test-only + docstring change. (smoke-test/hardened red = pre-existing intermittent 'autobot-slm container unhealthy' compose flake — base Dev_new_gui fails it too; unrelated to this diff; code-quality/SAST/startup/Unit all green.)
…smoke-test flake (#11283) (#11284) The required smoke-test failed ~60% of runs (base included) at compose startup with 'container autobot-slm is unhealthy', forcing an admin-bypass on every PR and masking real regressions. SLM (FastAPI + model/registry init) can exceed the 60s start_period on the busy shared self-hosted runner, so failing healthchecks counted before it was ready. Bump start_period to 120s to match autobot-backend — strictly more tolerant of slow startup, no other behaviour change.
…ICAL path (#11248) Two #11248 items. grounded_agent._reconstruct_response matched claims case-sensitively, so LLM-extracted claims differing in case from the source silently got no KB-source annotation; now matches case-insensitively (re.IGNORECASE) while preserving the response's original casing. test_causal_inference test_critical_severity: the code intentionally downgrades CRITICAL->DEGRADED when a high-confidence fix exists (documented); lower the test's intervention below that threshold to verify the true CRITICAL path with zero behaviour change. Verified py3.10 + py3.12. (smoke-test/hardened red = the pre-existing autobot-slm startup crash fixed separately in #11286, unrelated to this diff; all other required checks green.)
…er — SLM startup crash (#11283) The smoke-test 'flake' was a deterministic autobot-slm startup crash: autobot_shared/logging_manager._get_config_manager() did 'from config import config_manager', which the autobot-slm-backend config.py doesn't provide → ImportError at startup → uvicorn never served /api/health → compose unhealthy → smoke-test red. Wrap the lazy import in try/except; fall back to a _ConfigManagerFallback stub whose .get(key, default) returns the default, so logging uses built-in defaults instead of crashing. Every logging call site already passes a default. VERIFIED: smoke-test now PASSES (SLM container boots healthy). Fixes the repo-wide smoke-test flake + any SLM deploy using file logging.
…igrations from scheduler discovery (#11289) test_scheduler_registry::test_all_scheduler_files_registered failed: 2 real LLC background schedulers (llc/scheduler/heartbeat_scheduler.py, routine_scheduler.py — both started in initialization/lifespan) were absent from services/scheduler_registry.REGISTRY, and the discovery glob wrongly matched an Alembic migration. Registered both LLC schedulers (asyncio_per_worker, 5s poll) and excluded /migrations/ from _discover_scheduler_files(). 5/5 tests pass. Part of #11248.
… (#11287) * refactor(skills): extract SkillRegistry.register_declarative() public method (#11277) * fix(skills): re-register custom/hub skills at boot so they survive restart (#11277) * feat(scoping): add ScopeLevel enum mirroring SecretScope (#11277) * docs(skills): correct scoping package path to canonical autobot_shared/ (#11277) * feat(scoping): add resource_grants table + model + migration (#11277) * fix(scoping): drop redundant created_at redeclaration on ResourceGrant (#11277) * feat(scoping): add is_visible() authorization rule (#11277) * feat(scoping): add ResourceGrantStore CRUD + has_grant lookup (#11277) * feat(scoping): add can_access() resolver + decision cache (#11277) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…hlex hardening (#11291) (#11292) * fix(security): close ProcessAdapter host RCE — gate off + exec + minimal env (#11059) * harden(workspace): pids_limit fork-bomb guard + shlex exec tokenization (#11059) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…te /status (#11298) Closes the refresh/device SSRF-allowlist bypass (#11061): llm_shared/provider_auth.OAuthAuth._refresh now validates self._token_url via require_allowlisted_https before the outbound POST (covers DeviceCodeAuth, which refreshes through the same path; the initial device poll is already API-validated). OAuth host allowlist consolidated into autobot_shared.url_safety as the single source (get_oauth_allowed_hosts, call-time env override). /status now requires check_admin_permission. Headline state/PKCE callback binding split to #11297; remaining MEDs tracked on #11061.
…ts (#11256) Root cause: llc/tests/conftest.py replaced sys.modules['knowledge'] with a bare stub lacking a 'backends' submodule, so codebase_analytics/storage.py's module-level 'from knowledge.backends import ...' failed to collect when llc tests ran first. Fix adds a knowledge.backends stub (get_default_client/get_async_default_client) mirroring the existing embedding_cache/utils stubs. Cross-suite collection 1 error → 1237 tests; full llc suite 1099 passed, 0 regressions. Closes #11256
#11743) task_routes sends memory.* to the memory queue and analytics.* to the analytics queue, but no worker in the compose deployment consumed them — tasks sat in Redis until eviction. The Ansible systemd unit had the same class of gap: it starts with no -Q, which in Celery means only the default celery queue, stranding deployments/memory/analytics there too. - celery_app.py: declare task_queues (celery, deployments, memory, analytics) as the SSOT queue set — fixes the no--Q systemd worker - docker-compose.yml: worker --queues extended to the full set - start-celery-worker.sh: --queues extended (only worker in that flavor) - autobot-celery.service.j2: document the intentional absence of -Q - celery_queue_coverage_test.py: guard — every task_routes target queue must appear in task_queues and in each launcher's --queues list (text-parse; celery_app is heavy/pytest-stubbed per #7766) On-box compose smoke (enqueue memory-path task, confirm consumption) is box-gated; config-level verification done via yaml parse + tests.
…ded in TTS health and fleet UI (#11718) (#11726) * fix(slm/secrets): validate hf_token against HF at save time (#11718) Probe hf_token secrets against HuggingFace's whoami-v2 endpoint when saved via the SLM secrets API. A confirmed 401 rejects the save with HTTP 422 and a clear message; network failures (offline installs) never block the save, only return a non-blocking warning in the response. An invalid/revoked hf_token previously flowed silently through to the TTS worker, which fell back to an ungated model while still reporting healthy. * feat(tts): expose engine_degraded in worker health (#11718) Track HF-auth success and whether the gated (voice-cloning) weights actually loaded, and surface both as engine_degraded + degraded_reason in GET /health. The worker previously reported {status: healthy, model_loaded: true} even when HF login failed and it silently fell back to the ungated base model — operators had no signal the configured gated engine (TTS_MODEL_ID) never deployed. status stays 'healthy' (service is up); engine_degraded is a separate, additive signal. * feat(slm-ui): surface tts engine_degraded state in fleet service panel (#11718) Add a compact yellow 'Engine degraded' badge + reason line in NodeServicesPanel.vue when a service's extra_data carries engine_degraded (new i18n key fleet.nodeServicesPanel.engineDegraded; autobot-slm-frontend currently ships a single en.json locale, no other locale files exist yet in this app). Wire the pass-through end to end: reconciler._upsert_service now merges engine_degraded/degraded_reason from heartbeat svc_data into Service.extra_data (services/service_extra_data.py, mirrors the existing error_message handling) whenever an agent reports them, so the UI lights up as soon as the data is available. Note: the SLM agent does not yet probe any service's own /health endpoint (only systemctl status) so this field is not populated end-to-end yet for the TTS worker specifically — filed as a separate follow-up: #11723. * fix(slm/secrets): nosec B105 on hf_token key-name constant (#11718)
…gv (#11735) (#11744) Secret extra_vars (auto-merged stored SLM secrets, #3519) were passed as -e key=value CLI args, readable by any local user via /proc/<pid>/cmdline for the whole playbook run. They now go through a uid-scoped 0600 temp JSON file passed as -e @file, cleaned up in the same finally block as the per-run temp inventory.
#11723) (#11749) health_collector now issues a short-timeout local HTTP GET to the /health endpoint of app-health-capable services (starting with autobot-tts-worker) and folds engine_degraded/degraded_reason into the discovered-service dict. Non-fatal on any failure. Completes the #11718 pipeline: worker /health -> agent heartbeat -> reconciler engine_degraded_fields -> Service.extra_data -> NodeServicesPanel degraded badge.
…start path (#11496) (#11745) * fix(deploy): post-restart health poll + rollback in autobot_shared/library restart path (#11496) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…11517) (#11747) One OpenAICompatibleProvider now owns the request-building, response-mapping, tool-call parsing, streaming, and model-listing flow shared by the five providers speaking the OpenAI chat-completions dialect. Each concrete provider is a thin subclass carrying only its genuine deltas: - openai: SSOT key fallback chain, optional base_url, reasoning-effort mapping (#9017), prompt-cache payload normalisation (#7368) - groq: groq SDK client, historical omission of top_p - custom_openai: mandatory base_url, permissive api_key default, per-instance provider naming - openrouter: gateway base URL default, api_kwargs penalty forwarding, empty static model fallback - nous: HF token chain, HF inference base URL, 2048 default max_tokens, api_kwargs penalty forwarding, NOUS_MODELS fallback Drift bugs fixed by the shared flow (#10582-class divergence): - openrouter/nous accessed .role/.content on dict messages (AttributeError on every call); nous passed nonexistent model_name=/provider_name= kwargs to LLMResponse (TypeError violating the must-not-raise contract) - openrouter/nous gain tool wiring, finish_reason/processing_time/ request_id/total_tokens population, and reasoning_content capture - streaming now builds the same payload as non-streaming (top_p/stop/tools were silently dropped from openai/groq streams) and raises on error instead of yielding error text into the output stream (openrouter/nous) Breaker seam untouched: circuit-breaker accounting stays in BaseProvider._guarded_completion (GH#11488); _chat_completion_impl still returns errors via LLMResponse.error. Module paths, class names, provider ids, and registry/adapter construction sites are unchanged.
…ile_push fixtures, watchdog dep (#11687) (#11751) * fix(test): repair integration env-rot clusters — JSONB-on-SQLite, mobile_push fixtures, watchdog dep (#11687) - tests/integration/conftest.py: @compiles(JSONB|ARRAY, sqlite) -> JSON so Base.metadata.create_all works on in-memory SQLite (retention 13E, mobile_push 15E, budget 4E) - test_mobile_push.py: patch the real seam (user_management.database.get_async_session_factory — module imports it function-locally), sync session-factory mock (async-def handed 'async with' a coroutine), real EncryptionService with injected test key, stub _send_apns/_send_fcm transports (tests were written against the old always-succeed stubs), fix _send_web_push positional ttl assert - test_budget_hard_stop.py: autouse fakeredis fixture (task_claim_race pattern) instead of env ANALYTICS Redis (placeholder host locally); AgentWakeupRequest aligned to current model (runtime_state_id/reason, source/trigger_time removed); expire_all before cross-session re-select - test_execution_snapshot_api.py: dependency_overrides delegates so @patch on module attrs reaches Depends-captured callables (conftest auth-stub MagicMock made FastAPI demand args/kwargs query params -> 422); align list_by_user + generic 403 'Access denied' contract - documentation_watcher_staleness_test.py: realign to async redis seam, function-local get_doc_indexer_service, enqueue-based _handle_update (#4453); pre-import patched modules so patch() hits the canonical sys.modules entry - requirements-ci/utilities.txt: add watchdog==6.0.0 (services/documentation_watcher imports it; test file failed collection) - llm_shared/fallback_chain.py: pre-existing bug exposed by suite — manager only resolved chains keyed by primary model, so multi-hop fallback died after the first hop; scan chains for mid-chain models (test_multiple_fallback_hops) tests/integration: 541 passed, 0 failed, 0 errors, 24 skipped (pre-existing 'Redis not available' guards) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Bumps the all-dependencies group in /autobot-infrastructure/shared/mcp/tools/context7 with 1 update: [typescript](https://github.com/microsoft/TypeScript). Updates `typescript` from 6.0.3 to 7.0.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Commits](https://github.com/microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: typescript dependency-version: 7.0.2 dependency-type: direct:development update-type: version-update:semver-major dependency-group: all-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… base (#11664) (#11752) * refactor(registries): unify credential-gated registries behind shared base (#11664) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…apability lookup (#6828) (#11756) * refactor(orchestration): resolve AgentRegistry naming fragmentation — canonical service + renamed distinct registries (#6828) * chore(types): regenerate api.ts from backend OpenAPI schema Auto-regenerated (py3.14) to match the backend schema so the required verify-generated-types gate passes. Triggered by auto-fix-generated-types.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…11290 part 1 (#11758) (#11760) * test(authz): parity decision-matrix tests for secret + knowledge access (#11290) * refactor(authz): canonical visibility-scope enum + shared principal primitives (#11290) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…mponents (#11727) (#11757) * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Wrap all user-visible strings in SecretsSettings.vue and RolesView.vue (buttons, headings, paragraphs, placeholders, aria-labels, confirm() messages) in $t(), adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Sweep FleetOverview.vue and AddNodeModal.vue — buttons, headings, aria-labels, placeholders, confirm()/alert() messages, and dynamic computed strings — adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Sweep FindingsPolicySettings.vue and ToolsView.vue — headings, labels, buttons, aria-labels, placeholders, and dynamic result strings — adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Sweep LoginView.vue — aria-labels, placeholders, button loading states, and the SSO-login error message — adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Sweep Sidebar.vue — nav item labels, aria-labels, fleet-health status, high-contrast toggle, and user/logout chrome — adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Sweep NodeCard.vue — dynamic aria-labels/titles, health-metric labels, relative last-seen text, and pluralized badges — adding matching keys to src/locales/en.json. * i18n(slm-frontend): wrap hardcoded UI strings in $t() (#11727) Automated sweep of remaining hardcoded user-visible strings across src/views and src/components (68 files) — text nodes and title/placeholder/alt/aria-label/label attributes wrapped in $t() with new flat-dotted en.json keys mirroring each file's directory namespace, reusing identical existing keys within the same namespace. Handles multi-line text nodes, PEM/cert placeholder newlines, and split-sentence markup (inline <code> left untranslated). * i18n(slm-frontend): wrap dynamic/ternary hardcoded UI strings (#11727) Second wave of the i18n sweep: mixed static-text+interpolation nodes (e.g. '{{ count }} Nodes'), ternary/fallback string literals in answer position (e.g. cond ? 'Valid' : 'Invalid'), and dynamic backtick-templated attributes (aria-label/title/message) across src/views and src/components. Reuses existing en.json keys for identical strings; comparison operands and technical enum values (option value=, service/repo identifiers, protocol/signal names) are left untranslated by design. Fixes a SortKey type regression in NodeMetricsGrid.vue introduced mid-sweep (sort-key argument to getSortIcon() must stay a literal, not go through $t()).
… _real_load_and_bind (#11730, #11731) (#11763) * refactor(test): fold _load_llm_sub + npu_profile_suggester loads onto _real_load_and_bind (#11730, #11731) * chore(types): regenerate api.ts from backend OpenAPI schema Auto-regenerated (py3.14) to match the backend schema so the required verify-generated-types gate passes. Triggered by auto-fix-generated-types.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…lly redact (#11762) (#11764) * fix(security): normalize SENSITIVE_KEYS so api_key dict entries actually redact (#11762) * chore(types): regenerate api.ts from backend OpenAPI schema Auto-regenerated (py3.14) to match the backend schema so the required verify-generated-types gate passes. Triggered by auto-fix-generated-types.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…etScope name collision (#11759) (#11765) * refactor(authz): rename legacy chat-secrets scope enum — resolve SecretScope name collision (#11759) * Auto-fix: code formatting Applied Black, isort, and autoflake to match code-quality checks. Triggered by workflow auto-fix-formatting.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…sible primitive (#11290) (#11766) * test(authz): extend parity matrices — null-session grant, non-list JSONB guards, anon-owner, cross-subsystem scope rows (#11290) * refactor(authz): secrets + knowledge access decisions on shared is_visible primitive (#11290) * chore(types): regenerate api.ts from backend OpenAPI schema Auto-regenerated (py3.14) to match the backend schema so the required verify-generated-types gate passes. Triggered by auto-fix-generated-types.yml. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…w_gui content kept (promotion #11767 unblock)
merge(main): absorb out-of-process main commits — unblock promotion #11767
Contributor
✅ SSOT Configuration Compliance: Passing🎉 No hardcoded values detected that have SSOT config equivalents! |
Contributor
AutoBot Phase Validation ResultsSystem Maturity: 96.5% Phase Status:PASS Phase 1: Core Infrastructure: 100.0% Recommendations:
|
| """Fetch Reddit posts; raise BackendError on network, HTTP, or parse failure.""" | ||
| headers = {"User-Agent": _USER_AGENT} | ||
|
|
||
| if request.url and "reddit.com" in request.url: |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This was referenced Jul 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Thinking Path
Owner-approved promotion (2026-07-15). Two of today's fixes only take effect from the default branch: the dependabot auto-retarget workflow (#11696/PR #11724) and the dependabot.yml rules (websockets/@pinia caps — stale main config caused today's unsatisfiable groups #11721/#11746). main also carries 93 open dependabot security alerts whose fixes largely already sit on Dev_new_gui (verified today on #11715/#11716 — every pin superseded).
What Changed
Everything merged to Dev_new_gui since the last promotion, including today's drain: 28 tech-debt issues closed across 22 PRs (umbrella #11725) — dependabot retarget workflow, conftest/test-rot repairs (integration suite now 541/0/0), celery queue coverage, singleton + provider + registry + AgentRegistry + visibility/authz consolidations, sandbox stderr split, restart health poll + rollback, and the credential-redaction security fix (#11762).
Verification
@dependabot recreateon chore(deps): bump the all-dependencies group across 1 directory with 21 updates #11746 so the pinia-capped group regenerates against the now-live config.Model Used
Claude Fable 5