Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
c887250
Rename Map annotation to MapTo
medz Jan 4, 2026
f34ad81
Implement basic analysis server plugin structure
medz Jan 4, 2026
e2014ae
Add ORM playground with SQLite configuration
medz Jan 4, 2026
634eecf
Add ORM analyzer plugin with config validation and fix
medz Jan 4, 2026
714d07b
Rename fix and improve config detection
medz Jan 4, 2026
d231b02
Add analyzer tests and refactor config fixes
medz Jan 4, 2026
89f1e84
Update config provider syntax to use named parameter
medz Jan 4, 2026
d82590f
Refactor config fix utilities into a mixin
medz Jan 4, 2026
1834bda
Refactor analyzer config utilities into shared modules
medz Jan 4, 2026
212a1f4
Remove analyzer constants and inline config-related strings
medz Jan 4, 2026
95982e5
Remove unused import and add config file in test setup
medz Jan 4, 2026
5e682af
Remove config replace fix and improve diagnostic node selection
medz Jan 4, 2026
6f544ce
Update test methods to return Future<void>
medz Jan 4, 2026
d02e476
Change `references` and `fields` from Iterable to Set
medz Jan 4, 2026
9ff4603
Change Relation annotation fields and references parameters
medz Jan 4, 2026
7236355
feat(runtime): add contract-first client runtime baseline
medz Mar 5, 2026
a720d34
docs(workflow): define multi-agent roles for orm delivery
medz Mar 5, 2026
d3c902a
feat(repository): add include orchestration and relation query state
medz Mar 5, 2026
8c20e1e
feat(target): add adapter-driver spi and engine bridge
medz Mar 5, 2026
2b2f944
feat(repository): add explicit nested create orchestration
medz Mar 5, 2026
4503dbc
feat(client): add upsert and batch helper query operations
medz Mar 5, 2026
ba19bd8
feat(repository): add capability-driven mutation returning fallback
medz Mar 5, 2026
762da4f
feat(sql-runtime): add sql-family lowering and decode adapter
medz Mar 5, 2026
032e2ee
feat(runtime): enforce target storage and profile hash plan checks
medz Mar 5, 2026
051c818
feat(client): add stream-first query apis for delegate and query state
medz Mar 5, 2026
6e6fab4
test(repository): add connection and transaction regression coverage
medz Mar 5, 2026
7cca8fb
feat(sql): add marker reader for runtime verification
medz Mar 5, 2026
f5787a8
feat(target): add optional connection and transaction driver SPI
medz Mar 5, 2026
e14310a
feat(sql): add mutation returning lowering strategy
medz Mar 5, 2026
4b26f92
test(client): add single-query include regression cases
medz Mar 5, 2026
77fe341
feat(client): implement singleQuery include merge path
medz Mar 5, 2026
0276ae1
feat(sql): add model field codec pipeline
medz Mar 5, 2026
08783d6
test(sql): add codec coverage for adapter encode and decode
medz Mar 5, 2026
0b3ce06
feat(client): add updateNested with explicit transaction
medz Mar 5, 2026
c616c00
feat(sql): add runtime verify helper options
medz Mar 5, 2026
4838aad
test(client): add updateNested regression coverage
medz Mar 5, 2026
f2af1cd
feat(generator): add typed client template writer
medz Mar 5, 2026
60038e9
test(generator): cover generate command core behavior
medz Mar 5, 2026
9e4ab61
feat(generator): add generate command and typed client emitter
medz Mar 5, 2026
fef02c0
fix(generator): route generate through typed writer output
medz Mar 5, 2026
ecb0086
feat(generator): add typed query dsl for select include and orderBy
medz Mar 5, 2026
2a24f05
feat(generator): add typed where filter inputs
medz Mar 5, 2026
db5b3a9
feat(generator): add typed whereUnique inputs for unique operations
medz Mar 5, 2026
b1bdf77
feat(generator): add immutable query builder dsl
medz Mar 5, 2026
57689ca
feat(runtime): support rich where operators across generator and sql
medz Mar 5, 2026
af97a1e
feat(runtime): add string pattern where operators
medz Mar 5, 2026
2abeb72
feat(runtime): support logical where composition
medz Mar 5, 2026
96fa5ed
feat(generator): add to-many relation where filter DSL
medz Mar 5, 2026
e3c8da0
feat(runtime): support to-many relation where operators
medz Mar 5, 2026
706e4b5
fix(runtime): complete relation where rewrite implementation
medz Mar 5, 2026
e300b36
feat(generator): add to-one relation where filter DSL
medz Mar 5, 2026
9a9337e
feat(runtime): support to-one relation where operators
medz Mar 5, 2026
c665529
feat(generator): improve to-one relation where nullability dx
medz Mar 5, 2026
a552845
feat(runtime): support relation is/isNot null semantics
medz Mar 5, 2026
8628295
feat(sql): lower relation where to exists predicates
medz Mar 5, 2026
911a092
feat(runtime): validate relation where and bypass sql client rewrite
medz Mar 5, 2026
90ea1df
feat(generator): add typed bulk mutations and generate path overrides
medz Mar 5, 2026
087cb9d
test(runtime): add regression coverage for atomic createMany and sql …
medz Mar 5, 2026
f1f03af
feat(client): add typed distinct support across query runtime and gen…
medz Mar 5, 2026
d475adf
feat(client): add aggregate and groupBy query surfaces
medz Mar 5, 2026
5b228c6
feat(client): add groupBy having and aggregate alias ordering
medz Mar 5, 2026
2125a79
fix(generator): place groupBy having in the correct signatures
medz Mar 5, 2026
f3aaeff
feat(generator): add typed groupBy having and orderBy helpers
medz Mar 5, 2026
a1a5e88
feat(generator)!: make groupBy typed-only for having and ordering
medz Mar 5, 2026
09ba145
feat(cli): add contract emit command and artifact emission
medz Mar 5, 2026
2a51648
feat(client): add db.sql builder API and generated db namespace
medz Mar 5, 2026
f3d9799
feat(generator): add typed db.sql model delegates
medz Mar 5, 2026
c02550a
feat(generator): expose raw sql api under db.sql namespace
medz Mar 5, 2026
29148cc
feat(generator)!: remove direct model getters from generated client
medz Mar 5, 2026
95f2e24
feat(generator): add sql mutation result helpers
medz Mar 5, 2026
759c3ba
feat(client): add db namespace facade for orm and sql
medz Mar 5, 2026
26a1f7b
feat(generator): add typed sql stream API
medz Mar 5, 2026
f45f8f6
feat(generator): return typed aggregate result objects
medz Mar 5, 2026
22e25a8
feat(generator)!: return typed groupBy result objects
medz Mar 5, 2026
f6bf4db
feat(generator)!: enforce typed aggregate/groupBy result surfaces
medz Mar 5, 2026
d0acee3
docs(roadmap): define dart-first orm v6 blueprint and execution plan
medz Mar 5, 2026
158d6c9
feat(generator): enrich contract artifact with provider and relation …
medz Mar 5, 2026
f43f1df
test(generator): lock contract relation override fallback semantics
medz Mar 6, 2026
43c3f9f
feat(generator)!: default query where/include to merge semantics
medz Mar 6, 2026
28834db
feat(generator)!: replace typed findMany/findFirst with all/first
medz Mar 6, 2026
8f4cda8
feat(generator)!: add fluent relation include chaining helpers
medz Mar 6, 2026
622bbdd
feat(generator): add includeWith callback entrypoints
medz Mar 6, 2026
49b4bec
feat(client)!: add includeWith and deep include merges
medz Mar 6, 2026
362f84f
feat(repository)!: align read query surface with plan-first naming
medz Mar 6, 2026
eae2915
feat(repository)!: extract include planner and structure read plans
medz Mar 6, 2026
745d96f
feat(runtime)!: collapse read plans to action plus result mode
medz Mar 6, 2026
c1a4644
feat(repository)!: reject invalid query state on mutations
medz Mar 6, 2026
55a0ec4
feat(runtime)!: structure mutation plans and fallback semantics
medz Mar 6, 2026
ef1f03e
feat(client)!: remove redundant model root aliases
medz Mar 6, 2026
57b077b
refactor(repository)!: extract mutation executor and harden transacti…
medz Mar 6, 2026
4da243f
feat(client)!: collapse public authoring to db root
medz Mar 6, 2026
fe5da2b
feat(runtime)!: reject invalid plan result mode combinations
medz Mar 6, 2026
40ea172
refactor(client)!: narrow collection and sql runtime contexts
medz Mar 6, 2026
bfb4f2f
refactor(runtime)!: split plans into read and mutation branches
medz Mar 6, 2026
12dbab2
feat(repository): add operation trace annotations to orchestration plans
medz Mar 6, 2026
0f08b9b
feat(runtime)!: promote repository trace to typed plan metadata
medz Mar 6, 2026
c19090e
feat(runtime): aggregate repository operation telemetry
medz Mar 6, 2026
b264bab
feat(client): lock api surface with stable placeholders
medz Mar 6, 2026
666b2e5
feat(generator)!: align typed api shell with runtime surface
medz Mar 6, 2026
e94c0b5
feat(runtime)!: promote cursor page and explain to plan surface
medz Mar 6, 2026
d596667
feat(runtime)!: split plan inspection from explain and execute cursor…
medz Mar 6, 2026
9f226db
feat(client)!: require orderBy before cursor windows
medz Mar 6, 2026
ce15a26
feat(repository): add structured page result envelopes
medz Mar 6, 2026
e731cb2
feat(contract)!: emit id fields and enforce stable cursor ordering
medz Mar 6, 2026
270325f
feat(generator)!: split cursor input from unique input
medz Mar 6, 2026
3a73cd7
feat(runtime): add adapter-aware explain reports
medz Mar 6, 2026
7035032
test(runtime): cover explain and pageResult telemetry boundaries
medz Mar 6, 2026
f88d5a7
test(runtime): lock adapter explain and stream boundary
medz Mar 6, 2026
2b6bdd3
refactor(runtime)!: make execution row-stream first
medz Mar 6, 2026
333508f
feat(execution)!: add native read streaming and distinct parity
medz Mar 6, 2026
9c5ae5f
feat(runtime)!: expose execution mode and completion metadata
medz Mar 6, 2026
8f4c803
feat(target)!: move explain capability to driver surfaces
medz Mar 6, 2026
ee3bc14
feat(client)!: expose explicit terminal execution contracts
medz Mar 6, 2026
fc054e3
test(target): cover scoped native stream surfaces
medz Mar 6, 2026
256747d
test(runtime): harden scoped explain guard coverage
medz Mar 6, 2026
f76438d
refactor(generator)!: compile typed queries without runtime query bridge
medz Mar 6, 2026
9230ac8
refactor(repository): extract read plan compiler
medz Mar 6, 2026
144ae25
refactor(repository): add prepared read execution pipeline
medz Mar 6, 2026
81a83f0
refactor(client): route model queries through prepared reads
medz Mar 6, 2026
0456ed2
refactor(client): collapse prepared read compiler artifacts
medz Mar 6, 2026
7c9b257
refactor(repository): move relation where rewrite out of read compiler
medz Mar 6, 2026
8944d11
refactor(client)!: add read specs and traced relation rewrites
medz Mar 6, 2026
d35f789
feat(client)!: require exact model names at orm roots
medz Mar 6, 2026
7bf49e2
test(client): lock self relation include and nested writes
medz Mar 6, 2026
2abb36f
fix(generator)!: preserve identifier casing in typed surfaces
medz Mar 6, 2026
7ff610b
refactor(generator): route typed read delegates through queries
medz Mar 6, 2026
c1ce6e2
refactor(generator): collapse typed delegates onto query paths
medz Mar 6, 2026
0984967
feat(generator): add typed mutation query terminals
medz Mar 6, 2026
ec29961
refactor(generator): build unique filters without json bridging
medz Mar 6, 2026
8eedc86
refactor(client): route dynamic delegates through query terminals
medz Mar 6, 2026
f2c1ac8
refactor(generator): shrink typed sql helper conversion layers
medz Mar 6, 2026
64bce03
feat(client): add structured aggregate and groupBy specs
medz Mar 6, 2026
fecba8a
feat(generator)!: add typed aggregate specs and trim sql mutation api
medz Mar 6, 2026
3e7794f
feat(orm)!: split groupBy onto grouped query builders
medz Mar 6, 2026
cf00b94
feat(plan)!: add structured aggregate read shapes
medz Mar 6, 2026
9a50e0a
feat(runtime)!: execute aggregate and grouped read shapes
medz Mar 6, 2026
eaec88b
feat(orm)!: narrow grouped query surface
medz Mar 6, 2026
9178086
refactor(orm)!: remove grouped convenience terminals
medz Mar 6, 2026
4477620
feat(plan)!: structure grouped having expressions
medz Mar 6, 2026
a856a4b
feat(orm)!: add builder-style grouped having
medz Mar 6, 2026
6a98758
feat(orm)!: move aggregate terminals to callback builders
medz Mar 6, 2026
b88a9d8
feat(orm)!: remove raw grouped having maps
medz Mar 6, 2026
0480864
feat(orm)!: implement count-based updateMany orchestration
medz Mar 6, 2026
b19da12
feat(orm)!: align batch count terminals and distinct windows
medz Mar 6, 2026
ae2a8a7
feat(orm)!: execute distinct windows and add batch row terminals
medz Mar 6, 2026
a14ac54
refactor(orm)!: remove grouped havingWith wrappers
medz Mar 6, 2026
c97de12
feat(orm)!: tighten grouped having contracts
medz Mar 6, 2026
7943c38
feat(orm)!: flatten aggregate result surfaces
medz Mar 6, 2026
b831818
refactor(orm)!: remove grouped configure bridge
medz Mar 6, 2026
f0f2ef9
refactor(orm)!: drop grouped aggregateWith terminals
medz Mar 6, 2026
a53c2aa
refactor(orm)!: remove grouped plan inspection terminals
medz Mar 6, 2026
b469e28
refactor(orm)!: hide typed aggregate spec terminals
medz Mar 6, 2026
c81d6a7
refactor(orm)!: remove aggregate spec bridge terminals
medz Mar 6, 2026
d57daa8
refactor(orm)!: remove grouped structured having terminals
medz Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import 'package:orm/orm.dart';
final client = PrismaClient();

main() {
final users = await client.user.findMany();
final users = await client.user.all();
}
```

Expand Down
128 changes: 128 additions & 0 deletions docs/ai-team-workflow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# AI 团队协作规范(ORM)

## 当前执行文档
- 蓝图:`docs/orm-v6-blueprint.md`
- 路线图与门禁:`docs/orm-v6-execution-plan.md`

## 1. 目标
- 以多 agents 并行协作推进 ORM 开发。
- 角色固定为:产品、测试、开发1(Core/Runtime)、开发2(Repository/Target)。
- 严格遵守 contract-first、plan 不可变、核心薄/目标层厚、显式编排原则。

## 2. 角色定义

### 产品(Product)
职责:
- 定义阶段目标、范围与非范围(Phase 1-5)。
- 输出可验证需求:contract/plan 规则、能力矩阵、错误语义、验收标准。
- 维护 DoR/DoD 与跨角色交接单。
- 决策冲突:规则缺失、实现偏差、能力限制三类问题的归因。

输入:业务场景、架构原则、历史缺陷与反馈。
输出:需求包、能力矩阵、验收清单、决策记录。

边界:
- 不直接实现 runtime/repository/target 代码。
- 不绕过架构边界要求“隐式 fallback”。

### 测试(QA/Test)
职责:
- 维护分层测试:单元、集成、契约一致性、回归。
- 校验 target/hash/profile 规则与插件流水线顺序。
- 对失败用例进行分级(P0/P1/P2/P3)并给出最小复现。
- 维护门禁:阻断项不允许合并。

输入:产品验收包、开发变更说明。
输出:测试结果单(通过项/失败项/阻断级别/复现步骤/建议修复)。

边界:
- 不修改产品边界定义。
- 不引入跨层实现逻辑,只定义验证与质量结论。

### 开发1(Core/Runtime)
职责:
- 负责 shared/core 与 runtime-core 的类型、校验、生命周期、插件编排与遥测。
- 落实 verify mode(startup/on-first-use/always)与错误封装稳定性。
- 提供 stream-first 执行接口,不引入隐藏 fallback。

负责模块:
- `shared/core`、`runtime-core`。

不负责模块:
- `repository client`、`targets`、解析器/语言层。

### 开发2(Repository/Target)
职责:
- 负责 repository collection API、include 策略、显式事务编排。
- 负责 target adapter/driver 的实现分层与能力映射。
- 落实 one logical query -> one lane statement。

负责模块:
- `repository client`、`targets`。

不负责模块:
- core 类型定义与 runtime-core 生命周期编排。

## 3. 交接协议(固定顺序)
1. 产品 -> 开发1/开发2/测试:下发需求包(含能力矩阵、错误语义、验收标准)。
2. 开发1 <-> 开发2:只通过公开类型/SPI 对接,不越层调用内部实现。
3. 开发1/开发2 -> 测试:提交变更说明(影响面、关键场景、已覆盖测试)。
4. 测试 -> 全员:回传结构化测试结论与阻断级别。
5. 产品 -> 全员:确认是否进入下一阶段或回滚到当前阶段修复。

## 4. 并行开发节奏(一个迭代)
1. 产品拆单:
- 产出一个最小闭环任务(可独立验证)。
- 任务必须满足 DoR 后进入开发。

2. 双开发并行:
- 开发1实现核心能力或边界约束。
- 开发2实现仓储/目标层能力。
- 跨层接口变更先评审,再编码。

3. 测试门禁:
- 先跑改动相关测试,再跑回归桶。
- 若出现 P0/P1 阻断,任务回到开发修复。

4. 完成判定:
- 满足 DoD,进入下一迭代。

## 5. DoR / DoD

DoR(任务可开工):
- 范围/非范围明确。
- contract/plan 校验规则明确。
- 验收标准可执行且可测。
- 角色交接对象明确。

DoD(任务完成):
- 代码、测试、文档三者闭环。
- 不违反 contract-first、plan 不可变、显式编排原则。
- 回归通过,风险与取舍已记录。

## 6. Commit 规则(阶段结果即提交)
- 有“可独立验证的最小闭环”就提交,不攒大包。
- 一次提交只做一件事:行为变更 + 对应测试(必要时含最小文档)。
- 接口变更与实现变更尽量拆开提交。
- 缺陷修复提交必须包含回归测试。
- 阻断缺陷修复优先于新功能提交。

推荐提交格式:
- `feat(scope): summary`
- `fix(scope): summary`
- `test(scope): summary`
- `docs(scope): summary`

建议 scope:
- `runtime-core`
- `shared-core`
- `repository`
- `target`
- `qa`
- `workflow`

## 7. 迭代内最小检查清单
- 产品:需求包、验收标准、能力矩阵是否齐全。
- 开发1:核心边界是否被污染、校验链是否完整。
- 开发2:是否出现隐藏 fallback、是否保持单 lane statement。
- 测试:是否覆盖正反例、是否有新增回归用例。
185 changes: 185 additions & 0 deletions docs/orm-v6-api-surface.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# ORM V6 API Surface

This document locks the intended public API surface before implementation
completeness. The rule for this phase is simple:

- surface first
- missing behavior may throw a stable placeholder error
- runtime, repository, and plan boundaries stay explicit

Placeholder methods must throw `RUNTIME.API_NOT_IMPLEMENTED`.

## Runtime Root

Single entrypoint:

```dart
final db = client.db;
```

Runtime access:

```dart
client.connect();
client.disconnect();
client.connection();
client.telemetry();
client.operationTelemetry();
client.recentOperationTelemetry();
client.withConnection(...);
client.withTransaction(...);
```

Namespaces:

```dart
db.orm.model('User');
db.sql.from('User');
db.sql.insertInto('User');
db.sql.update('User');
db.sql.deleteFrom('User');
```

## ORM Read Surface

Root:

```dart
final users = client.db.orm.model('User');
final query = users.query();
```

Read authoring:

| Method | Status |
| --- | --- |
| `query()` | implemented |
| `where(...)` | implemented |
| `whereWith(...)` | implemented |
| `orderBy(...)` | implemented |
| `orderByField(...)` | implemented |
| `distinct(...)` | implemented |
| `distinctField(...)` | implemented |
| `select(...)` | implemented |
| `selectField(...)` | implemented |
| `selectWith(...)` | implemented |
| `include(...)` | implemented |
| `includeWith(...)` | implemented |
| `includeRelation(...)` | implemented |
| `skip(...)` | implemented |
| `take(...)` | implemented |
| `unbounded()` | implemented |
| `cursor(...)` | implemented |
| `page(...)` | implemented |

Read terminals:

| Method | Status |
| --- | --- |
| `toPlan()` | implemented |
| `inspectPlan()` | implemented |
| `all()` | implemented |
| `pageResult()` | implemented |
| `stream()` | implemented |
| `firstOrNull()` | implemented |
| `oneOrNull()` | implemented |
| `count()` | implemented |
| `exists()` | implemented |
| `aggregate(...)` | implemented |
| `groupedBy(...).aggregate(...)` | implemented |
| `explain()` | implemented |

Rules:

1. `toPlan()` and `inspectPlan()` are pure authoring inspection.
2. `explain()` is runtime-facing and requires an active runtime connection.
It returns the common runtime summary and may include target-lowered request
details when the active engine exposes them. Because it does not execute the
plan, `planSummary.executionMode` is reported as `deferred`.
3. `cursor(...)` and `page(...)` require `orderBy(...)` first.
4. Boundary fields must match the declared `orderBy(...)` fields.
5. When a model declares `idFields`, `cursor(...)` and `page(...)` require
`orderBy(...)` to end with those fields.
6. `pageResult()` is the structured pagination terminal and returns
`items + pageInfo`.
7. `inspectPlan()` and `explain()` expose `terminalExecution` metadata.
This makes stream delivery explicit:
- `stream()` stays `nativeStream` only when the repository can yield rows
directly from the runtime response.
- `include(...)` forces `stream()` to `bufferedYield`, with reasons and
include strategy surfaced in `terminalExecution.stream`.
- `distinct(...)` remains `nativeStream` when execution can apply
deduplication directly.
8. Grouped aggregation is a dedicated surface:
- `groupedBy(...)` only accepts a where-only base query.
- `havingExpr(...)` is the grouped predicate entrypoint before
`aggregate(...)`.
- grouped `having` supports comparison operators only:
`equals`, `notEquals`, `gt`, `gte`, `lt`, `lte`.
- repeated `havingExpr(...)` calls compose with `AND`.
9. `include(...)` is unsupported on `aggregate(...)` and
`groupedBy(...).aggregate(...)`, including direct plan execution.

## ORM Mutation Surface

Direct mutations:

| Method | Status |
| --- | --- |
| `create(...)` | implemented |
| `createMany(...)` | implemented |
| `createNested(...)` | implemented |
| `update(...)` | implemented |
| `updateAll(...)` | implemented |
| `updateNested(...)` | implemented |
| `delete(...)` | implemented |
| `deleteAll(...)` | implemented |
| `deleteCount(...)` | implemented |
| `upsert(...)` | implemented |
| `updateCount(...)` | implemented |

Chained mutations:

```dart
users.where({...}).update(data: {...});
users.where({...}).delete();
users.where({...}).updateAll(data: {...});
users.where({...}).deleteAll();
users.where({...}).upsert(create: {...}, update: {...});
users.where({...}).updateCount(data: {...});
```

Rules:
1. `updateAll(...)` and `deleteAll(...)` are row-returning batch terminals.
2. `updateCount(...)` and `deleteCount(...)` are count terminals.
3. All four batch terminals require `where(...)` first.
4. Count terminals do not accept row-shaping state such as `select(...)` or `include(...)`.

## SQL Surface

Read:

```dart
client.db.sql.from('User').where({...}).orderBy(...).take(10).toPlan();
client.db.sql.from('User').all();
client.db.sql.from('User').firstOrNull();
client.db.sql.from('User').stream();
```

Mutation:

```dart
client.db.sql.insertInto('User').values({...}).execute();
client.db.sql.update('User').set({...}).where({...}).execute();
client.db.sql.deleteFrom('User').where({...}).execute();
```

## Phase Rules

1. New public methods must be added here first.
2. If semantics are not ready, expose the method and throw the stable
placeholder error.
3. Repository orchestrates multi-step behavior.
4. Runtime observes plans, verifies contracts, runs plugins, and records
telemetry.
5. Lanes build plans; they do not hide multi-step workflows.
Loading