Repository navigation
Commit 0e9e7b7
Part of #19939 — this lands the C half for every spelling CEL can write
today, and measures the B half empty. What stays open on the card:
refusing the two spellings this PR deliberately keeps (`{NOW()}` /
`{TODAY() ± N}` and `{$User.*}`), each once CEL can spell it — see
"Kept, and why" and the report's open question.
Clause-②: yes (narrowing)
## The rulings this executes (quoted, not paraphrased)
- #11182 ruling D (record `5805777944`, maintainer 「11182 D 其他同意」), item
3: "**v18 carrier.** C (refuse the template dialect at registration,
per-spelling remedies: `/ 100.0`, `has()` guards, a string form for
`NOW()` / `TODAY()`) and whatever of B is lossless ride the v18 train";
governing text: "ADR-0087 D2 (only lossless mappings ride an automatic
conversion — the 12 DIFF spellings the round measured are not
lossless)".
- The card body: "B, only where lossless. An ADR-0087 D2 conversion for
the spellings the #11182 round measured as SAME under both engines (13
of 25); the 12 DIFF spellings are ⛔ never auto-converted (a semantic
rewrite is not a conversion)." and "this repo's 21 sites migrate in the
same wave".
- Triage `6051196407`: the card is `domain:spec` whole; the
`service-automation` and `lint` files are declared cross-lane on the
claim `6052247536`. The text-slot interpolation in `builtin/template.ts`
is #22110's and is untouched (one docblock paragraph names the
value-slot retirement; no code there changed).
- Release state, re-read at push on `origin/main` `f4bed5834` (merged
into this branch): `.changeset/pre.json` is **present** (`"mode":
"pre"`, `"tag": "next"` — #22084 entered pre mode at 07:03Z today), so
per triage `6038868940` and the dispatch this is graded `major`, with a
BREAKING section and an ADR-0087 `registered` disposition. It was absent
at the claim (`959c209d5`) and at this branch's first merge of `main`
(`7d7943dd0`); the changeset moved from `minor` to `major` in the commit
after the second merge.
## What changes
A flow VALUE slot no longer reads the single-brace `{…}` template
dialect. In every value slot — `create_record.fields.*`,
`update_record.fields.*`, the `assignment` node's `assignments` map, and
the two legacy `assignment` shapes the executor still reads (the
`assignments: [{ variable, value }]` array and the bare config) — a
string, or a string at any depth of an array or object value, that
carries a `{…}` token the interpolator would resolve is refused, with
the CEL spelling of each token. A string with no token is the literal
text it spells; a computed value is a CEL value envelope.
**One judge, every door** —
`packages/spec/src/automation/flow-value-slot-template.ts`:
- `valueSlotTemplateRefusals(value)` judges one value;
`flowNodeValueTemplateRefusals(nodeType, config)` locates every refusal
in a node's config (the ledger's `value` slots through
`resolveFlowNodeValueSlots`, plus the two legacy `assignment` shapes
normalised exactly as the executor normalises them);
`VALUE_SLOT_TEMPLATE_REFUSAL` is the sentence every refusal leads with.
- The contract says it: `celValueSlotSchema` composes the judge, so
`FlowValueSlotSchema`, `AssignmentValueSchema`,
`CreateRecordConfigSchema` and `UpdateRecordConfigSchema` refuse it at
the value's path, and `AssignmentConfigSchema`'s catchall (the bare
legacy shape) does too — one new dropped-refinement site, ledgered
(`automation/AssignmentConfig` `out.catchall`, totals 678 → 679).
- **Registration** — `AutomationEngine.registerFlow`
(`validateFlowExpressions`) pushes one located failure per refused
string: `node 'w' (create_record) create_record field value at
config.fields.total: …`.
- **Build door** — `@objectstack/lint` `validateStackExpressions`
reports the same refusal as `expression-invalid` at `error` (the
existing rule family; it gates `os validate`, `os compile` and the
metadata save door). This replaces the `warning` hint ruling D point 1
put there for 17.x.
- **Run time** — the `create_record` / `update_record` executors refuse
it at their own `parseNodeConfig` (through `FlowValueSlotSchema`), and
the `assignment` executor calls `flowNodeValueTemplateRefusals` before
it assigns anything; both return a guard refusal, so a fault edge cannot
route it.
**The remedies, per spelling** (the refusal names them for the authored
token):
| you wrote | the refusal prescribes | what changes |
|:--|:--|:--|
| `'{record.owner}'`, `'{x}'` | `{ dialect: 'cel', source:
'record.owner' }` | CEL refuses an absent variable or key where the
template wrote nothing — the `has()` guard: `has(record.owner) ?
record.owner : null`, `has(vars.x) ? vars.x : null` (writes `null`) |
| `'{list.0}'` | `source: 'list[0]'` | an empty list fails the run |
| `'{$error.message}'` | `source: 'vars["$error"].message'` | a
`$`-named variable is read through `vars` |
| `'{round(x * 100) / 100}'` | `source: 'round(x * 100) / 100.0'` | `/
100.0`: CEL divides two integers as integers (`123.46` becomes `123`) —
every integer divisor is rewritten in the prescription |
| `'Renewal — {contract.number}'` | `source: "'Renewal — ' +
contract.number"` | wrap a non-string hole in `string(…)`, one that may
be null in `coalesce(…, '')` |
| `'{"a": 1}'` (braces meant literally) | `source: "'{\"a\": 1}'"` | a
CEL string literal |
## B — measured empty: no spelling is lossless (ADR-0087 D2)
Re-measured on this branch, not copied: every spelling was evaluated
through the shipped interpolator (`interpolateString`) and through the
shipped CEL value path (`AutomationEngine.evaluateValueEnvelope`, the
real `celScope`) over the same variables. The 25-row grid reproduces the
#11182 round exactly — **13 SAME / 12 DIFF**:
| # | spelling and input | template | CEL | verdict |
|:--|:--|:--|:--|:--|
| S1–S4 | `{name}`, `{amount}`, `{oppRecord.name}`, `{oppRecord.amount}`
— key present | the value | the value | SAME |
| S5 | `{userList.0}` → `userList[0]`, list non-empty | `"u1"` | `"u1"`
| SAME |
| S6 | `{$error.message}` → `vars["$error"].message`, present | `"boom"`
| `"boom"` | SAME |
| S7, S8 | `Hello {o.name}`, `Total: {amount}` → concatenation, holes
present | the text | the text | SAME |
| S9 | `{o.owner}`, key present with `null` | `null` | `null` | SAME |
| S10 | token-free `converted` → `'converted'` | the text | the text |
SAME |
| S11 | `{round(… / 100 * 100) / 100}`, integer-valued amount | `54000`
| `54000` | SAME |
| S12, S13 | `{rows}` (a list), `{flag}` (a boolean) | the value | the
value | SAME |
| D1, D2 | the money spelling, `amount` `1234.56` | `123.46`, `1111.1` |
`123`, `1111` | DIFF |
| D3 | `{10 / 4}` | `2.5` | `2` | DIFF |
| D4, D5 | `{NOW()}` → `now()`, `{TODAY()}` → `today()` | ISO text | a
`Date` (Timestamp) | DIFF |
| D6 | `string(now())` | ISO text | refused: no `string(Timestamp)`
overload | DIFF |
| D7 | `{missing}` — variable absent | `undefined` | fault: unknown
variable | DIFF |
| D8 | `{oppRecord.owner}` — key absent | `undefined` | fault: no such
key | DIFF |
| D9 | `{userList.0}` — empty list | `undefined` | fault: index out of
bounds | DIFF |
| D10 | `Hello {o.owner}` — hole `null` | `"Hello "` | fault: no
overload for string plus null | DIFF |
| D11 | `{$User.Id}` → `current_user.id` | the run user id | fault:
unknown variable `current_user` | DIFF |
| D12 | token-free `converted` read as CEL source | the text | fault:
unknown variable | DIFF |
The "13 of 25" in the card counted **probes**, not spellings: S1–S13 are
the present-key / integer-valued scenarios of the same spellings whose
absent-key, null-hole, decimal and Timestamp scenarios are D1–D12. Read
per spelling — the unit a conversion rewrites — every authored spelling
has a DIFF input: a path faults where the template wrote nothing
(D7–D9), text with holes faults on a null hole (D10), arithmetic
truncates (D1–D3), the date macros change type (D4–D6), `$User` has no
binding (D11). Only a token with no variable in it (`{1.5}`, `{100}`)
maps losslessly, and none is authored in either repository. Controls
beyond the 25: a `has()` guard writes `null` where the template wrote
nothing (X2–X4), so it is a semantic rewrite, not a conversion. So, by
D2's letter and the card's own "a semantic rewrite is not a conversion",
**no D2 conversion is registered**; the retirement is the D3 semantic
entry `flow-value-slot-template-dialect-refused` (step 18, rationale
fragment order 88). A pin replays the whole conversion chain, retired
entries included, over every measured spelling and asserts each value
comes out as authored.
## Kept, and why — two spellings CEL cannot write yet
A refusal must name what to write instead. For two spellings there is
nothing to name, measured:
- **The date macros** — `{NOW()}`, `{TODAY()}`, `± N` days. CEL's
`now()` / `today()` / `daysFromNow()` / `addDays()` yield a Timestamp,
which reaches the data engine as a `Date` object (measured through
ObjectQL with a recording driver: `today()` into a `date` field arrives
as `Date(2026-10-08T00:00:00.000Z)` where the macro wrote
`"2026-10-08"`), and `string(today())` is refused for want of an
overload. This is the card's own contingency ("a `packages/formula`
sub-card if v18 needs it") — it does.
- **The run user** — `{$User.*}`. The flow CEL scope binds no user
(`current_user.id` faults, D11). Binding ADR-0068's canonical
`current_user` there is a contract decision this PR does not take (open
question in the report).
A string whose tokens include one of these keeps its 17.x meaning;
everything else in it would be refused if moved alone, so the whole
string is kept. Their refusal is the remaining half of #19939, after the
two prerequisites.
## This repository's sites (census at `959c209d5`)
A TypeScript-AST walk over `git ls-files` (every `create_record` /
`update_record` `fields` value and `assignment` value, all three shapes,
same-file spreads): **21 authored sites**, 20 migrated here, 1 kept.
| file:line (base) | before | after |
|:--|:--|:--|
| `examples/app-crm/src/flows/convert-lead.flow.ts:148` |
`'{account_id}'` | `source: 'account_id'` |
| `examples/app-crm/src/flows/convert-lead.flow.ts:149` |
`'{opportunity_id}'` | `source: 'opportunity_id'` |
| `examples/app-showcase/src/automation/flows/index.ts:115` |
`'{new_assignee}'` | `source: 'new_assignee'` |
| `examples/app-showcase/src/automation/flows/index.ts:1235` |
`'{$error.message}'` | `source: 'vars["$error"].message'` |
| `examples/app-showcase/src/automation/flows/index.ts:1602` |
`'{record.title}'` | `source: 'record.title'` |
| `examples/app-showcase/src/automation/flows/index.ts:1603` |
`'{record.assignee}'` | `source: 'has(record.assignee) ? record.assignee
: null'` |
| `examples/app-showcase/src/automation/flows/index.ts:1604` |
`'{record.project}'` | `source: 'has(record.project) ? record.project :
null'` |
| `examples/app-todo/src/flows/task.flow.ts:377` |
`'{completedTask.subject}'` | `source: 'completedTask.subject'` |
| `examples/app-todo/src/flows/task.flow.ts:377` |
`'{completedTask.description}'` | guarded
`has(completedTask.description) ? … : null` |
| `examples/app-todo/src/flows/task.flow.ts:378` |
`'{completedTask.priority}'` | guarded |
| `examples/app-todo/src/flows/task.flow.ts:378` |
`'{completedTask.category}'` | guarded |
| `examples/app-todo/src/flows/task.flow.ts:379` |
`'{completedTask.owner}'` | guarded |
| `examples/app-todo/src/flows/task.flow.ts:380` |
`'{completedTask.recurrence_type}'` | guarded |
| `examples/app-todo/src/flows/task.flow.ts:381` |
`'{completedTask.recurrence_interval}'` | guarded |
| `examples/app-todo/src/flows/task.flow.ts:384` | `'{nextDueDate}'` |
`source: 'nextDueDate'` |
| `examples/app-todo/src/flows/task.flow.ts:457` | `'{subject}'` |
`source: 'subject'` |
| `examples/app-todo/src/flows/task.flow.ts:457` | `'{priority}'` |
`source: 'has(vars.priority) ? vars.priority : null'` |
| `examples/app-todo/src/flows/task.flow.ts:457` | `'{dueDate}'` |
`source: 'has(vars.dueDate) ? vars.dueDate : null'` |
| `examples/app-todo/src/flows/task.flow.ts:457` | `'{category}'` |
`source: 'has(vars.category) ? vars.category : null'` |
| `examples/app-todo/src/flows/task.flow.ts:457` | `'{$User.Id}'` |
**kept** (the run user — see above) |
| `packages/verify/src/handle.fixture.ts:191` | `'{resolution}'` |
`source: 'resolution'` |
Each guard is a judgment the template made silently: a field a screen
may leave empty, or a key a row may not carry, writes `null` (on insert
a field default still applies). Docs code samples migrated too:
`content/docs/automation/flows.mdx` (the assignment and create-record
examples, an inline comment, the hot-lead example),
`content/docs/kernel/runtime-services/examples.mdx` (two fields),
`packages/services/service-automation/README.md` (one field), and the
test fixture
`packages/qa/dogfood/test/fixtures/flow-durable-suspend-fixture.ts:81`.
**hotcrm** (public, read-only clone at `c529de2`, not touched): 91
authored sites (2 of them through the same-file `MEMBERSHIP_FIELDS`
spread) — **71 refused** (31 bare references, 36 dotted paths, 4 text
with holes) and **20 kept** (15 date macros — 8 `{NOW()}`, 3
`{TODAY()}`, 3 `{TODAY() + N}`, 1 `{TODAY() + var}` — and 5
`{$User.Id}`, all `owner_id` on `create_record`); plus 5 in tests (4
refused, 1 kept). Its two money sites already use the CEL envelope with
`/ 100.0`.
## H4 — where `{var}` is still read after this change
- **In the three value slots:** the interpolator call stays
(`crud-nodes.ts` `resolveFieldValues`, `logic-nodes.ts`), reached only
by the two kept spellings; on every other literal it is the identity. It
is removed when the kept spellings are refused. Pinned: the kept
spellings resolve through the executors (`logic-nodes.test.ts`,
`crud-fields-value-envelope.test.ts`), and
`value-slot-template-grammar.test.ts` drives the interpolator over every
kept and refused spelling so the spec's copy of the token grammar cannot
drift from `resolveToken`.
- **Outside them, unchanged by this card:** text slots (#22110's:
`notify` title / message, screen text, `end` message), `filter` values
(`interpolateFilter`, the filter-placeholder hand-off),
`loop.collection` / `map.collection` (the ledger's `flow-template`
role), and the value-like positions `subflow.input`, `map.input`,
`script.inputs`, `screen.defaults`, a screen field's `defaultValue`, and
`http` (interpolated whole before its parse).
## Wrong guidance (ruling D item 2)
`builtin/template.ts` and `content/docs/automation/flows.mdx` already
carried `/ 100.0` on `main` (#20205). This PR removes the last `round(x
* 100) / 100` claim in its surface: the comment in
`flow-field-expression-scale.integration.test.ts` that called it "the
CEL-identical authoring pattern" (the oracle now runs as a CEL envelope
with `/ 100.0`, and the docblock states integer division).
`skills/objectstack-automation/SKILL.md:232` still reads `{round(x *
100) / 100}` and teaches `{token}` in `fields`; it is Tier H and not in
this PR.
## BREAKING
An accept-set narrowing on a published authoring surface (`Clause-②: yes
(narrowing)`, copied from the claim), graded `major` on the v18 `next`
pre line; the changeset carries the BREAKING banner, the FROM → TO table
above and the ADR-0087 disposition `registered
flow-value-slot-template-dialect-refused`. A stored flow carrying a
refused value is refused at registration (skipped at boot with a warn
naming it); `os validate` names each one with its CEL spelling.
## Tests and gates
This PR opens at `b073d92de`. The package suites, typechecks and
consumer runs below were read at `31c52e59c` (or the commit named); the
second merge of `main` after it changed nothing under
`packages/spec/src/automation`, `packages/lint`,
`packages/services/service-automation`, `packages/triggers`,
`packages/qa`, `packages/verify` or `examples` (in `packages/cli`, only
its secret-rewrap files), and the spec build, generated-artifact check,
spec migration / conversion / automation suites and every gate were
re-run at `b073d92de`. The box is shared, so durations are not quoted.
Builds, tests and typechecks ran through `scripts/pm/os-verify-lock.sh`,
each read off its `VERDICT command-exit` line.
- **Package suites** (vitest, `--maxWorkers=2`): `@objectstack/spec` 679
files, 19605 passed + 1 todo; `@objectstack/lint` 125 files, 5730
passed; `@objectstack/service-automation` 176 files, 2157 passed.
- **Typecheck** (`pnpm --filter … run typecheck`, exit 0 each): spec,
lint, service-automation, trigger-record-change, dogfood, cli,
example-todo, example-showcase, example-crm, verify.
- **Consumers** (after a full `turbo run build --concurrency=2`, exit
0): `trigger-record-change` 11 files / 114; `trigger-schedule` 8 / 174;
`plugin-approvals` 61 / 899; `verify` 18 / 133; `example-todo` 7 / 238
(at `0d7eb274c`); `example-showcase` 33 / 408; `example-crm` 5 / 45;
`mcp` 7 / 74, `metadata-protocol` 6 / 127 and `runtime` 20 / 548 — each
the files of that package that author these node types or load an
example (a narrowing, declared: the rest of those suites is CI's); `cli`
unit 2 / 14 and integration 2 / 14 (the integration project run because
this diff edits `package-install-local-boot-steps.integration.test.ts`;
four more cli files I named are integration-tier and declared to CI);
`dogfood` 3 / 25 (`flow-trigger-record-credential-mask`,
`flow-durable-suspend`, `expression-conformance`).
- **The new pins**:
`packages/spec/src/automation/flow-value-slot-template.test.ts` (every
refused class with its remedy, the kept spellings, the controls, every
value-slot contract, every value position of a node, and the
no-conversion replay);
`packages/lint/src/validate-expressions.fields-value-slot.test.ts` (the
build door: `expression-invalid` at `error`, located, in all three value
slots and both legacy shapes; kept spellings and `filter` clean);
`packages/services/service-automation/src/builtin/crud-fields-value-envelope.test.ts`,
`logic-nodes.test.ts` and `assignment-value-envelope.test.ts`
(registration and the run-time twin, nothing written, kept spellings
resolve); `value-slot-template-grammar.test.ts` (the spec judge against
the interpolator, kept and refused spellings and the dispatch-order
edges).
- **Generated artifacts**: `pnpm --filter @objectstack/spec
check:generated` — 15 of 15 current after `--fix` regenerated
`api-surface/`, `export-origins/` and `content/docs/references/**` on
the merged tree, re-read exit 0 at `b073d92de` after `pnpm --filter
@objectstack/spec build` (exit 0); `dropped-refinements.baseline.json`
hand-edited (one site, totals 678 → 679). At `b073d92de` the spec's
`src/migrations`, `src/conversions`, `src/automation` and `scripts`
suites: 115 files, 3251 passed.
- **Gates**: `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` at `b073d92de` (47 paths vs merge base
`f4bed5834`) derived 120 commands; all 120 ran with their exit codes
captured before any pipe. 119 answered exit 0 on the first pass;
`check:skill-examples` answered exit 3 PREREQUISITE NOT MET
(`packages/client/dist` older than `src` after the merge — nothing
measured), and after `pnpm --filter @objectstack/client build` (exit 0)
it answered exit 0, "262 prose examples type-check across 3 surface(s)".
`--ran` reconciliation: "120 derived famil(ies) accounted for — 120 run,
0 NOT-MEASURED". The printed artifact-roster block (35 roster, 14
checker-health self-tests) and the 11 declared wide-population families
ran too: 57 exit 0; `check-closing-target-claim`,
`check-partof-closing-keyword` and `check-single-claim-paths` answered
exit 2 "NOT WIRED" (they need a PR number / body) — NOT MEASURED there;
`check-partof-closing-keyword` with this body as `PR_BODY` is in the
report.
- **Merged `main`** twice through `scripts/pm/os-regen-merge.sh` (each
merge committed first, regeneration as its own commit): at `7d7943dd0`
(`pnpm install --frozen-lockfile` after it), and at `f4bed5834`, which
brought `.changeset/pre.json` and #22166's step-18 entry
(`sys-setting-global-rung-moved`, rationale order 87 — this PR's
fragment keeps 88, the next free one; `gen:migration-registry` re-run on
the merged tree changed nothing). Seven later `main` commits (to
`73a0a6bf1`) are not merged: `git merge-tree` answers clean, their three
overlapping files (`packages/lint/src/validate-expressions.ts` /
`.test.ts`, `packages/spec/src/migrations/registry.ts`) change other
regions, and none adds a `{…}` value-slot string.
## Acceptance notes
- **`current_user` in a flow's CEL** — the build doors and the run
disagree today, independently of this PR:
`validateExpression('predicate', "current_user.id == 'u1'", { scope:
'flattened', … })` (the check `registerFlow` and `os validate` run on a
flow condition) answers `ok`, and `ExpressionEngine.evaluate` over the
flow's scope shape answers "Unknown variable: current_user" (measured at
those two primitives; a door-level run is not part of this PR). Binding
ADR-0068's `current_user` in the flow CEL scope would close that and
give `{$User.*}` its remedy — the open question in the report.
- **Value-like `{var}` positions outside this card's three slots** still
read the dialect: `subflow.input`, `map.input`, `script.inputs`,
`screen.defaults`, a screen field's `defaultValue`, and `http`. Text
slots are #22110's; these have no carrier.
- **Two findings on one value**: `validate-flow-template-paths` still
checks a `{record.…}` path inside a value-slot string that is now
refused anyway, so such a value draws both its path finding and the
refusal. Harmless; no carrier.
- **The save door**: the refusal is a `validateStackExpressions`
finding, the rule the runtime publish gate runs on a flow write, so a
Studio / REST / MCP save of such a flow answers `422 INVALID_METADATA`
by construction — not separately measured in this PR (#19938 measured
that door for the envelope arm of the same rule).
- **Kept-spelling fixtures**: spec and lint test fixtures that only go
through `FlowSchema.parse` or a non-expression rule (`flow.test.ts`,
`validate-field-consumers.test.ts`,
`validate-flow-template-paths.test.ts`,
`validate-readonly-flow-writes.test.ts`) still spell a value-slot
template; they pass, because `FlowSchema` judges no value slot and those
rules filter by their own id.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01RPo7FUd6bSnAfkWMAKi848)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 8cbe255 commit 0e9e7b7
47 files changed
Lines changed: 1589 additions & 451 deletions
File tree
- .changeset
- content/docs
- automation
- kernel/runtime-services
- references/automation
- examples
- app-crm/src/flows
- app-showcase/src/automation/flows
- app-todo
- src/flows
- test
- packages
- cli/test
- lint/src
- qa/dogfood/test
- fixtures
- services/service-automation
- src
- builtin
- spec
- api-surface
- export-origins
- src
- automation
- migrations
- entries/semantic
- triggers/trigger-record-change/src
- verify/src
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
193 | 193 | | |
194 | 194 | | |
195 | 195 | | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
200 | 199 | | |
201 | 200 | | |
| 201 | + | |
| 202 | + | |
202 | 203 | | |
203 | 204 | | |
204 | 205 | | |
205 | 206 | | |
206 | 207 | | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
215 | 217 | | |
216 | 218 | | |
217 | 219 | | |
218 | | - | |
219 | | - | |
220 | | - | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
221 | 223 | | |
222 | 224 | | |
223 | 225 | | |
| |||
241 | 243 | | |
242 | 244 | | |
243 | 245 | | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
244 | 274 | | |
245 | 275 | | |
246 | 276 | | |
| |||
251 | 281 | | |
252 | 282 | | |
253 | 283 | | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
| 284 | + | |
258 | 285 | | |
| 286 | + | |
| 287 | + | |
259 | 288 | | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
260 | 292 | | |
261 | 293 | | |
262 | 294 | | |
| |||
328 | 360 | | |
329 | 361 | | |
330 | 362 | | |
331 | | - | |
| 363 | + | |
332 | 364 | | |
333 | 365 | | |
334 | 366 | | |
| |||
1882 | 1914 | | |
1883 | 1915 | | |
1884 | 1916 | | |
1885 | | - | |
1886 | | - | |
1887 | | - | |
1888 | | - | |
| 1917 | + | |
| 1918 | + | |
| 1919 | + | |
| 1920 | + | |
1889 | 1921 | | |
1890 | 1922 | | |
1891 | 1923 | | |
1892 | 1924 | | |
1893 | 1925 | | |
1894 | 1926 | | |
1895 | | - | |
| 1927 | + | |
1896 | 1928 | | |
1897 | 1929 | | |
1898 | | - | |
1899 | | - | |
1900 | | - | |
1901 | | - | |
1902 | | - | |
1903 | | - | |
1904 | | - | |
| 1930 | + | |
| 1931 | + | |
| 1932 | + | |
| 1933 | + | |
| 1934 | + | |
| 1935 | + | |
| 1936 | + | |
| 1937 | + | |
1905 | 1938 | | |
1906 | 1939 | | |
1907 | 1940 | | |
1908 | 1941 | | |
1909 | | - | |
1910 | | - | |
| 1942 | + | |
| 1943 | + | |
| 1944 | + | |
| 1945 | + | |
1911 | 1946 | | |
1912 | 1947 | | |
1913 | 1948 | | |
1914 | | - | |
1915 | | - | |
1916 | | - | |
1917 | | - | |
1918 | | - | |
1919 | | - | |
1920 | | - | |
| 1949 | + | |
| 1950 | + | |
| 1951 | + | |
| 1952 | + | |
| 1953 | + | |
| 1954 | + | |
| 1955 | + | |
| 1956 | + | |
| 1957 | + | |
1921 | 1958 | | |
1922 | 1959 | | |
1923 | 1960 | | |
| |||
2145 | 2182 | | |
2146 | 2183 | | |
2147 | 2184 | | |
2148 | | - | |
| 2185 | + | |
2149 | 2186 | | |
2150 | 2187 | | |
2151 | 2188 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
97 | 102 | | |
98 | 103 | | |
99 | 104 | | |
| |||
0 commit comments