The runtime is the product
A capable model is only one component of useful agentic software. Task state, authority, isolation, review, and recovery determine whether work can survive contact with a real team.
There is a familiar failure mode in AI-assisted engineering. A model produces a strong plan, begins a task, runs several commands, and then hits a missing credential, a flaky test, or a request that needs human approval. The session ends. Later, somebody opens a new window and starts again from a summary of what the first session thinks it did.
The model may have been capable throughout. What failed was the environment around it.
Once an AI system can change files, invoke tools, open a browser, or communicate with an external service, it is no longer only answering questions. It is participating in a process that has state, permissions, dependencies, costs, and consequences. That process needs a runtime.
Loom is an experiment in that layer. It is not a claim that a new model or editor should replace the tools engineers already use. Its premise is narrower: the working context around a task should be treated as durable infrastructure instead of scattered conversation.
A task is more than a prompt
The usual description of an agent begins with a prompt and ends with an output. That is an incomplete unit of work. In practice, a software task has at least five parts:
- An objective. What is the requested change, and what constraints come with it?
- A working state. Which repository, branch, files, environment, and external systems are involved?
- An authority boundary. What can the agent inspect, edit, execute, or request approval to do?
- A record of evidence. Which checks have run, what they showed, and what remains uncertain?
- A continuation path. If the work stops, who or what can resume it without inventing the missing context?
Chat preserves a sequence of messages. That is useful for discussion, but it is a poor source of truth for a changing system. It does not naturally answer whether a command changed the filesystem, whether an environment is still valid, whether an approval was granted for this run or a previous one, or whether a screenshot belongs to the current branch. A transcript is evidence of conversation. It is not necessarily an operational record.
The runtime has to gather the pieces that matter and make their relationship clear. A task should know the branch it owns, the revision from which it started, the commands that produced consequential effects, the state of its checks, the approvals attached to its requested actions, and the open questions that prevented completion. Without that, every handoff begins with reconstruction.
State must survive the model's attention
It is tempting to put everything important into the model context: the issue, the code snippets, prior messages, the task plan, and the current status. This can work for a short interaction. It becomes brittle as soon as work lasts longer than one uninterrupted session.
Context is expensive, partial, and transient. It changes when a model is swapped, a session is compacted, or a new contributor takes over. It should contain the information needed for reasoning now. It should not be the only place that work exists.
Durable state belongs in the system that owns the work:
- repository changes belong on a branch with a legible diff;
- task intent belongs in a short, maintained brief rather than in an early message;
- executable evidence belongs with the command, test, preview, or artifact that produced it;
- approval decisions belong to the action and scope they authorize;
- unresolved questions belong in the task record where a reviewer can find them.
This does not require preserving every intermediate thought. In fact, an indiscriminate archive makes recovery harder. The design problem is editorial: retain the state that changes the next decision, discard the noise that does not, and preserve enough provenance to tell which facts are still trustworthy.
Capability should be explicit
An agent may be able to read a repository, edit a sandboxed branch, run a test suite, ask for a preview, query a service, or propose an external action. These are not variations of the same generic "tool call." They have different blast radii and should be represented differently in the runtime.
Reading a public file is often low risk. Updating a dependency lockfile can be locally reversible. Sending a message to a customer, rotating a credential, deleting data, or changing a production configuration are not. A capable runtime makes the distinction visible before the model acts, not after an incident forces the team to reconstruct it.
The control point cannot be a sentence in the agent's instructions. Models are useful at deciding how to pursue an objective; they should not be the final authority on what they are permitted to do. Permissions, network boundaries, credentials, and approval policies need to sit outside the model context so that they remain stable when the model improves, fails, or is replaced.
This is the practical meaning of least privilege in agentic software. A more capable model should be able to reason over a task better. It should not acquire more access merely because its reasoning improved.
Isolation is not an implementation detail
Concurrent work makes implicit state dangerous. If several agents and engineers can edit the same workspace, use the same credentials, or share a long-lived environment, an apparently local task can leak into another one. The resulting failures are difficult to diagnose because the relevant change may have happened outside the task that reported the error.
An isolated execution environment gives each task a clearer boundary. The task receives the files, tools, and credentials it needs. Its work is visible on its own branch or equivalent change set. When it completes, the environment can be discarded without losing the durable artifacts. When it fails, the failure can be investigated without guessing which unrelated process modified the machine.
Isolation is not a promise of perfect safety. A poor permission model can still expose a sensitive system, and a flawed test can still certify the wrong behavior. But isolation reduces accidental coupling. It allows the runtime to answer basic questions that shared environments blur: which task changed this file, which tool call came from this session, and which environment produced this result?
Recovery is a correctness property
Long-running work is ordinary work. A task pauses because somebody needs to approve an action, a dependency registry is unavailable, the engineer who started it goes to sleep, or a new request takes precedence. A runtime that treats every interruption as a restart loses information and makes complex tasks look simpler than they are.
Recovery requires more than a retry button. Retrying an external write without knowing whether it already happened can create duplicates. Re-running a migration without its prior state can make a damaged system worse. Resuming an old task with stale permissions may overstep the authority that was originally granted.
A durable task needs to know which actions are safe to repeat, which require inspection, which approvals have expired, and which environmental assumptions should be refreshed. It should make its pause state legible: blocked on a credential, waiting for a review, awaiting a service, or finished with a change ready to inspect. That is how a later session can continue the work rather than reenact it.
Review turns activity into shared progress
The final output of an agentic task should not be an eloquent completion message. It should be a reviewable proposal. What changed? What was verified? What risk remains? Which external actions, if any, were taken? What evidence supports the claims?
This is especially important when agents work quickly. Speed can create the illusion that the only meaningful event is the finished patch. In a shared system, the path to that patch matters. Review is the moment when private activity becomes shared knowledge and when a team can decide whether the work belongs in the system it maintains.
For straightforward changes, this should be light. A small diff, a focused test, and an honest note may be sufficient. For work that touches money, user data, or a production dependency, the same runtime should make deeper inspection possible without forcing every small task through a ceremony designed for the highest-risk one.
The model is inside the product, not the whole product
The next generation of models will be better at reasoning, tool use, planning, and code generation. None of that removes the need for state management, authority boundaries, isolated execution, recovery, and review. It raises the stakes for all of them.
The useful question is therefore not which model can complete the longest autonomous run. It is whether the system around that run can preserve context, limit authority, recover from interruption, and produce work another person can understand. That runtime is where capable models become dependable software.
运行时就是产品
有能力的模型只是有用 Agent 软件的一部分。任务状态、权限、隔离、review 和恢复能力,决定工作能否经受真实团队的使用。
AI 辅助工程里有一种常见的失败模式。模型提出了不错的计划,开始执行任务,运行了几条命令,然后遇到缺少凭证、脆弱的测试,或需要人工批准的请求。Session 结束了。后来有人打开新的窗口,只能根据第一次 session 自己总结的内容重新开始。
模型可能始终都很有能力。真正失败的是它周围的环境。
当 AI 系统能够修改文件、调用工具、打开浏览器或与外部服务通信时,它就不再只是回答问题,而是在参与一个拥有状态、权限、依赖、成本和后果的过程。这个过程需要运行时。
Loom 是对这一层的一个实验。它并不是要用新的模型或编辑器替代工程师已经使用的工具。它的假设更窄:任务周围的工作上下文应该被当作持久基础设施,而不是散落在对话中。
任务不只是一个 Prompt
通常对 Agent 的描述从 Prompt 开始,以输出结束。这不是完整的工作单元。实际的软件任务至少包含五部分:
- 目标。 需要完成什么变化,附带哪些约束?
- 工作状态。 涉及哪个仓库、分支、文件、环境和外部系统?
- 权限边界。 Agent 可以检查、编辑、执行什么,或请求批准什么?
- 证据记录。 哪些检查已经运行、显示了什么、还剩下什么不确定性?
- 继续路径。 如果工作停止,谁或什么可以在不编造缺失上下文的情况下恢复它?
Chat 会保存消息序列,这对讨论有用,但它不是变化系统的可靠事实来源。它不会自然地说明某条命令是否改变了文件系统、环境是否仍然有效、某次审批属于当前运行还是之前的运行,也不会说明截图是否对应当前分支。Transcript 是对话的证据,却不一定是运行记录。
运行时需要收集真正重要的部分,并说明它们之间的关系。任务应该知道自己拥有哪个分支、从哪个 revision 开始、哪些命令产生了有后果的影响、检查处于什么状态、哪些审批附着在请求动作上,以及哪些开放问题阻止了完成。否则,每次交接都要从头重构。
状态必须独立于模型的注意力
把所有重要内容放进模型上下文很诱人:Issue、代码片段、历史消息、任务计划和当前状态。短交互可以这样工作,但当任务超过一个连续 session,就会变得脆弱。
上下文昂贵、有限且短暂。模型切换、session 被压缩或新的贡献者接手时,上下文都会变化。它应该包含当前推理所需的信息,却不应该成为工作存在的唯一位置。
持久状态应该属于拥有工作的系统:
- 仓库变更属于一个有清晰 diff 的分支;
- 任务意图属于一份简短且持续维护的 Brief,而不是早期消息;
- 可执行证据应该和产生它的命令、测试、预览或产物放在一起;
- 审批决定应该附着在它授权的动作与范围上;
- 未解决问题应该位于 reviewer 能找到的任务记录中。
这不要求保存每一个中间想法。相反,不加选择的归档会让恢复更困难。设计问题是编辑性的:保留会改变下一次决定的状态,丢弃无关噪声,同时保留足够的来源,让人知道哪些事实仍然可信。
能力应该被明确表达
Agent 可能能够读取仓库、编辑沙箱分支、运行测试套件、请求预览、查询服务或提出外部动作。这些不应该都被表示成一个通用的“工具调用”,因为它们的影响范围不同,也应该在运行时中被区别对待。
读取公开文件通常风险较低。更新依赖锁文件通常可以在本地撤回。向客户发送消息、轮换凭证、删除数据或修改生产配置则不同。能力强的运行时应该在模型行动前就让这种区别可见,而不是等事故发生后再重构。
控制点不能是一句写在 Agent 指令里的话。模型擅长决定如何追求目标,但不应该成为最终权限来源。权限、网络边界、凭证和审批策略需要位于模型上下文之外,这样模型变强、失败或被替换时,它们仍然稳定。
这就是 Agent 软件里的最小权限:更强的模型应该更好地推理任务,却不应仅仅因为推理能力提升就获得更多访问权。
隔离不是实现细节
并行工作会让隐式状态变得危险。如果多个 Agent 和工程师编辑同一工作区、使用相同凭证或共享长期环境,看似局部的任务可能泄漏到另一个任务中。由于相关变更发生在报告错误的任务之外,问题也会难以诊断。
隔离的执行环境为每个任务提供更清晰的边界。任务获得它需要的文件、工具和凭证;工作出现在自己的分支或等价的变更集合中;完成后环境可以被丢弃,而持久产物仍然保留;失败时也可以调查,而不必猜哪一个无关进程修改了机器。
隔离不是完美安全的承诺。糟糕的权限模型仍然可能暴露敏感系统,有缺陷的测试仍然可能认证错误行为。但隔离会减少意外耦合,让运行时能够回答共享环境容易混淆的基本问题:是谁修改了这个文件,哪次工具调用来自这个 session,哪个环境产生了这个结果?
恢复是一种正确性属性
长时间运行的工作就是普通工作。任务可能因为有人需要批准、依赖仓库不可用、启动者去休息,或新的请求获得优先级而暂停。把每次中断都当成重启的运行时,会丢失信息,并把复杂任务伪装得比实际简单。
恢复不只是一个 Retry 按钮。不了解外部写操作是否已经发生就再次执行,可能制造重复;没有上一次状态就重新运行迁移,可能让受损系统更糟;用过期权限恢复旧任务,可能超出原本被授予的范围。
持久任务需要知道哪些动作可以安全重复、哪些需要检查、哪些审批已经过期,以及哪些环境假设需要刷新。它还应该让暂停状态可见:被凭证阻塞、等待 review、等待服务,或已经完成并有变更可供检查。这样下一次 session 才是在继续工作,而不是重新演绎工作。
Review 把活动变成共享进展
Agent 任务的最终输出不应该是一段流畅的完成消息,而应该是一份可审查的提案。变更是什么?验证了什么?还剩什么风险?有没有外部动作?哪些证据支持这些结论?
当 Agent 工作很快时,这一点尤其重要。速度可能造成一种错觉,好像唯一重要的事件是最终补丁。但在共享系统里,通往补丁的路径很重要。Review 是私人活动变成共享知识的时刻,也是团队决定这项工作是否属于它所维护的系统的时刻。
对简单变更,路径应该很轻:小 diff、聚焦测试和诚实说明可能已经足够。对触及金钱、用户数据或生产依赖的工作,同一个运行时也应该支持更深入的检查,而不是让所有小任务都通过为最高风险任务设计的仪式。
模型在产品之中,但不是全部产品
下一代模型会更擅长推理、工具使用、规划和代码生成。这些进步不会消除状态管理、权限边界、隔离执行、恢复和 review 的需求,反而会提高它们的重要性。
所以,有用的问题不是哪个模型能完成最长的自治运行,而是围绕这次运行的系统能否保留上下文、限制权限、从中断中恢复,并产出另一个人可以理解的工作。这个运行时,才是有能力的模型变成可靠软件的地方。