Skip to main content
Internal plan, restricted to project members. Back to the internal index.
Source: re-verification of the core backlog (now the bugs and improvements pages) against main@e8d62722 plus a fresh sweep of core and the web/mcp edges (2026-10-13). The sweep was static reading only; nothing below was reproduced or run. Conf says how sure the finding is: read = the cited lines were read and show the behaviour, plausible = follows from documented framework behaviour, write the failing test first, inferred = deduced from code paths, unconfirmed. Status: B28, B31 and B34 (memory bounds) are fixed: the default execution log trims like the file log, the idempotency cache and the status history are capped. S3-S8, S10-S13, B4 and B35 are fixed by the security hardening PR (fix/security-hardening): key checks on the decoded path (400 for ;, encoded separators and dot segments), MCP uses the REST keys, a Host/Origin filter for keyless loopback servers, a protected actuator, refusal to start on a non-loopback address without a key, process execution off unless a list or yukta.process.allow-any=true is set, an expression method allow-list, a script watchdog (yukta.script.timeout-ms, default 10 s; no memory limit), ${context.x} limited to plain values outside yukta.*, an execution id check in the file log reader, 1 MiB request bodies (YUKTA_LIMITS_MAX_BODY, 413), reviewed and audited limit/priority changes, signals refused on the raw node command. F3 (hashed and rotating keys, session-limited keys that also cover execution routes, MCP roles per tool, MCP actor) and F5 (gateway tool allow-list, argument size cap and deny patterns yukta.mcp-client.*; LLM_CALL prompt and answer filters yukta.llm.*) are done, with a per-tool approval option (requireApproval) and a Control page view of who did what (GET /api/control/audit). Scripts also stop after yukta.script.max-statements; a heap limit is not available on this runtime. New IDs continue the backlog numbering (S security, B bug). The sweep’s own labels (N1-N14) are kept in brackets. IDs S5-S13 and B28-B33 were checked against core/docs and the module guides: no collisions (checked on main only, not on unmerged branches). Effort: S up to half a day, M 1-3 days, L a week or more. Sev: C/H/M/L.

Who can exploit what (read before ranking)

Decision (2026-10-13): workflow authors are trusted today and may not be later. Severities in the tables assume trusted authors, so S11/S12/S13/F5 stay where they are in the order below. They become a release gate for the day untrusted authors are allowed:
  • S4 deny-by-default for PROCESS_EXECUTOR shipped (PR-3)
  • S11 expression method allow-list, S12 script statement limit and watchdog, S13 context key allow-list
  • F5 gateway-level tool allow-list and prompt filters; F3 per-session scoping (an author must not reach another session)
  • B35 size limits and B34/B28/B31/B21 memory bounds (an author can otherwise exhaust memory)
  • Re-rate S11/S12/S13 as High and move them from P2 to P1
Until then do not expose workflow upload to anyone outside the trusted group.

Decisions needed from you (they gate effort more than code size does)

  1. S4 deny-by-default for PROCESS_EXECUTOR (done, yukta.process.allow-any=true is the migration switch): breaking for anyone relying on the empty list. Ship in which release, and with a migration switch?
  2. S6 refuse to start on a non-loopback bind with no API key: breaking for current Docker users, who bind to all addresses. Refuse, or only log a loud warning?
  3. B4 / B25 plugin-api changes (new sealed command types, an actor field on status events): public API change. Is a break acceptable now, or do they wait for the next major?
  4. B21 retention policy for session state: evict (and serve history from the log) or keep everything?
  5. S3: fix the unused file plugin-log package, or delete it?
  6. Workflow authors (decided: trusted now, untrusted possible later): the gate list above applies before that changes.
  7. Size limits (B35 in the performance plan): which maximum start payload and definition size?

P0: security exposure, small fixes

Suggested as one “edge hardening” PR (S5-S8) plus one core PR (S9, B28, R1, B31, B32). The memory bounds B28, B31, B34 and B35 are also denial-of-service fixes; their performance side is in the performance plan.

P1: control-plane integrity and correctness

P2: resource limits and design-level work

P3: enhancements (statuses re-verified against code)

Suggested order

  1. PR-1 S5 + S6 + S7 + S8: edge hardening (one theme, web and mcp).
  2. PR-2 S9 + B28 + R1 + B31 + B32 + B34 + B35: small core fixes and memory bounds.
  3. PR-3 S4 with a release note (decision 1).
  4. PR-4 S10 + B4: plugin-api command types (decision 3).
  5. PR-5 B29 + B27 guard + B33 + B26 + S3.
  6. P2 items one at a time, then P3 by product priority.
Performance work: the performance plan. Run the narrowest tests per CLAUDE.md tiers; each PR ends with spotlessApply check once.