diff --git a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md index 93cc878e0..2df2427e3 100644 --- a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md +++ b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md @@ -902,6 +902,11 @@ profile and assignment columns, but embedded table framing must route through lifecycle surfaces may expose the controls, but route-level authority must require `settings:write` plus the Discovery enablement gate, not `monitoring:write`, enrollment state, or any fleet lifecycle shortcut. + Forced workload discovery also remains API/service-owned for endpoint + identity: lifecycle surfaces must not fill a Proxmox parent node or agent + name into workload trigger hostnames when the operator did not provide one, + because the discovery service resolves VM and system-container names from + canonical state before suggesting URLs or classifying known services. The editor's probe step calls the aggregator probe endpoint and dispatches the detected or manually-selected type into a credential slot; it must not bypass the probe endpoint or fabricate probe diff --git a/docs/release-control/v6/internal/subsystems/ai-runtime.md b/docs/release-control/v6/internal/subsystems/ai-runtime.md index 13dd5d79b..9ad6b52b7 100644 --- a/docs/release-control/v6/internal/subsystems/ai-runtime.md +++ b/docs/release-control/v6/internal/subsystems/ai-runtime.md @@ -254,7 +254,7 @@ runtime cost control, and shared AI transport surfaces. divergence must be sourced from canonical `ReadState.DockerHosts()` views, with model-shaped data limited to the watcher adapter input rather than direct `StateSnapshot.DockerHosts` reads in the Patrol run loop. -4. Keep discovery scheduling authoritative through `internal/config/ai.go`: `discovery_enabled` and `discovery_interval_hours` must govern both lightweight infrastructure discovery and deep service-discovery background loops. `internal/api/ai_handlers.go` must preserve an explicitly supplied `discovery_interval_hours: 0` as the manual-only setting and may only apply the 24-hour default when discovery is enabled without an explicit interval payload. Discovery analysis remains a Pulse tool-led model workflow: Pulse supplies agent/API/metrics evidence and cache orchestration, while the selected model provides the intelligence. Background, settings-triggered, or drawer-triggered discovery progress must describe that discovery analysis directly and must not imply a live Pulse Assistant chat transcript unless the run is actually executing inside the chat surface. Settings-triggered manual discovery is an explicit operator refresh and must not open, append to, or masquerade as a Pulse Assistant session. Assistant and Patrol access to discovery must stay behind the governed `pulse_discovery` tool, including an explicit forced refresh action for known resources, while settings-level manual runs must use the canonical `/api/discovery/run` new/changed/stale sweep rather than a frontend-only shortcut. +4. Keep discovery scheduling authoritative through `internal/config/ai.go`: `discovery_enabled` and `discovery_interval_hours` must govern both lightweight infrastructure discovery and deep service-discovery background loops. `internal/api/ai_handlers.go` must preserve an explicitly supplied `discovery_interval_hours: 0` as the manual-only setting and may only apply the 24-hour default when discovery is enabled without an explicit interval payload. Discovery analysis remains a Pulse tool-led model workflow: Pulse supplies agent/API/metrics evidence and cache orchestration, while the selected model provides the intelligence. Background, settings-triggered, or drawer-triggered discovery progress must describe that discovery analysis directly and must not imply a live Pulse Assistant chat transcript unless the run is actually executing inside the chat surface. Settings-triggered manual discovery is an explicit operator refresh and must not open, append to, or masquerade as a Pulse Assistant session. Assistant and Patrol access to discovery must stay behind the governed `pulse_discovery` tool, including an explicit forced refresh action for known resources, while settings-level manual runs must use the canonical `/api/discovery/run` new/changed/stale/repairable sweep rather than a frontend-only shortcut. Fresh-but-unidentified service-discovery records are not complete when canonical resource metadata, stored facts, or safe command evidence can deterministically identify a known workload and endpoint; cached reads and the canonical sweep must repair those records instead of presenting `Unknown Service` as fresh. 5. Preserve auditability for outbound model-bound context exports and keep the export record aligned with the prompt boundary that actually reaches the provider External provider-bound unified-resource context must enforce the same data-handling policy the export audit records: `local-only` resources are diff --git a/docs/release-control/v6/internal/subsystems/api-contracts.md b/docs/release-control/v6/internal/subsystems/api-contracts.md index 56597ebb0..79538c7f0 100644 --- a/docs/release-control/v6/internal/subsystems/api-contracts.md +++ b/docs/release-control/v6/internal/subsystems/api-contracts.md @@ -175,6 +175,13 @@ summary response shapes used by the live discovery service. Live service data remains primary when a service is configured; mock fixtures may supplement or stand in for that data only in mock mode, and they must not expose raw command output or bypass the normal non-admin redaction path. +Forced discovery trigger requests must preserve workload identity at the API +boundary. `POST /api/discovery/{type}/{target}/{id}` may use the route target +as a hostname fallback only for host-agent discovery; VM, system-container, +Docker, and Kubernetes workload triggers must leave hostname empty unless the +caller supplied one so the discovery service resolves the workload name and +endpoint from canonical resource state instead of mistaking the parent node for +the workload endpoint. Source-specific backup artifact routes are canonical API payload boundaries. `/api/backups/pve` owns Proxmox VE task, storage-archive, and guest-snapshot diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index ca003d750..9937b633f 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -974,7 +974,12 @@ not a replacement status card, CTA band, or page-local nested card. The same workload-discovery settings section must expose a manual "Run discovery now" action wired through `/api/discovery/run` when workload discovery is enabled in manual-only mode, while resource-drawer - discovery remains the forced single-resource refresh path. + discovery remains the forced single-resource refresh path. The collapsed + section and run-action copy must make automatic scheduling visible by + distinguishing `Auto `, `Manual only`, and `Off`, and the run + action must describe whether it is executing the scheduled sweep or a + one-off manual-only sweep rather than implying recurring scans were + enabled. Assistant-only controls inside the shared shell, such as execution permissions and session maintenance, must stay explicitly labeled as Pulse Assistant controls, while Patrol schedule and autonomy diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index edc79212f..6a1867396 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -473,6 +473,12 @@ recovery scope, or a storage/recovery-owned secret source. commands, adjacent storage/recovery surfaces must also inherit the API/runtime gate: `settings:write` plus enabled Discovery are required before command-backed refresh, and `monitoring:write` remains insufficient. + If the shared discovery boundary repairs a fresh unknown workload record + into a known service identity and endpoint candidate from canonical resource + metadata, stored facts, or safe command evidence, storage and recovery may + consume the repaired context only as read-only explanation; that repair does + not create backup visibility, restore authority, storage ownership, or a + recovery-local endpoint contract. That same adjacent `internal/api/` boundary also keeps public hosted signup commercial-only: storage and recovery surfaces must not infer tenant existence, email issuance, or readiness from `/api/public/signup` response diff --git a/frontend-modern/src/components/Settings/AIRuntimeControlsSection.tsx b/frontend-modern/src/components/Settings/AIRuntimeControlsSection.tsx index 996c83463..3acfc0ea4 100644 --- a/frontend-modern/src/components/Settings/AIRuntimeControlsSection.tsx +++ b/frontend-modern/src/components/Settings/AIRuntimeControlsSection.tsx @@ -56,8 +56,8 @@ export const AIRuntimeControlsSection: Component {state.form.discoveryIntervalHours > 0 - ? `${state.form.discoveryIntervalHours}h` - : 'Manual'} + ? `Auto ${state.form.discoveryIntervalHours}h` + : 'Manual only'} @@ -118,17 +118,19 @@ export const AIRuntimeControlsSection: Component

{state.form.discoveryIntervalHours === 0 - ? 'Workload discovery runs only when you click "Run discovery now" here or "Run Discovery" on a resource' - : 'Workload discovery will automatically re-scan resources at this interval'} + ? 'Automatic workload scans are off. Only manual refreshes will run.' + : 'Automatic workload scans will run at this interval.'}

- {state.form.discoveryEnabled - ? 'Runs the new, changed, and stale workload sweep used by the schedule.' - : 'Runs a one-time workload discovery refresh without changing the schedule.'} + {state.form.discoveryEnabled && state.form.discoveryIntervalHours > 0 + ? 'Runs the pending workload sweep used by the schedule.' + : state.form.discoveryEnabled + ? 'Manual-only mode: runs the pending workload sweep once without enabling recurring scans.' + : 'Runs a one-time workload discovery refresh without changing the schedule.'}