mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-08-01 19:18:35 -04:00
docs(discovery): improve map readability
This commit is contained in:
+23
-20
@@ -1,30 +1,33 @@
|
|||||||
# Discovery guide
|
# Odysseus discovery maps
|
||||||
|
|
||||||
Discovery keeps a shared maintainer understanding of how the checked-in Odysseus code works without becoming a permanent audit system. It is a compact companion to the code for cross-cutting systems, not a feature certification or a substitute for normal testing.
|
Compact, code-grounded maps of the cross-cutting systems in the checked-in Odysseus codebase. They are not a feature certification or substitute for normal testing, and do not become a permanent audit system.
|
||||||
|
|
||||||
## Working model
|
> [!IMPORTANT]
|
||||||
|
> Code is the source of truth for current behaviour. These specifications describe only the checked-in system and its current boundaries; keep them synchronized with relevant code changes.
|
||||||
|
|
||||||
- Code is the ground truth for current behaviour. Trace current paths in source before recording a claim.
|
## Explore the maps
|
||||||
- These specs record current code-grounded behaviour and system boundaries only. They do not record accepted intent, design direction, refactor plans, or decision history.
|
|
||||||
- Keep this package in sync with code changes that alter a documented cross-cutting system, its authority boundary, or its canonical implementation location.
|
|
||||||
- Do not exhaustively revalidate existing functionality simply because it appears in a map. Investigate when there is a report, normal use visibly fails, a change affects the area, or a high-authority boundary needs review.
|
|
||||||
- Record a confirmed, actionable problem in the relevant project within the canonical Plane workspace. Keep high-level design, prioritization, ownership, and refactor discussion in Plane. Do not create parallel issue lists here.
|
|
||||||
- After implementation changes the code, update the relevant map to describe the resulting current state.
|
|
||||||
- Review safety-sensitive authority first: execution, data access, external tools, credentials, destructive operations, and unattended work.
|
|
||||||
- Cite stable source locations such as modules, routes, classes, and functions. Avoid fragile line ranges and generated evidence tables.
|
|
||||||
|
|
||||||
## Package
|
| Document | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| [Current system map](system-map.md) | Explains the current subsystem boundaries, implementation locations, confirmed problems, and factual open questions. |
|
||||||
|
| [Safety boundaries](safety-boundaries.md) | Maps broad authority, safeguards, confirmed risks or gaps, and unverified behaviour. |
|
||||||
|
|
||||||
- [Current system map](system-map.md) describes the code-grounded subsystem boundaries.
|
## Working rules
|
||||||
- [Safety boundaries](safety-boundaries.md) records where review effort is most valuable.
|
|
||||||
|
|
||||||
The existing [architecture runtime inventory](../architecture-runtime-inventory.md) remains useful structural context. It is explicitly a draft snapshot; re-check its measurements against the code before using them for an implementation decision.
|
- **Trace the code first.** Confirm the current path in source before recording a claim.
|
||||||
|
- **Keep specs current-state only.** Do not record intentions, design direction, refactor plans, or decision history here.
|
||||||
|
- **Synchronize with code.** Update this package when a code change alters a documented cross-cutting system, authority boundary, or canonical implementation location.
|
||||||
|
- **Investigate with cause.** Do not exhaustively revalidate existing functionality without a report, visible failure, relevant change, or high-authority review need.
|
||||||
|
- **Keep planning in Plane.** Record confirmed problems in the relevant project within the canonical Plane workspace; keep high-level design, prioritization, ownership, and refactor discussion there.
|
||||||
|
- **Review authority carefully.** Give execution, data access, external tools, credentials, destructive operations, and unattended work focused review.
|
||||||
|
- **Use stable locations.** Cite modules, routes, classes, and functions instead of fragile line ranges or generated evidence tables.
|
||||||
|
|
||||||
## How to use this package
|
## Working flow
|
||||||
|
|
||||||
1. Start at the subsystem in the system map and confirm the relevant source.
|
1. Start with the relevant map and trace the cited code.
|
||||||
2. For a defect, create or update the relevant project within the canonical Plane workspace with a reproducible report and ownership.
|
2. For a defect, create or update the relevant project within the canonical Plane workspace with a reproducible report and ownership.
|
||||||
3. For a design, prioritization, ownership, or refactor question, use a Plane thread.
|
3. Use a Plane thread for design, prioritization, ownership, or refactor discussion.
|
||||||
4. Make and validate the implementation through the normal engineering workflow, then update this package if the code changed a documented system boundary.
|
4. After implementation changes the code, update the affected map to describe the resulting current state.
|
||||||
|
|
||||||
This package intentionally has no generator, validator, maturity scale, feature database, or duplicate work tracker.
|
> [!NOTE]
|
||||||
|
> This package intentionally contains no generator, validator, maturity scale, feature database, or parallel work tracker. The [architecture runtime inventory](../architecture-runtime-inventory.md) remains useful structural context, but is an explicitly draft snapshot.
|
||||||
|
|||||||
@@ -1,129 +1,142 @@
|
|||||||
# Safety boundaries
|
# Safety boundaries
|
||||||
|
|
||||||
This document prioritizes review of broad authority. It records code-grounded safeguards and questions; it does not declare a vulnerability merely because a feature is powerful. No destructive test, external connection, or real credential was used for this map.
|
> [!IMPORTANT]
|
||||||
|
> Broad authority does not by itself establish a vulnerability. This map records code-grounded safeguards, confirmed risks or gaps, and unverified behaviour. No destructive test, external connection, or real credential was used for this map.
|
||||||
|
|
||||||
|
## Navigate the boundaries
|
||||||
|
|
||||||
|
- [Shell and subprocess execution](#shell-and-subprocess-execution)
|
||||||
|
- [Filesystem access and workspace confinement](#filesystem-access-and-workspace-confinement)
|
||||||
|
- [Agent-controlled tool dispatch](#agent-controlled-tool-dispatch)
|
||||||
|
- [MCP and external tool servers](#mcp-and-external-tool-servers)
|
||||||
|
- [Outbound network requests and URL validation](#outbound-network-requests-and-url-validation)
|
||||||
|
- [Secrets, credentials, and vault sessions](#secrets-credentials-and-vault-sessions)
|
||||||
|
- [Authentication and privileged administration](#authentication-and-privileged-administration)
|
||||||
|
- [Deletion, wipe, backup, and restore](#deletion-wipe-backup-and-restore)
|
||||||
|
- [Background jobs and unattended task execution](#background-jobs-and-unattended-task-execution)
|
||||||
|
|
||||||
## Shell and subprocess execution
|
## Shell and subprocess execution
|
||||||
|
|
||||||
**Boundary.** Shell routes, agent bash and python tools, local model serving, and detached background jobs.
|
- **Boundary:** Shell routes, agent `bash` and `python` tools, local model serving, and detached background jobs.
|
||||||
|
|
||||||
**Available authority.** Commands run as the application process user and can create child processes.
|
- **Available authority:** Commands run as the application process user and can create child processes.
|
||||||
|
|
||||||
**User-controlled inputs.** Direct shell requests, model-produced tool arguments, scheduled-task prompts, and model-serving configuration.
|
- **User-controlled inputs:** Direct shell requests, model-produced tool arguments, scheduled-task prompts, and model-serving configuration.
|
||||||
|
|
||||||
**Current safeguards.** Agent dispatch applies owner/admin checks and tool policy; process helpers use timeouts or bounded background-job lifecycle where implemented.
|
- **Current safeguards:** Agent dispatch applies owner/admin checks and tool policy; process helpers use timeouts or bounded background-job lifecycle where implemented.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Intentional authority with a confirmed gap: the agent shell starts in its workspace but is not sandboxed to it, and has no egress sandbox. This is documented in source and the threat model; it is not a newly demonstrated bypass.
|
- **Confirmed risks or gaps:** Intentional authority with a confirmed gap: the agent shell starts in its workspace but is not sandboxed to it, and has no egress sandbox. This is documented in source and the threat model; it is not a newly demonstrated bypass.
|
||||||
|
|
||||||
**Required verification.** Role-gate and disabled-tool outcomes, direct shell-route behaviour, and timeout, cancellation, and output handling for foreground and detached processes remain unverified.
|
- **Unverified behaviour:** Role-gate and disabled-tool outcomes, direct shell-route behaviour, and timeout, cancellation, and output handling for foreground and detached processes remain unverified.
|
||||||
|
|
||||||
## Filesystem access and workspace confinement
|
## Filesystem access and workspace confinement
|
||||||
|
|
||||||
**Boundary.** Agent read, write, patch, listing, glob, and grep tools.
|
- **Boundary:** Agent read, write, patch, listing, glob, and grep tools.
|
||||||
|
|
||||||
**Available authority.** Read and modify files within active workspace confinement or fallback allowlisted roots.
|
- **Available authority:** Read and modify files within active workspace confinement or fallback allowlisted roots.
|
||||||
|
|
||||||
**User-controlled inputs.** Tool paths, patches, file contents, search patterns, and workspace selection passed into the tool dispatcher.
|
- **User-controlled inputs:** Tool paths, patches, file contents, search patterns, and workspace selection passed into the tool dispatcher.
|
||||||
|
|
||||||
**Current safeguards.** src/tool_execution.py resolves paths, blocks sensitive subpaths, applies allowlist containment, and tightens paths to the active workspace when one is bound. File tools use those resolvers.
|
- **Current safeguards:** [`src/tool_execution.py`](../../src/tool_execution.py) resolves paths, blocks sensitive subpaths, applies allowlist containment, and tightens paths to the active workspace when one is bound. File tools use those resolvers.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Intentional authority with safeguards. The file-tool policy does not sandbox the shell; treating a workspace as a whole-process containment boundary would be incorrect.
|
- **Confirmed risks or gaps:** Intentional authority with safeguards. The file-tool policy does not sandbox the shell; treating a workspace as a whole-process containment boundary would be incorrect.
|
||||||
|
|
||||||
**Required verification.** Traversal, symlink, sensitive-name, absolute-path, and workspace-switch behaviour remains unverified.
|
- **Unverified behaviour:** Traversal, symlink, sensitive-name, absolute-path, and workspace-switch behaviour remains unverified.
|
||||||
|
|
||||||
## Agent-controlled tool dispatch
|
## Agent-controlled tool dispatch
|
||||||
|
|
||||||
**Boundary.** Model output becomes native or parsed tool calls and is dispatched by the agent loop.
|
- **Boundary:** Model output becomes native or parsed tool calls and is dispatched by the agent loop.
|
||||||
|
|
||||||
**Available authority.** The authority of every enabled tool, including privileged built-ins and external tools.
|
- **Available authority:** The authority of every enabled tool, including privileged built-ins and external tools.
|
||||||
|
|
||||||
**User-controlled inputs.** Chat content, attached/retrieved content that may influence the model, tool arguments, per-request tool selection, and policy toggles.
|
- **User-controlled inputs:** Chat content, attached/retrieved content that may influence the model, tool arguments, per-request tool selection, and policy toggles.
|
||||||
|
|
||||||
**Current safeguards.** src/tool_security.py blocks protected tools for non-admin users and fails closed for malformed tool names; src/tool_policy.py supports disabled and guide-only policy; prompt-security helpers label untrusted context.
|
- **Current safeguards:** [`src/tool_security.py`](../../src/tool_security.py) blocks protected tools for non-admin users and fails closed for malformed tool names; [`src/tool_policy.py`](../../src/tool_policy.py) supports disabled and guide-only policy; prompt-security helpers label untrusted context.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Credible risk requiring verification: aliases, legacy text tools, native function calls, and MCP-qualified names must all reach the same policy outcome. The code has specific alias handling for email/MCP names, which makes this a sensitive compatibility seam.
|
- **Confirmed risks or gaps:** Credible risk requiring verification: aliases, legacy text tools, native function calls, and MCP-qualified names must all reach the same policy outcome. The code has specific alias handling for email/MCP names, which makes this a sensitive compatibility seam.
|
||||||
|
|
||||||
**Required verification.** The current policy outcomes for owner role, request mode, disabled state, native versus parsed invocation, qualified aliases, and external-content entry points remain unverified.
|
- **Unverified behaviour:** The current policy outcomes for owner role, request mode, disabled state, native versus parsed invocation, qualified aliases, and external-content entry points remain unverified.
|
||||||
|
|
||||||
## MCP and external tool servers
|
## MCP and external tool servers
|
||||||
|
|
||||||
**Boundary.** Configured MCP servers and their tools are exposed to the agent through the MCP manager and routes.
|
- **Boundary:** Configured MCP servers and their tools are exposed to the agent through the MCP manager and routes.
|
||||||
|
|
||||||
**Available authority.** Depends on the server: external network access, local process access, messaging, or data mutation may be delegated outside the application.
|
- **Available authority:** Depends on the server: external network access, local process access, messaging, or data mutation may be delegated outside the application.
|
||||||
|
|
||||||
**User-controlled inputs.** Server configuration, remote OAuth completion, tool arguments, and model-selected MCP calls.
|
- **User-controlled inputs:** Server configuration, remote OAuth completion, tool arguments, and model-selected MCP calls.
|
||||||
|
|
||||||
**Current safeguards.** MCP routes are registered through routes/mcp_routes.py; MCP-qualified tools are denied to non-admin users by src/tool_security.py. OAuth state and token persistence are handled in src/mcp_oauth.py.
|
- **Current safeguards:** MCP routes are registered through [`routes/mcp_routes.py`](../../routes/mcp_routes.py); MCP-qualified tools are denied to non-admin users by [`src/tool_security.py`](../../src/tool_security.py). OAuth state and token persistence are handled in [`src/mcp_oauth.py`](../../src/mcp_oauth.py).
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Credible risk requiring verification: an MCP server authority is broader than the application can infer from its tool name. This map does not establish a trust or approval model for server installation and individual tool invocation.
|
- **Confirmed risks or gaps:** Credible risk requiring verification: an MCP server authority is broader than the application can infer from its tool name. This map does not establish a trust or approval model for server installation and individual tool invocation.
|
||||||
|
|
||||||
**Required verification.** Server onboarding, credential storage, server-origin trust, OAuth callback deployment, tool disablement, and invocation audit behaviour remain unverified.
|
- **Unverified behaviour:** Server onboarding, credential storage, server-origin trust, OAuth callback deployment, tool disablement, and invocation audit behaviour remain unverified.
|
||||||
|
|
||||||
## Outbound network requests and URL validation
|
## Outbound network requests and URL validation
|
||||||
|
|
||||||
**Boundary.** Search/content fetch, research, webhooks, skill import, provider endpoints, and other HTTP clients.
|
- **Boundary:** Search/content fetch, research, webhooks, skill import, provider endpoints, and other HTTP clients.
|
||||||
|
|
||||||
**Available authority.** The application can make outbound requests from its network position.
|
- **Available authority:** The application can make outbound requests from its network position.
|
||||||
|
|
||||||
**User-controlled inputs.** Search/fetch URLs, imported skill URLs, webhook configuration, and some endpoint settings.
|
- **User-controlled inputs:** Search/fetch URLs, imported skill URLs, webhook configuration, and some endpoint settings.
|
||||||
|
|
||||||
**Current safeguards.** src/url_security.py validates untrusted public HTTP URLs and fails closed on unsuitable schemes or private addresses. services/search/content.py resolves and rejects non-public hosts, pins resolved addresses for fetches, caps bodies, and limits redirects.
|
- **Current safeguards:** [`src/url_security.py`](../../src/url_security.py) validates untrusted public HTTP URLs and fails closed on unsuitable schemes or private addresses. [`services/search/content.py`](../../services/search/content.py) resolves and rejects non-public hosts, pins resolved addresses for fetches, caps bodies, and limits redirects.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Intentional split: administrator-created model endpoints may target private providers, while untrusted URLs use public-address checks. That distinction is required for self-hosted deployments but needs explicit call-site review.
|
- **Confirmed risks or gaps:** Intentional split: administrator-created model endpoints may target private providers, while untrusted URLs use public-address checks. That distinction is required for self-hosted deployments but needs explicit call-site review.
|
||||||
|
|
||||||
**Required verification.** The URL-source classification for outbound clients and the current handling of redirects and DNS changes remain unverified.
|
- **Unverified behaviour:** The URL-source classification for outbound clients and the current handling of redirects and DNS changes remain unverified.
|
||||||
|
|
||||||
## Secrets, credentials, and vault sessions
|
## Secrets, credentials, and vault sessions
|
||||||
|
|
||||||
**Boundary.** Application-managed encrypted secrets, API keys, provider credentials, and Bitwarden/Vaultwarden CLI sessions.
|
- **Boundary:** Application-managed encrypted secrets, API keys, provider credentials, and Bitwarden/Vaultwarden CLI sessions.
|
||||||
|
|
||||||
**Available authority.** Credentials unlock remote providers and connected personal services.
|
- **Available authority:** Credentials unlock remote providers and connected personal services.
|
||||||
|
|
||||||
**User-controlled inputs.** Administrative configuration, login/unlock requests, imported settings, and agent vault tool arguments.
|
- **User-controlled inputs:** Administrative configuration, login/unlock requests, imported settings, and agent vault tool arguments.
|
||||||
|
|
||||||
**Current safeguards.** src/secret_storage.py uses a locally stored Fernet key with restrictive permissions for supported database secrets. Vault routes require an administrator, avoid passing master passwords in command arguments, and set restrictive permissions on the vault-session file.
|
- **Current safeguards:** [`src/secret_storage.py`](../../src/secret_storage.py) uses a locally stored Fernet key with restrictive permissions for supported database secrets. Vault routes require an administrator, avoid passing master passwords in command arguments, and set restrictive permissions on the vault-session file.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Confirmed current boundary: vault session data is persisted through the vault path, not through src/secret_storage.py. This is an unresolved question about current security semantics, not a confirmed exposure.
|
- **Confirmed risks or gaps:** Confirmed current boundary: vault session data is persisted through the vault path, not through [`src/secret_storage.py`](../../src/secret_storage.py). This is an unresolved question about current security semantics, not a confirmed exposure.
|
||||||
|
|
||||||
**Required verification.** Current encryption-at-rest, owner scope, rotation, lock/logout, backup/restore, and log/tool-result exposure behaviour remains unverified.
|
- **Unverified behaviour:** Current encryption-at-rest, owner scope, rotation, lock/logout, backup/restore, and log/tool-result exposure behaviour remains unverified.
|
||||||
|
|
||||||
## Authentication and privileged administration
|
## Authentication and privileged administration
|
||||||
|
|
||||||
**Boundary.** Session authentication, API tokens, privileged routes, and internal tool loopback.
|
- **Boundary:** Session authentication, API tokens, privileged routes, and internal tool loopback.
|
||||||
|
|
||||||
**Available authority.** Administrative identity can access execution, settings, integrations, data deletion, and secrets.
|
- **Available authority:** Administrative identity can access execution, settings, integrations, data deletion, and secrets.
|
||||||
|
|
||||||
**User-controlled inputs.** Login/signup data, session cookies, API tokens, authentication configuration, and requests to privileged routes.
|
- **User-controlled inputs:** Login/signup data, session cookies, API tokens, authentication configuration, and requests to privileged routes.
|
||||||
|
|
||||||
**Current safeguards.** core/auth.py, core/middleware.py, and route-level checks establish identity and administrator gates. app.py warns when localhost bypass is configured; SECURITY.md documents deployment requirements.
|
- **Current safeguards:** [`core/auth.py`](../../core/auth.py), [`core/middleware.py`](../../core/middleware.py), and route-level checks establish identity and administrator gates. [`app.py`](../../app.py) warns when localhost bypass is configured; [`SECURITY.md`](../../SECURITY.md) documents deployment requirements.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Intentional authority with safeguards. Security depends on deployments keeping authentication enabled and internal services private; this map does not audit reverse-proxy or environment configuration.
|
- **Confirmed risks or gaps:** Intentional authority with safeguards. Security depends on deployments keeping authentication enabled and internal services private; this map does not audit reverse-proxy or environment configuration.
|
||||||
|
|
||||||
**Required verification.** Setup, anonymous, non-admin, admin, token, and internal-loopback behaviour, including privileged-route gate consistency, remains unverified.
|
- **Unverified behaviour:** Setup, anonymous, non-admin, admin, token, and internal-loopback behaviour, including privileged-route gate consistency, remains unverified.
|
||||||
|
|
||||||
## Deletion, wipe, backup, and restore
|
## Deletion, wipe, backup, and restore
|
||||||
|
|
||||||
**Boundary.** Administrative wipe, cleanup, backup import/export, and the backup restore command.
|
- **Boundary:** Administrative wipe, cleanup, backup import/export, and the backup restore command.
|
||||||
|
|
||||||
**Available authority.** Delete or replace user data and credentials.
|
- **Available authority:** Delete or replace user data and credentials.
|
||||||
|
|
||||||
**User-controlled inputs.** Administrative HTTP requests, cleanup choices, backup payloads, archive paths, and restore command options.
|
- **User-controlled inputs:** Administrative HTTP requests, cleanup choices, backup payloads, archive paths, and restore command options.
|
||||||
|
|
||||||
**Current safeguards.** Administrative wipe routes use the administrative boundary. Cleanup exposes a preview route before mutation. The documented backup tool requires explicit restore confirmation, stages the old data directory, and validates archive members before extraction.
|
- **Current safeguards:** Administrative wipe routes use the administrative boundary. Cleanup exposes a preview route before mutation. The documented backup tool requires explicit restore confirmation, stages the old data directory, and validates archive members before extraction.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Intentional destructive authority. Backup archives contain secrets by design, as documented in docs/backup-restore.md; this is an operator confidentiality responsibility, not a code defect established here.
|
- **Confirmed risks or gaps:** Intentional destructive authority. Backup archives contain secrets by design, as documented in [`docs/backup-restore.md`](../../docs/backup-restore.md); this is an operator confidentiality responsibility, not a code defect established here.
|
||||||
|
|
||||||
**Required verification.** Role-gate, confirmation, archive-rejection, staged-recovery, and owner-isolation behaviour remains unverified. No destructive runtime test was performed.
|
- **Unverified behaviour:** Role-gate, confirmation, archive-rejection, staged-recovery, and owner-isolation behaviour remains unverified. No destructive runtime test was performed.
|
||||||
|
|
||||||
## Background jobs and unattended task execution
|
## Background jobs and unattended task execution
|
||||||
|
|
||||||
**Boundary.** Scheduled tasks, background-job monitor, startup tasks, and notification/delivery work that continue without an active browser request.
|
- **Boundary:** Scheduled tasks, background-job monitor, startup tasks, and notification/delivery work that continue without an active browser request.
|
||||||
|
|
||||||
**Available authority.** Scheduled agent work can obtain model access and, for eligible owners, shell and file tools; task output can interact with connected services.
|
- **Available authority:** Scheduled agent work can obtain model access and, for eligible owners, shell and file tools; task output can interact with connected services.
|
||||||
|
|
||||||
**User-controlled inputs.** Stored task prompt, schedule, model/crew selection, enabled-tool configuration, output target, and prior persisted state.
|
- **User-controlled inputs:** Stored task prompt, schedule, model/crew selection, enabled-tool configuration, output target, and prior persisted state.
|
||||||
|
|
||||||
**Current safeguards.** src/task_scheduler.py serializes execution, records task runs, associates work with an owner, and applies the agent owner-based tool gate. src/bg_jobs.py keeps bounded state and can terminate overlong subprocess jobs.
|
- **Current safeguards:** [`src/task_scheduler.py`](../../src/task_scheduler.py) serializes execution, records task runs, associates work with an owner, and applies the agent owner-based tool gate. [`src/bg_jobs.py`](../../src/bg_jobs.py) keeps bounded state and can terminate overlong subprocess jobs.
|
||||||
|
|
||||||
**Confirmed risks or gaps.** Credible risk requiring verification: authority is inherited and exercised later, so changes to roles, task configuration, and disabled tools must be checked at execution time rather than assumed from task creation.
|
- **Confirmed risks or gaps:** Credible risk requiring verification: authority is inherited and exercised later, so changes to roles, task configuration, and disabled tools must be checked at execution time rather than assumed from task creation.
|
||||||
|
|
||||||
**Required verification.** Creation, editing, role-change, scheduling, cancellation, restart-recovery, and execution behaviour remains unverified, including whether current policy is re-evaluated before privileged action.
|
- **Unverified behaviour:** Creation, editing, role-change, scheduling, cancellation, restart-recovery, and execution behaviour remains unverified, including whether current policy is re-evaluated before privileged action.
|
||||||
|
|||||||
@@ -1,123 +1,139 @@
|
|||||||
# Current system map
|
# Current system map
|
||||||
|
|
||||||
This document describes the checked-in code at the same commit as this document. It is a subsystem map, not an exhaustive feature catalog or runtime certification. Each section records only current implementation, canonical locations, confirmed current problems, and unresolved factual questions.
|
> [!NOTE]
|
||||||
|
> This map describes the checked-in code at the same commit as this document. It is a subsystem map, not an exhaustive feature catalog or runtime certification. Each section records only current implementation, canonical locations, confirmed current problems, and unresolved factual questions.
|
||||||
|
|
||||||
|
## Navigate the system
|
||||||
|
|
||||||
|
- [Startup and application composition](#startup-and-application-composition)
|
||||||
|
- [Frontend shell and browser interaction](#frontend-shell-and-browser-interaction)
|
||||||
|
- [Chat, sessions, and streaming](#chat-sessions-and-streaming)
|
||||||
|
- [Agents, tools, and execution](#agents-tools-and-execution)
|
||||||
|
- [Models, providers, and local serving](#models-providers-and-local-serving)
|
||||||
|
- [Search and research](#search-and-research)
|
||||||
|
- [Documents, retrieval, and personal knowledge](#documents-retrieval-and-personal-knowledge)
|
||||||
|
- [Memory and skills](#memory-and-skills)
|
||||||
|
- [Email, calendar, contacts, notes, and tasks](#email-calendar-contacts-notes-and-tasks)
|
||||||
|
- [Media, speech, and image work](#media-speech-and-image-work)
|
||||||
|
- [Authentication, secrets, and privileged administration](#authentication-secrets-and-privileged-administration)
|
||||||
|
- [Persistence, background work, and operations](#persistence-background-work-and-operations)
|
||||||
|
|
||||||
## Startup and application composition
|
## Startup and application composition
|
||||||
|
|
||||||
**Current implementation.** app.py creates the application, mounts static assets, constructs shared services, registers route factories, and owns lifespan startup and shutdown. src/app_initializer.py prepares application state; core/ provides persistence, authentication, middleware, sessions, and platform helpers.
|
- **How it works:** [`app.py`](../../app.py) creates the application, mounts static assets, constructs shared services, registers route factories, and owns lifespan startup and shutdown. [`src/app_initializer.py`](../../src/app_initializer.py) prepares application state; [`core/`](../../core/) provides persistence, authentication, middleware, sessions, and platform helpers.
|
||||||
|
|
||||||
**Canonical code locations.** app.py; src/app_initializer.py; core/database.py; core/auth.py; core/middleware.py; routes/.
|
- **Canonical code:** [`app.py`](../../app.py); [`src/app_initializer.py`](../../src/app_initializer.py); [`core/database.py`](../../core/database.py); [`core/auth.py`](../../core/auth.py); [`core/middleware.py`](../../core/middleware.py); [`routes/`](../../routes/).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** Which component currently owns startup and shutdown for each long-lived service?
|
- **Open question:** Which component currently owns startup and shutdown for each long-lived service?
|
||||||
|
|
||||||
## Frontend shell and browser interaction
|
## Frontend shell and browser interaction
|
||||||
|
|
||||||
**Current implementation.** static/index.html is served by the root and SPA deep-link routes in app.py; static/app.js, static/style.css, and static/js/ implement the client surface.
|
- **How it works:** [`static/index.html`](../../static/index.html) is served by the root and SPA deep-link routes in [`app.py`](../../app.py); [`static/app.js`](../../static/app.js), [`static/style.css`](../../static/style.css), and [`static/js/`](../../static/js/) implement the client surface.
|
||||||
|
|
||||||
**Canonical code locations.** static/index.html; static/app.js; static/js/; static/style.css; app.py deep-link handlers.
|
- **Canonical code:** [`static/index.html`](../../static/index.html); [`static/app.js`](../../static/app.js); [`static/js/`](../../static/js/); [`static/style.css`](../../static/style.css); [`app.py`](../../app.py) deep-link handlers.
|
||||||
|
|
||||||
**Confirmed problems.** The /backgrounds route calls serve_html_with_nonce for static/backgrounds.html, but that file is absent from static/. This is a confirmed broken prototype route, not evidence about the rest of the frontend.
|
- **Known problems:** The `/backgrounds` route in [`app.py`](../../app.py) calls `serve_html_with_nonce` for `static/backgrounds.html`, but that file is absent from [`static/`](../../static/). This is a confirmed broken prototype route, not evidence about the rest of the frontend.
|
||||||
|
|
||||||
**Open questions.** Is /backgrounds currently an intentionally supported route or an obsolete prototype?
|
- **Open question:** Is `/backgrounds` currently an intentionally supported route or an obsolete prototype?
|
||||||
|
|
||||||
## Chat, sessions, and streaming
|
## Chat, sessions, and streaming
|
||||||
|
|
||||||
**Current implementation.** routes/chat_routes.py and routes/chat_helpers.py coordinate requests, session state, and SSE delivery. src/chat_handler.py, src/chat_processor.py, src/llm_core.py, and src/session_actions.py provide message preparation, provider interaction, and session operations.
|
- **How it works:** [`routes/chat_routes.py`](../../routes/chat_routes.py) and [`routes/chat_helpers.py`](../../routes/chat_helpers.py) coordinate requests, session state, and SSE delivery. [`src/chat_handler.py`](../../src/chat_handler.py), [`src/chat_processor.py`](../../src/chat_processor.py), [`src/llm_core.py`](../../src/llm_core.py), and [`src/session_actions.py`](../../src/session_actions.py) provide message preparation, provider interaction, and session operations.
|
||||||
|
|
||||||
**Canonical code locations.** routes/chat_routes.py; routes/chat_helpers.py; routes/session_routes.py; src/chat_handler.py; src/chat_processor.py; src/llm_core.py; core/session_manager.py.
|
- **Canonical code:** [`routes/chat_routes.py`](../../routes/chat_routes.py); [`routes/chat_helpers.py`](../../routes/chat_helpers.py); [`routes/session_routes.py`](../../routes/session_routes.py); [`src/chat_handler.py`](../../src/chat_handler.py); [`src/chat_processor.py`](../../src/chat_processor.py); [`src/llm_core.py`](../../src/llm_core.py); [`core/session_manager.py`](../../core/session_manager.py).
|
||||||
|
|
||||||
**Confirmed problems.** src/agent_loop.py annotates _resolved_tool_event_name with Any but imports no Any and does not enable postponed annotation evaluation. Python evaluates that annotation while importing the module, so this is an import-time defect at the checked baseline.
|
- **Known problems:** [`src/agent_loop.py`](../../src/agent_loop.py) annotates `_resolved_tool_event_name` with `Any` but imports no `Any` and does not enable postponed annotation evaluation. Python evaluates that annotation while importing the module, so this is an import-time defect at the checked baseline.
|
||||||
|
|
||||||
**Open questions.** No end-to-end provider or browser streaming run was performed for this map.
|
- **Open question:** No end-to-end provider or browser streaming run was performed for this map.
|
||||||
|
|
||||||
## Agents, tools, and execution
|
## Agents, tools, and execution
|
||||||
|
|
||||||
**Current implementation.** src/agent_loop.py drives multi-round tool use. src/tool_execution.py dispatches calls and binds workspace context. src/agent_tools/ contains individual implementations; src/tool_security.py and src/tool_policy.py apply role and request policies. Long-running command work is represented by src/bg_jobs.py.
|
- **How it works:** [`src/agent_loop.py`](../../src/agent_loop.py) drives multi-round tool use. [`src/tool_execution.py`](../../src/tool_execution.py) dispatches calls and binds workspace context. [`src/agent_tools/`](../../src/agent_tools/) contains individual implementations; [`src/tool_security.py`](../../src/tool_security.py) and [`src/tool_policy.py`](../../src/tool_policy.py) apply role and request policies. Long-running command work is represented by [`src/bg_jobs.py`](../../src/bg_jobs.py).
|
||||||
|
|
||||||
**Canonical code locations.** src/agent_loop.py; src/tool_execution.py; src/agent_tools/; src/tool_security.py; src/tool_policy.py; src/tool_schemas.py; src/bg_jobs.py.
|
- **Canonical code:** [`src/agent_loop.py`](../../src/agent_loop.py); [`src/tool_execution.py`](../../src/tool_execution.py); [`src/agent_tools/`](../../src/agent_tools/); [`src/tool_security.py`](../../src/tool_security.py); [`src/tool_policy.py`](../../src/tool_policy.py); [`src/tool_schemas.py`](../../src/tool_schemas.py); [`src/bg_jobs.py`](../../src/bg_jobs.py).
|
||||||
|
|
||||||
**Confirmed problems.** The import-time annotation defect above blocks the main agent/tool path. The shell is intentionally not a filesystem or network sandbox; that is an authority boundary, not by itself a vulnerability claim.
|
- **Known problems:** The import-time annotation defect above blocks the main agent/tool path. The shell is intentionally not a filesystem or network sandbox; that is an authority boundary, not by itself a vulnerability claim.
|
||||||
|
|
||||||
**Open questions.** Which native, legacy, and MCP-qualified invocation paths reach each policy gate?
|
- **Open question:** Which native, legacy, and MCP-qualified invocation paths reach each policy gate?
|
||||||
|
|
||||||
## Models, providers, and local serving
|
## Models, providers, and local serving
|
||||||
|
|
||||||
**Current implementation.** Model routes delegate to discovery, capabilities, endpoint resolution, and LLM core modules. Cookbook routes and hardware-fit services handle model lifecycle and local-serving support.
|
- **How it works:** Model routes delegate to discovery, capabilities, endpoint resolution, and LLM core modules. Cookbook routes and hardware-fit services handle model lifecycle and local-serving support.
|
||||||
|
|
||||||
**Canonical code locations.** routes/model_routes.py; src/model_discovery.py; src/model_capabilities.py; src/endpoint_resolver.py; src/llm_core.py; routes/cookbook_routes.py; src/cookbook_serve_lifecycle.py; services/hwfit/.
|
- **Canonical code:** [`routes/model_routes.py`](../../routes/model_routes.py); [`src/model_discovery.py`](../../src/model_discovery.py); [`src/model_capabilities.py`](../../src/model_capabilities.py); [`src/endpoint_resolver.py`](../../src/endpoint_resolver.py); [`src/llm_core.py`](../../src/llm_core.py); [`routes/cookbook_routes.py`](../../routes/cookbook_routes.py); [`src/cookbook_serve_lifecycle.py`](../../src/cookbook_serve_lifecycle.py); [`services/hwfit/`](../../services/hwfit/).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** Which endpoint inputs are administrator-created and permitted to use private provider addresses?
|
- **Open question:** Which endpoint inputs are administrator-created and permitted to use private provider addresses?
|
||||||
|
|
||||||
## Search and research
|
## Search and research
|
||||||
|
|
||||||
**Current implementation.** HTTP search routes use services/search/; research is exposed through routes/research/ and implemented in services/research/, src/deep_research.py, and related helpers. src/search/ remains an import-compatibility layer for callers not yet moved to services.search.
|
- **How it works:** HTTP search routes use [`services/search/`](../../services/search/); research is exposed through [`routes/research/`](../../routes/research/) and implemented in [`services/research/`](../../services/research/), [`src/deep_research.py`](../../src/deep_research.py), and related helpers. [`src/search/`](../../src/search/) remains an import-compatibility layer for callers not yet moved to `services.search`.
|
||||||
|
|
||||||
**Canonical code locations.** routes/search_routes.py; services/search/; routes/research/research_routes.py; services/research/; src/deep_research.py; src/search/.
|
- **Canonical code:** [`routes/search_routes.py`](../../routes/search_routes.py); [`services/search/`](../../services/search/); [`routes/research/research_routes.py`](../../routes/research/research_routes.py); [`services/research/`](../../services/research/); [`src/deep_research.py`](../../src/deep_research.py); [`src/search/`](../../src/search/).
|
||||||
|
|
||||||
**Confirmed problems.** The two search package paths are a confirmed compatibility arrangement, not two independent canonical implementations: several src/search modules forward to services.search. The remaining wrappers and compatibility imports can drift.
|
- **Known problems:** The two search package paths are a confirmed compatibility arrangement, not two independent canonical implementations: several [`src/search/`](../../src/search/) modules forward to [`services/search/`](../../services/search/). The remaining wrappers and compatibility imports can drift.
|
||||||
|
|
||||||
**Open questions.** No live provider request was made; provider configuration and network access remain unverified.
|
- **Open question:** No live provider request was made; provider configuration and network access remain unverified.
|
||||||
|
|
||||||
## Documents, retrieval, and personal knowledge
|
## Documents, retrieval, and personal knowledge
|
||||||
|
|
||||||
**Current implementation.** Document routes coordinate upload handling, document processing, and editor actions. Personal-document and RAG modules use Chroma and embedding clients. PDF viewing uses the optional-dependency loader in src/pdf_runtime.py; form extraction and filling live separately in src/pdf_forms.py and src/pdf_form_doc.py.
|
- **How it works:** Document routes coordinate upload handling, document processing, and editor actions. Personal-document and RAG modules use Chroma and embedding clients. PDF viewing uses the optional-dependency loader in [`src/pdf_runtime.py`](../../src/pdf_runtime.py); form extraction and filling live separately in [`src/pdf_forms.py`](../../src/pdf_forms.py) and [`src/pdf_form_doc.py`](../../src/pdf_form_doc.py).
|
||||||
|
|
||||||
**Canonical code locations.** routes/document_routes.py; src/upload_handler.py; src/document_processor.py; src/document_actions.py; src/personal_docs.py; src/rag_manager.py; src/embeddings.py; src/pdf_runtime.py; src/pdf_forms.py; src/pdf_form_doc.py.
|
- **Canonical code:** [`routes/document_routes.py`](../../routes/document_routes.py); [`src/upload_handler.py`](../../src/upload_handler.py); [`src/document_processor.py`](../../src/document_processor.py); [`src/document_actions.py`](../../src/document_actions.py); [`src/personal_docs.py`](../../src/personal_docs.py); [`src/rag_manager.py`](../../src/rag_manager.py); [`src/embeddings.py`](../../src/embeddings.py); [`src/pdf_runtime.py`](../../src/pdf_runtime.py); [`src/pdf_forms.py`](../../src/pdf_forms.py); [`src/pdf_form_doc.py`](../../src/pdf_form_doc.py).
|
||||||
|
|
||||||
**Confirmed problems.** PDF viewing/runtime loading and PDF form processing are separate implementations. That separation is confirmed and intentional in the source; it is not a defect without a reported behavioural failure.
|
- **Known problems:** PDF viewing/runtime loading and PDF form processing are separate implementations. That separation is confirmed and intentional in the source; it is not a defect without a reported behavioural failure.
|
||||||
|
|
||||||
**Open questions.** Optional PDF dependencies and representative uploaded documents were not exercised.
|
- **Open question:** Optional PDF dependencies and representative uploaded documents were not exercised.
|
||||||
|
|
||||||
## Memory and skills
|
## Memory and skills
|
||||||
|
|
||||||
**Current implementation.** Memory routes use services/memory/ and vector helpers. Skills are exposed through routes/skills_routes.py, stored and managed in services/memory/skills.py, and may be imported through services/memory/skill_importer.py.
|
- **How it works:** Memory routes use [`services/memory/`](../../services/memory/) and vector helpers. Skills are exposed through [`routes/skills_routes.py`](../../routes/skills_routes.py), stored and managed in [`services/memory/skills.py`](../../services/memory/skills.py), and may be imported through [`services/memory/skill_importer.py`](../../services/memory/skill_importer.py).
|
||||||
|
|
||||||
**Canonical code locations.** routes/memory/memory_routes.py; services/memory/; src/memory.py; src/memory_vector.py; routes/skills_routes.py; services/memory/skills.py; services/memory/skill_importer.py.
|
- **Canonical code:** [`routes/memory/memory_routes.py`](../../routes/memory/memory_routes.py); [`services/memory/`](../../services/memory/); [`src/memory.py`](../../src/memory.py); [`src/memory_vector.py`](../../src/memory_vector.py); [`routes/skills_routes.py`](../../routes/skills_routes.py); [`services/memory/skills.py`](../../services/memory/skills.py); [`services/memory/skill_importer.py`](../../services/memory/skill_importer.py).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** Which imported skill content can reach execution-capable paths, and which validation occurs before that point?
|
- **Open question:** Which imported skill content can reach execution-capable paths, and which validation occurs before that point?
|
||||||
|
|
||||||
## Personal services: email, calendar, contacts, notes, and tasks
|
## Email, calendar, contacts, notes, and tasks
|
||||||
|
|
||||||
**Current implementation.** Dedicated route modules own email, CalDAV calendar, CardDAV contacts, notes, and tasks. Supporting modules include email helpers and pollers, CalDAV sync and writeback, and the task scheduler.
|
- **How it works:** Dedicated route modules own email, CalDAV calendar, CardDAV contacts, notes, and tasks. Supporting modules include email helpers and pollers, CalDAV sync and writeback, and the task scheduler.
|
||||||
|
|
||||||
**Canonical code locations.** routes/email_routes.py; routes/calendar_routes.py; routes/contacts/contacts_routes.py; routes/note/note_routes.py; routes/task_routes.py; routes/assistant_routes.py; src/caldav_sync.py; src/caldav_writeback.py; src/task_scheduler.py.
|
- **Canonical code:** [`routes/email_routes.py`](../../routes/email_routes.py); [`routes/calendar_routes.py`](../../routes/calendar_routes.py); [`routes/contacts/contacts_routes.py`](../../routes/contacts/contacts_routes.py); [`routes/note/note_routes.py`](../../routes/note/note_routes.py); [`routes/task_routes.py`](../../routes/task_routes.py); [`routes/assistant_routes.py`](../../routes/assistant_routes.py); [`src/caldav_sync.py`](../../src/caldav_sync.py); [`src/caldav_writeback.py`](../../src/caldav_writeback.py); [`src/task_scheduler.py`](../../src/task_scheduler.py).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** External account behaviour, writeback, and delivery require controlled credentials and are not runtime-validated here.
|
- **Open question:** External account behaviour, writeback, and delivery require controlled credentials and are not runtime-validated here.
|
||||||
|
|
||||||
## Media, speech, and image work
|
## Media, speech, and image work
|
||||||
|
|
||||||
**Current implementation.** Gallery and image routes coordinate media features. Service modules own speech and media integrations; src/generated_images.py and src/visual_report.py support artifact handling and presentation.
|
- **How it works:** Gallery and image routes coordinate media features. Service modules own speech and media integrations; [`src/generated_images.py`](../../src/generated_images.py) and [`src/visual_report.py`](../../src/visual_report.py) support artifact handling and presentation.
|
||||||
|
|
||||||
**Canonical code locations.** routes/gallery/gallery_routes.py; routes/stt_routes.py; routes/tts_routes.py; src/generated_images.py; services/stt/; services/tts/; services/faces/; src/visual_report.py.
|
- **Canonical code:** [`routes/gallery/gallery_routes.py`](../../routes/gallery/gallery_routes.py); [`routes/stt_routes.py`](../../routes/stt_routes.py); [`routes/tts_routes.py`](../../routes/tts_routes.py); [`src/generated_images.py`](../../src/generated_images.py); [`services/stt/`](../../services/stt/); [`services/tts/`](../../services/tts/); [`services/faces/`](../../services/faces/); [`src/visual_report.py`](../../src/visual_report.py).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** Hardware- and provider-dependent media workflows were not exercised.
|
- **Open question:** Hardware- and provider-dependent media workflows were not exercised.
|
||||||
|
|
||||||
## Authentication, secrets, and privileged administration
|
## Authentication, secrets, and privileged administration
|
||||||
|
|
||||||
**Current implementation.** core/auth.py and core/middleware.py provide identity and request gates. src/secret_storage.py encrypts application-managed database secrets with a local Fernet key. Vault handling is separate: routes/vault_routes.py and src/tools/vault.py invoke the Bitwarden CLI and persist its session data in the application data area.
|
- **How it works:** [`core/auth.py`](../../core/auth.py) and [`core/middleware.py`](../../core/middleware.py) provide identity and request gates. [`src/secret_storage.py`](../../src/secret_storage.py) encrypts application-managed database secrets with a local Fernet key. Vault handling is separate: [`routes/vault_routes.py`](../../routes/vault_routes.py) and [`src/tools/vault.py`](../../src/tools/vault.py) invoke the Bitwarden CLI and persist its session data in the application data area.
|
||||||
|
|
||||||
**Canonical code locations.** core/auth.py; core/middleware.py; routes/auth_routes.py; routes/api_token_routes.py; src/secret_storage.py; routes/vault_routes.py; src/tools/vault.py; routes/admin_wipe/admin_wipe_routes.py.
|
- **Canonical code:** [`core/auth.py`](../../core/auth.py); [`core/middleware.py`](../../core/middleware.py); [`routes/auth_routes.py`](../../routes/auth_routes.py); [`routes/api_token_routes.py`](../../routes/api_token_routes.py); [`src/secret_storage.py`](../../src/secret_storage.py); [`routes/vault_routes.py`](../../routes/vault_routes.py); [`src/tools/vault.py`](../../src/tools/vault.py); [`routes/admin_wipe/admin_wipe_routes.py`](../../routes/admin_wipe/admin_wipe_routes.py).
|
||||||
|
|
||||||
**Confirmed problems.** Vault-command handling and local application secret storage are distinct paths with different storage mechanisms. This is a source-confirmed boundary, not evidence that either path is compromised.
|
- **Known problems:** Vault-command handling and local application secret storage are distinct paths with different storage mechanisms. This is a source-confirmed boundary, not evidence that either path is compromised.
|
||||||
|
|
||||||
**Open questions.** What are the current confidentiality, ownership, rotation, and backup semantics for vault session data?
|
- **Open question:** What are the current confidentiality, ownership, rotation, and backup semantics for vault session data?
|
||||||
|
|
||||||
## Persistence, background work, and operations
|
## Persistence, background work, and operations
|
||||||
|
|
||||||
**Current implementation.** SQLite models and persistence are centred in core/database.py; managers use application data paths. The scheduler and background-job monitor can continue work outside a live browser request. Operational routes cover cleanup, backup, and administrative wipe; the repository also provides a backup script and user documentation.
|
- **How it works:** SQLite models and persistence are centred in [`core/database.py`](../../core/database.py); managers use application data paths. The scheduler and background-job monitor can continue work outside a live browser request. Operational routes cover cleanup, backup, and administrative wipe; the repository also provides a backup script and user documentation.
|
||||||
|
|
||||||
**Canonical code locations.** core/database.py; src/runtime_paths.py; src/task_scheduler.py; src/bg_jobs.py; src/bg_monitor.py; routes/backup_routes.py; routes/cleanup/cleanup_routes.py; routes/admin_wipe/admin_wipe_routes.py; scripts/odysseus-backup; docs/backup-restore.md.
|
- **Canonical code:** [`core/database.py`](../../core/database.py); [`src/runtime_paths.py`](../../src/runtime_paths.py); [`src/task_scheduler.py`](../../src/task_scheduler.py); [`src/bg_jobs.py`](../../src/bg_jobs.py); [`src/bg_monitor.py`](../../src/bg_monitor.py); [`routes/backup_routes.py`](../../routes/backup_routes.py); [`routes/cleanup/cleanup_routes.py`](../../routes/cleanup/cleanup_routes.py); [`routes/admin_wipe/admin_wipe_routes.py`](../../routes/admin_wipe/admin_wipe_routes.py); [`scripts/odysseus-backup`](../../scripts/odysseus-backup); [`docs/backup-restore.md`](../../docs/backup-restore.md).
|
||||||
|
|
||||||
**Confirmed problems.** None recorded by this mapping.
|
- **Known problems:** None recorded by this mapping.
|
||||||
|
|
||||||
**Open questions.** What current behaviour applies to background execution, cancellation, retries, and authority inheritance?
|
- **Open question:** What current behaviour applies to background execution, cancellation, retries, and authority inheritance?
|
||||||
|
|||||||
Reference in New Issue
Block a user