diff --git a/docs/design/limits-and-recovery.md b/docs/design/limits-and-recovery.md index 9e1f3a2d68..014351dd0e 100644 --- a/docs/design/limits-and-recovery.md +++ b/docs/design/limits-and-recovery.md @@ -275,7 +275,8 @@ that argument; raising a runtime default cannot override it. The resource owner constructs `details.limit` from the registry plus the budget it actually enforced. Metadata includes `agent_editable: true`, -`scope: "rea-runtime"`, and `rea_restart_required: false`. Optional +`scope: "rea-runtime"`, and `effect: "immediate"`. `rea_restart_required: false` +remains as a compatibility alias of that effect. Optional `required_value`, `source`, and `parameter` fields are supplied only where known or applicable. Do not infer a source because a value happens to equal a default. Error copying, attribution, redaction, and delivery must preserve these facts. @@ -290,8 +291,11 @@ so its adapter projects with an explicit `"invocation"` caller lifetime. `scope: "rea-invocation"`, `applies_at: "next_invocation"` and the launch `environment` seed when one exists. `agent_editable: true` still holds, because the caller chooses that environment value or per-call `parameter` for the new -invocation; `rea_restart_required: false` means no running REA process needs a -restart. A producer keeps guidance that holds only while its caller retains the +invocation; `effect: "immediate"` (and its compatibility alias +`rea_restart_required: false`) means no running REA process needs a +restart. `effect: "next_process"` is the other value, used when a change waits +for the next REA process. `restart_required` and `restartRequired` are the same +alias under older names. A producer keeps guidance that holds only while its caller retains the session, such as "the Ghidra session remains usable" or a same-session runtime update, in `continuingCallerGuidance`; the shared presentation adds it only for a continuing caller. The producer's own message and remediation must stay true diff --git a/docs/design/rea-limit-inventory.md b/docs/design/rea-limit-inventory.md index ab9edf79b9..c795d86c70 100644 --- a/docs/design/rea-limit-inventory.md +++ b/docs/design/rea-limit-inventory.md @@ -21,9 +21,13 @@ with an injected timeout; `npm run test:local -- src/hopper/bridgeBootstrapLimit verifies the separate launcher output. Neither test is run by Node lint. A skipped Python test leaves its behavior unverified. -`effect` is not unified yet. The restart column is the structured field a -failure uses today. Prose that only says to restart REA is marked `prose`. -`mcp_server_restart_required` is a server-identity alignment state in +The field that says when a change takes effect is `effect`: `immediate` or +`next_process`. Runtime analysis settings, per-call parameters, and artifact +reader limits use `immediate`. Debugger pool caps and an invalid Windows +ChangeTime launch value use `next_process`. `rea_restart_required`, +`restart_required`, and `restartRequired` remain as compatibility aliases and +are true only for `next_process`. Prose that only says to restart REA is marked +`prose`. `mcp_server_restart_required` is a server-identity alignment state in `src/serverIdentity.ts`, not a setting flag. Three numeric limits are absent from this tree and are being moved into the @@ -54,9 +58,9 @@ settings. They are not on the restart-only list. Already adjustable with `update_analysis_settings`. Each call reads the snapshot accepted for that operation. Launch source is `default` or `setting`; a runtime -override is `source: "runtime"`. The structured restart field is -`rea_restart_required: false`. `applies_at` is the finer point (`next_operation`, -`next_worker`, or `next_startup`). +override is `source: "runtime"`. The structured field is `effect: "immediate"`. `rea_restart_required: false` +remains as a compatibility alias. `applies_at` is the finer point +(`next_operation`, `next_worker`, or `next_startup`). | Setting | Environment seed | Owner | Default | Floor | Maximum | Read | | -------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------- | ----------------------------------------- | ---------------: | -------------------------------------: | --------------------- | @@ -89,47 +93,46 @@ floor, and maximum, and the migration reads the accepted snapshot instead of a value copied at process start. Until that lands they are `policy: "per-call"` in the registry so the static check still requires a reason. -| Environment | Owner | Default | Floor | Maximum | Read today | Restart field | -| ------------------------------------------ | ------------------------------------------- | ----------------------: | ----: | ---------: | ------------------------------------------------------------------------------------- | -------------------------------------------------- | -| `REA_BRIDGE_MAX_REQUEST_BYTES` | `src/config/bridgeMaxRequestBytes.ts` | 16777216 | 7464 | 536870887 | each bridge request, from the launch value | prose | -| `REA_DEBUGGER_COMMAND_DEADLINE_MS` | `src/domain/analysisResourceLimits.ts` | 120000 | 1 | 2147483647 | copied when the debugger manager is constructed; applied to each command | `restart_required: true` | -| `REA_DEBUGGER_MAX_COMMAND_OUTPUT_BYTES` | `src/domain/analysisResourceLimits.ts` | 16777216 | 1 | 89303718 | copied when the debugger manager is constructed; applied to each command | `restart_required: true` | -| `REA_HOPPER_CALLER_SCAN_BUDGET_MS` | `src/domain/analysisResourceLimits.ts` | 2000 | 1 | 2147483647 | each caller-scan operation, from config resolved at launch | prose | -| `REA_JEB_MCP_TIMEOUT_MS` | `src/jeb/JebMcpConnection.ts` | 60000 (MCP SDK default) | 1 | 2147483647 | captured when the JEB connection is created; applied to discovery and each tools/call | prose | -| `REA_KUNA_PROJECT_TIMEOUT_MS` | `src/kuna/KunaConfiguration.ts` | 1800000 | 1 | 2147483647 | project export and whole-program scans, from the launch configuration | prose | -| `REA_KUNA_TIMEOUT_MS` | `src/kuna/KunaConfiguration.ts` | 120000 | 1 | 2147483647 | each function decompile, from the launch configuration | prose | -| `REA_PWNTOOLS_MAX_INPUT_BYTES` | `src/native/pwntools/PwntoolsInputLimit.ts` | 33554432 | 1 | 1073741824 | each pwntools decode, unless the call passes `producer_limits.input_bytes` | prose | -| `REA_WINDOWS_CHANGE_TIME_DRIFT_MS` | `src/config/windowsChangeTimeSettle.ts` | 2000 | 1 | 60000 | each ChangeTime observation | `restartRequired: true` on an invalid launch value | -| `REA_WINDOWS_CHANGE_TIME_SETTLE_POLL_MS` | `src/config/windowsChangeTimeSettle.ts` | 25 | 1 | 1000 | each ChangeTime observation | `restartRequired: true` on an invalid launch value | -| `REA_WINDOWS_CHANGE_TIME_SETTLE_MAX_POLLS` | `src/config/windowsChangeTimeSettle.ts` | 40 | 1 | 1000 | each ChangeTime observation | `restartRequired: true` on an invalid launch value | +| Environment | Owner | Default | Floor | Maximum | Read today | Restart field | +| ------------------------------------------ | ------------------------------------------- | ----------------------: | ----: | ---------: | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| `REA_BRIDGE_MAX_REQUEST_BYTES` | `src/config/bridgeMaxRequestBytes.ts` | 16777216 | 7464 | 536870887 | each bridge request, from the launch value | prose | +| `REA_DEBUGGER_COMMAND_DEADLINE_MS` | `src/domain/analysisResourceLimits.ts` | 120000 | 1 | 2147483647 | copied when the debugger manager is constructed; applied to each command | `effect: "next_process"` (`restart_required: true`) | +| `REA_DEBUGGER_MAX_COMMAND_OUTPUT_BYTES` | `src/domain/analysisResourceLimits.ts` | 16777216 | 1 | 89303718 | copied when the debugger manager is constructed; applied to each command | `effect: "next_process"` (`restart_required: true`) | +| `REA_HOPPER_CALLER_SCAN_BUDGET_MS` | `src/domain/analysisResourceLimits.ts` | 2000 | 1 | 2147483647 | each caller-scan operation, from config resolved at launch | prose | +| `REA_JEB_MCP_TIMEOUT_MS` | `src/jeb/JebMcpConnection.ts` | 60000 (MCP SDK default) | 1 | 2147483647 | captured when the JEB connection is created; applied to discovery and each tools/call | prose | +| `REA_KUNA_PROJECT_TIMEOUT_MS` | `src/kuna/KunaConfiguration.ts` | 1800000 | 1 | 2147483647 | project export and whole-program scans, from the launch configuration | prose | +| `REA_KUNA_TIMEOUT_MS` | `src/kuna/KunaConfiguration.ts` | 120000 | 1 | 2147483647 | each function decompile, from the launch configuration | prose | +| `REA_PWNTOOLS_MAX_INPUT_BYTES` | `src/native/pwntools/PwntoolsInputLimit.ts` | 33554432 | 1 | 1073741824 | each pwntools decode, unless the call passes `producer_limits.input_bytes` | prose | +| `REA_WINDOWS_CHANGE_TIME_DRIFT_MS` | `src/config/windowsChangeTimeSettle.ts` | 2000 | 1 | 60000 | each ChangeTime observation | `effect: "next_process"` (`restartRequired: true`) on an invalid launch value | +| `REA_WINDOWS_CHANGE_TIME_SETTLE_POLL_MS` | `src/config/windowsChangeTimeSettle.ts` | 25 | 1 | 1000 | each ChangeTime observation | `effect: "next_process"` (`restartRequired: true`) on an invalid launch value | +| `REA_WINDOWS_CHANGE_TIME_SETTLE_MAX_POLLS` | `src/config/windowsChangeTimeSettle.ts` | 40 | 1 | 1000 | each ChangeTime observation | `effect: "next_process"` (`restartRequired: true`) on an invalid launch value | ## Restart-only numeric limits These stay out of `update_analysis_settings`. -| Environment | Owner | Default | Floor | Maximum | Read | Why restart-only | -| ----------------------------------- | -------------------------------------- | ------------------: | -------: | ------------------------: | ------------------------------------------- | ------------------------------------------------------------------------------------- | -| `REA_DEBUGGER_MAX_PENDING_COMMANDS` | `src/domain/analysisResourceLimits.ts` | 16 | 1 | 256 | debugger manager construction | Queue capacity of the manager created at startup. Field: `restart_required: true`. | -| `REA_DEBUGGER_MAX_SESSIONS` | `src/domain/analysisResourceLimits.ts` | 8 | 1 | 64 | debugger manager construction | Session-pool size of the manager created at startup. Field: `restart_required: true`. | -| `REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS` | `src/domain/hopperStartupFailure.ts` | 10000 | 1 | 2147483647 | Linux private-display adapter start | The helper reads the process environment. Prose restart. | -| `REA_JADX_ACTIVE_PROCESSOR_COUNT` | `src/android/JadxConfiguration.ts` | unset (JVM default) | 1 | 2147483647 | JADX JVM launch | `-XX:ActiveProcessorCount` is fixed for that JVM. Prose on invalid values. | -| `REA_JADX_HEAP_MIB` | `src/android/JadxConfiguration.ts` | unset (JVM default) | 1 | `Number.MAX_SAFE_INTEGER` | JADX JVM launch | `-Xmx` is fixed for that JVM. Prose on invalid values. | -| `REA_KUNA_CACHE_MAX_BYTES` | `src/kuna/KunaConfiguration.ts` | 4294967296 | 1048576 | `Number.MAX_SAFE_INTEGER` | Kuna cache construction | The cache is sized once for the provider. Prose restart. | -| `REA_KUNA_JOBS` | `src/kuna/KunaConfiguration.ts` | 1 | 1 | 32 | Kuna run-slot construction | Worker-pool width for the provider. Prose restart. | -| `REA_MCP_DOCTOR_DEADLINE_MS` | `src/config/mcpStartupBudgets.ts` | 30000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | -| `REA_MCP_FIRST_CATALOG_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 20000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | -| `REA_MCP_INITIALIZE_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 15000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | -| `REA_MCP_MAX_INPUT_ELEMENTS` | `src/config/mcpInputBudget.ts` | 1024 | 1 | `Number.MAX_SAFE_INTEGER` | MCP server creation | Argument admission for the server process. Prose restart. | -| `REA_MCP_MAX_RESPONSE_BYTES` | `src/config/mcpResponseBudget.ts` | 10485760 when unset | 10485760 | `Number.MAX_SAFE_INTEGER` | MCP server creation | Stdio receive buffer and the paired client buffer. Prose restart. | -| `REA_MCP_TOOLS_LIST_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 5000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | -| `REA_RECONNECT_TIMEOUT_SECONDS` | `src/hopper/BridgeLauncher.ts` | 30 | 30 | 30 | written into the Hopper bridge helper | Not a caller setting. It is `HOPPER_SHUTDOWN_TIMEOUT_MS / 1000`. | -| `REA_SWIFTC_COMPILE_TIMEOUT_MS` | `src/config/providerStartupTimeout.ts` | 120000 | 1 | 2147483647 | Darwin ownership-helper reader construction | Captured at process start for that helper compile. Prose restart. | +| Environment | Owner | Default | Floor | Maximum | Read | Why restart-only | +| ----------------------------------- | -------------------------------------- | ------------------: | -------: | ------------------------: | ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `REA_DEBUGGER_MAX_PENDING_COMMANDS` | `src/domain/analysisResourceLimits.ts` | 16 | 1 | 256 | debugger manager construction | Queue capacity of the manager created at startup. `effect: "next_process"` (`restart_required: true`). | +| `REA_DEBUGGER_MAX_SESSIONS` | `src/domain/analysisResourceLimits.ts` | 8 | 1 | 64 | debugger manager construction | Session-pool size of the manager created at startup. `effect: "next_process"` (`restart_required: true`). | +| `REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS` | `src/domain/hopperStartupFailure.ts` | 10000 | 1 | 2147483647 | Linux private-display adapter start | The helper reads the process environment. Prose restart. | +| `REA_JADX_ACTIVE_PROCESSOR_COUNT` | `src/android/JadxConfiguration.ts` | unset (JVM default) | 1 | 2147483647 | JADX JVM launch | `-XX:ActiveProcessorCount` is fixed for that JVM. Prose on invalid values. | +| `REA_JADX_HEAP_MIB` | `src/android/JadxConfiguration.ts` | unset (JVM default) | 1 | `Number.MAX_SAFE_INTEGER` | JADX JVM launch | `-Xmx` is fixed for that JVM. Prose on invalid values. | +| `REA_KUNA_CACHE_MAX_BYTES` | `src/kuna/KunaConfiguration.ts` | 4294967296 | 1048576 | `Number.MAX_SAFE_INTEGER` | Kuna cache construction | The cache is sized once for the provider. Prose restart. | +| `REA_KUNA_JOBS` | `src/kuna/KunaConfiguration.ts` | 1 | 1 | 32 | Kuna run-slot construction | Worker-pool width for the provider. Prose restart. | +| `REA_MCP_DOCTOR_DEADLINE_MS` | `src/config/mcpStartupBudgets.ts` | 30000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | +| `REA_MCP_FIRST_CATALOG_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 20000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | +| `REA_MCP_INITIALIZE_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 15000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | +| `REA_MCP_MAX_INPUT_ELEMENTS` | `src/config/mcpInputBudget.ts` | 1024 | 1 | `Number.MAX_SAFE_INTEGER` | MCP server creation | Argument admission for the server process. Prose restart. | +| `REA_MCP_MAX_RESPONSE_BYTES` | `src/config/mcpResponseBudget.ts` | 10485760 when unset | 10485760 | `Number.MAX_SAFE_INTEGER` | MCP server creation | Stdio receive buffer and the paired client buffer. Prose restart. | +| `REA_MCP_TOOLS_LIST_BUDGET_MS` | `src/config/mcpStartupBudgets.ts` | 5000 | 1 | 2147483647 | MCP server startup | Startup phase of the MCP server itself. Prose. | +| `REA_RECONNECT_TIMEOUT_SECONDS` | `src/hopper/BridgeLauncher.ts` | 30 | 30 | 30 | written into the Hopper bridge helper | Not a caller setting. It is `HOPPER_SHUTDOWN_TIMEOUT_MS / 1000`. | +| `REA_SWIFTC_COMPILE_TIMEOUT_MS` | `src/config/providerStartupTimeout.ts` | 120000 | 1 | 2147483647 | Darwin ownership-helper reader construction | Captured at process start for that helper compile. Prose restart. | ## Restart-only non-numeric settings -No floor or maximum. They are read from the launch environment (startup). None -of them use `rea_restart_required`, `restart_required`, or `restartRequired`; -recovery text tells the caller to change the launch environment. They stay +No floor or maximum. They are read from the launch environment (startup). None of them set `effect`. Recovery text tells the caller to change the launch +environment, which takes effect on the next process. They stay restart-only because they choose a command, a binary, a filesystem root, the browser sandbox, secret patterns, the provider, or the shape of the MCP server or logger. diff --git a/src/application/AnalysisSettings.ts b/src/application/AnalysisSettings.ts index 021f861ff3..29f89a5703 100644 --- a/src/application/AnalysisSettings.ts +++ b/src/application/AnalysisSettings.ts @@ -134,6 +134,7 @@ export class AnalysisSettings { }; }), active_work_changed: false as const, + effect: "immediate" as const, rea_restart_required: false as const, }); } diff --git a/src/artifacts/ArtifactReaderLimits.ts b/src/artifacts/ArtifactReaderLimits.ts index 858978c0e3..8e8ce77dfe 100644 --- a/src/artifacts/ArtifactReaderLimits.ts +++ b/src/artifacts/ArtifactReaderLimits.ts @@ -40,6 +40,7 @@ export const artifactReaderLimitFailure = ( applies_at: "next_operation", agent_editable: true, can_increase: canIncrease, + effect: "immediate", rea_restart_required: false, }, }); diff --git a/src/config/debuggerSessionLimits.test.ts b/src/config/debuggerSessionLimits.test.ts index 32d11a91fc..3a68fd6cf1 100644 --- a/src/config/debuggerSessionLimits.test.ts +++ b/src/config/debuggerSessionLimits.test.ts @@ -171,6 +171,7 @@ it("names the session setting on a Rizin capacity refusal", async () => { minimum: MINIMUM_DEBUGGER_MAX_SESSIONS, maximum: MAXIMUM_DEBUGGER_MAX_SESSIONS, unit: "sessions", + effect: "next_process", restart_required: true, max_sessions: 1, active_or_reserved_sessions: 1, diff --git a/src/config/windowsChangeTimeSettle.ts b/src/config/windowsChangeTimeSettle.ts index b5d83dd1cd..415ff72a2a 100644 --- a/src/config/windowsChangeTimeSettle.ts +++ b/src/config/windowsChangeTimeSettle.ts @@ -55,6 +55,8 @@ export interface WindowsChangeTimeSettingFailure { readonly floor: number; readonly maximum: number; readonly unit: "ms" | "polls"; + readonly effect: "next_process"; + /** Compatibility alias of `effect: "next_process"`. */ readonly restartRequired: true; } @@ -79,6 +81,7 @@ const windowsChangeTimeSettingFailure = ( floor: bound.floor, maximum: bound.maximum, unit: bound.unit, + effect: "next_process", restartRequired: true, }); diff --git a/src/contracts/analysisSettingsContracts.ts b/src/contracts/analysisSettingsContracts.ts index 6301dc4f71..c119711083 100644 --- a/src/contracts/analysisSettingsContracts.ts +++ b/src/contracts/analysisSettingsContracts.ts @@ -83,6 +83,7 @@ export const updateAnalysisSettingsResultSchema = }), ), active_work_changed: z.literal(false), + effect: z.literal("immediate"), rea_restart_required: z.literal(false), }); export const ANALYSIS_SETTINGS_TOOL_CONTRACTS = [ diff --git a/src/domain/analysisErrorProjection.test.ts b/src/domain/analysisErrorProjection.test.ts index f41b76fa33..9b85e69066 100644 --- a/src/domain/analysisErrorProjection.test.ts +++ b/src/domain/analysisErrorProjection.test.ts @@ -1512,6 +1512,7 @@ describe("analysis error projection: caller lifetime", () => { minimum: limit.minimum, maximum: limit.maximum, agent_editable: true, + effect: "immediate", rea_restart_required: false, applies_at: "next_invocation", scope: "rea-invocation", diff --git a/src/domain/analysisSettingDefinitions.ts b/src/domain/analysisSettingDefinitions.ts index 4df68a45cf..975f801d32 100644 --- a/src/domain/analysisSettingDefinitions.ts +++ b/src/domain/analysisSettingDefinitions.ts @@ -332,6 +332,7 @@ export const analysisSettingLimit = ( applies_at: definition.appliesAt, agent_editable: true, scope: "rea-runtime", + effect: "immediate", rea_restart_required: false, ...(definition.parameter === undefined ? {} diff --git a/src/domain/analysisSettings.ts b/src/domain/analysisSettings.ts index b9251232ee..881ae5add0 100644 --- a/src/domain/analysisSettings.ts +++ b/src/domain/analysisSettings.ts @@ -26,6 +26,14 @@ export interface AnalysisSettingsSnapshot { /** Injected by the runtime owner; reads the accepted operation's immutable snapshot. */ export type AnalysisSettingsReader = () => AnalysisSettingsSnapshot; +/** + * When a change takes effect for a running REA process. + * `immediate` needs no new process. `next_process` waits for the next start. + * Older booleans (`rea_restart_required`, `restart_required`, `restartRequired`) + * stay as compatibility aliases: true only when the effect is `next_process`. + */ +export type SettingChangeEffect = "immediate" | "next_process"; + /** Limit facts supplied by the failing owner, never inferred from error prose. */ export interface AnalysisSettingLimit { readonly setting: AnalysisSettingId; @@ -37,6 +45,8 @@ export interface AnalysisSettingLimit { readonly applies_at: "next_operation" | "next_worker" | "next_startup"; readonly agent_editable: true; readonly scope: "rea-runtime"; + readonly effect: "immediate"; + /** Compatibility alias of `effect: "immediate"`. */ readonly rea_restart_required: false; readonly required_value?: number; readonly parameter?: string; diff --git a/src/domain/artifactReaderLimits.ts b/src/domain/artifactReaderLimits.ts index 5241400f99..abc4bd98f4 100644 --- a/src/domain/artifactReaderLimits.ts +++ b/src/domain/artifactReaderLimits.ts @@ -191,6 +191,8 @@ export interface ArtifactReaderLimitFact { readonly applies_at: "next_operation"; readonly agent_editable: true; readonly can_increase: boolean; + readonly effect: "immediate"; + /** Compatibility alias of `effect: "immediate"`. */ readonly rea_restart_required: false; } diff --git a/src/domain/webNetworkCapture.ts b/src/domain/webNetworkCapture.ts index e0c3c1da45..ac9dc38a42 100644 --- a/src/domain/webNetworkCapture.ts +++ b/src/domain/webNetworkCapture.ts @@ -81,6 +81,7 @@ export const webNetworkCaptureBudgetFacts = ( ? MAX_WEB_NETWORK_CAPTURE_NESTING_DEPTH : Number.MAX_SAFE_INTEGER, applies_at: "next_operation", + effect: "immediate", rea_restart_required: false, }; }; diff --git a/src/ghidra/GhidraProvider.behavior.test.ts b/src/ghidra/GhidraProvider.behavior.test.ts index de27cfbd19..b11039212b 100644 --- a/src/ghidra/GhidraProvider.behavior.test.ts +++ b/src/ghidra/GhidraProvider.behavior.test.ts @@ -1983,6 +1983,7 @@ describe("Ghidra decompile deadline for a finished invocation", () => { minimum: 1, maximum: 2_147_483, agent_editable: true, + effect: "immediate", rea_restart_required: false, }; expect(invocation.details?.limit).toEqual({ @@ -4365,6 +4366,7 @@ describe("Ghidra startup deadline for a finished invocation", () => { setting: "ghidra.startup_timeout_ms", effective_value: 250, agent_editable: true, + effect: "immediate", rea_restart_required: false, }; const invocationLimit = { diff --git a/src/ida/IdaSessionClient.test.ts b/src/ida/IdaSessionClient.test.ts index 7192124e57..7d5b02da86 100644 --- a/src/ida/IdaSessionClient.test.ts +++ b/src/ida/IdaSessionClient.test.ts @@ -188,6 +188,7 @@ it.each(["initialize", "transport"])( applies_at: "next_operation", agent_editable: true, scope: "rea-runtime", + effect: "immediate", rea_restart_required: false, }, diagnostics: { producer_fact: "retained" }, diff --git a/src/process/ownedDebuggerSession.ts b/src/process/ownedDebuggerSession.ts index 8ba4b4e2bc..cf797ed06e 100644 --- a/src/process/ownedDebuggerSession.ts +++ b/src/process/ownedDebuggerSession.ts @@ -22,6 +22,8 @@ export const debuggerAdmissionDiagnostics = ( readonly minimum: number; readonly maximum: number; readonly unit: DebuggerAdmissionLimit["unit"]; + readonly effect: "next_process"; + /** Compatibility alias of `effect: "next_process"`. */ readonly restart_required: true; } => ({ setting: admission.setting, @@ -31,6 +33,7 @@ export const debuggerAdmissionDiagnostics = ( minimum: admission.minimum, maximum: admission.maximum, unit: admission.unit, + effect: "next_process", restart_required: true, }); diff --git a/tests/acceptance/analysisSettingsMcp.test.ts b/tests/acceptance/analysisSettingsMcp.test.ts index ca10a340a7..383def8ded 100644 --- a/tests/acceptance/analysisSettingsMcp.test.ts +++ b/tests/acceptance/analysisSettingsMcp.test.ts @@ -148,6 +148,7 @@ it("advertises exact contracts and recovers a full large-index archive over one expect(updated.structuredContent).toMatchObject({ revision: 1, active_work_changed: false, + effect: "immediate", rea_restart_required: false, }); const recovered = await invoke("inspect_artifact", {}); diff --git a/tests/boundary/mcp/ghidraDecompileDeadlineLifetime.test.ts b/tests/boundary/mcp/ghidraDecompileDeadlineLifetime.test.ts index c3fefcd010..c6150b5709 100644 --- a/tests/boundary/mcp/ghidraDecompileDeadlineLifetime.test.ts +++ b/tests/boundary/mcp/ghidraDecompileDeadlineLifetime.test.ts @@ -72,6 +72,7 @@ const enforcedLimit = { minimum: 1, maximum: 2_147_483, agent_editable: true, + effect: "immediate", rea_restart_required: false, }; /** A finished invocation can act only through a new invocation's launch value. */