Repository navigation
Commit 591a796
skills(objectstack-ui): teach list-view grouping and
<!-- claude-projects-attribution: {"github_login":"os-warren"} -->
_Requested by **Warren** · [project
thread](https://claude.ai/code/project/chan_01U5RdnAAmkSQmZbqh6FtqZ8?thread=cmsg_01U5RdnAAmkSQmZbqh6FtqZ8FnjvddcEnXtkGQ5qFJBDTp)_
Fixes #26295
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:objectstack-ui 技能包补上 18.2 的四条教学 —— 列表 `grouping.fields[]` 与
`orderBy`、数据集 `duration` 度量、动作文案的 `{{ }}` 占位(各键的根、bulk 的
`count`、四种拒收形态)、flow 动作的 `onSuccess` 读 `${result.output.NAME}`;配三条
eval。新增先在同文件删重复内容付账,余额按裁决 A 提高棘轮里该包五行的天花板。
- **为什么改**:AI 作者在 18.2 上按阶段分组列表、算平均成交时长、写带记录名的
toast、流程跑完后跳到新建记录,技能文档一条都没教(审计 #26184 的 U1 / U2 / U4 / U5 行);其中
`${record.name}` 写进 toast 会在 `os validate` 被拒。
- **风险与回滚**:只改技能 markdown、eval JSON 和
`scripts/check-skills-token-ratchet.mjs` 的五行数字;不发版、无运行时改动,回滚 = revert 本
PR。风险在教学措辞与 spec 是否一致 —— 三条新示例形状都用 zod 解析探针验过(见 Tests)。
- **先看**:① `skills/objectstack-ui/rules/actions.md` 的文案占位一行和 flow 示例的
`onSuccess`;② `rules/list-views.md` 新的 Grouping 节(select 按选项顺序、`orderBy`
只接数字/日期/布尔);③ `scripts/check-skills-token-ratchet.mjs` 五行天花板(+43 / −13 /
−12 / +284 / +119)。
- **两分钟验证**:`node scripts/check-skills-token-ratchet.mjs` ——
全绿,objectstack-ui 的 actions / dashboards / list-views 与两个 eval 文件
headroom 都是 0;或 `pnpm --filter @objectstack/spec check:skill-examples`
—— 两个改过的 `os:check` 示例编译通过。
- **需要你做的**:Approve(Tier H,`skills/**` 是发布面),席位随后落地。
## What changes
Four rows of the audit on #26184 (comment 6425678185, § objectstack-ui:
U1, U2, U4, U5), taught in the fewest lines an AI author needs, in the
files the card names:
- `rules/list-views.md` — a **Grouping** section (and its TOC entry):
`grouping.fields[]` nests levels outermost first; a `select` level keeps
its declared option order, so "stage in pipeline order" is `{ field:
'stage' }` with the stages declared in that order; `orderBy` places a
level's groups by a number, date or boolean field of the same object
(the period-label case), and text or a select there is refused
(`list-view-group-order-unorderable`).
- `rules/dashboards.md` — the `duration` measure, in place: the Level A
table's measures row names it, the **Computed column** bullet routes
"time between two `datetime` fields of a record" to `{ aggregate: 'avg',
duration: { from, to, unit } }` instead of a hook-kept number, and the
leave-days example says why it still escalates (`date` fields, so no
`duration`). No parallel section.
- `rules/actions.md` — one bullet on the copy slots: holes are `{{ }}`,
`confirmText` reads `record`, `successMessage` reads `record` and
`result`, `errorMessage` fills none, a `bulkActionDefs` entry's
`confirmText` reads `{{ count }}` and its params by bare name, and
`${record.name}`, `{name}`, logic in a hole and a blank sentence fail
`os validate`. The reassign example's toast now carries a hole (`'Lead
{{ record.name }} reassigned.'`). The flow example gains `onSuccess: {
navigate: '/apps/crm/opportunity/record/${result.output.opportunity_id}'
}` and its heading says when the hop runs (a completed run, not one
paused at a screen) and what `${result.output.NAME}` reads (an
`isOutput` variable).
- `evals/views-apps-actions-pages.json` — eval 7 (group opportunities by
stage in pipeline order, forecasts by `period_label` newest first) and
eval 8 ("Lead NAME reassigned" toast + open the opportunity a flow
created). `evals/analytics-inline-vs-dataset.json` — eval 8 (average
days from `created_at` to `closed_at`). Same shape as the files'
existing entries.
- `scripts/check-skills-token-ratchet.mjs` — the five `CEILINGS` rows of
the files above, moved to the measured counts (the ruling and arithmetic
below).
**Line readings** (whole file, before → after, on base 756220c):
| file | lines | tokens (`ceil(utf8 bytes / 4)`, the sibling gate's
unit) |
|:--|:--|:--|
| `rules/actions.md` | 206 → 203 | 2101 → 2151 (+50) |
| `rules/dashboards.md` | 465 → 464 | 6251 → 6239 (−12) |
| `rules/list-views.md` | 303 → 311 | 3133 → 3129 (−4) |
| **package** (`SKILL.md` + `references/**/*.md` + `rules/**/*.md`) |
**2053 → 2057** | **28253 → 28287 (+34)** |
| `evals/views-apps-actions-pages.json` | 65 → 85 | 1505 → 1789 (+284) |
| `evals/analytics-inline-vs-dataset.json` | 77 → 87 | 1229 → 1348
(+119) |
| whole `skills/objectstack-ui/` tree | 2226 → 2260 | ratchet bundle
total 206107 → 206544 (+437) |
**Paid down first, then raised — the token ratchet.** `node
scripts/check-skills-token-ratchet.mjs` prices every file above per
file, shrink-only, and on base every one of them sat at 0–8 tokens of
headroom. The teaching alone costs +141 / +66 / +127 / +284 / +119. Each
rule file pays in its own file by deleting restatements, every cut's
surviving home named here:
- `actions.md` (−91): the sentence that `ActionRunner.executeUrl` reads
`openIn` with priority over a legacy heuristic (an implementation note;
the author-facing rule is the paragraph it sat in); the "validated
today, rendered once the console's print rendering ships" clause (home:
`rules/pages.md` → Print pages, which carries that status); the
params-callout's closing remedy that re-listed the two mechanisms (home:
the two subsections directly above it; the callout now points there);
"so it matches hooks and seed data with zero relearning" (home: the same
paragraph's last sentence, "same blessed name … as hooks", and the code
comment "identical to the hook surface"); the code comment
"zero-roundtrip; endpoint self-auths" (home: the prose two lines above
the block). Plus the card-named stale line 21 reworded
("author-controlled" dropped). Net +50; the ceiling absorbs its 7 of
headroom and moves by the remaining **+43**.
- `dashboards.md` (−78): the four-line comment inside the
`SalesDashboard` example restating that widgets bind a dataset and
select by name and that `filter` is the runtime filter (home: the
**Dataset-Bound Widgets** section, which states all three). Net −12; the
ceiling is **lowered** to the measurement.
- `list-views.md` (−131): the paragraph after the allowed-set table that
restated its two rows (home: the table, which the sentence above it
already calls "the whole rule"); the related-record search paragraph,
compressed to one sentence that points at **objectstack-data → Search
Fields**, which carries the mirror field, the two hooks and why a
`formula` cannot be the mirror in full (the dotted-path refusal stays in
this file's own table row). Net −4; the ceiling is **lowered** to the
measurement.
- The two eval files are fixtures with nothing to delete; their rows are
raised by the whole addition (**+284**, **+119**).
The ruling the raise runs on — Warren, 2026-10-27T01:21Z, option A
tapped on the decision card 「skills 修复卡的教学和 eval 都撞 token 天花板,怎么付?」,
verbatim and untranslated: **「A:先削重复,余额按实测提高」**. Each row's comment in
the script quotes it. Ceilings net +421 (+437 of growth, 16 of
pre-existing headroom absorbed); every touched row is pinned at its
measurement, zero headroom.
## Why
An AI author building lists, dashboards and actions on 18.2 could not:
group a list by stage in pipeline order (list-view `grouping` was
untaught — 0 hits); keep "average time to close" on the dataset (the
escalation advice sent every computed value to a hook-kept stored field,
and never named the measure that now exists); write a toast that names
the record (`'Lead ${record.name} reassigned'` reads as plain copy in
the old text and is refused at `os validate`); or take the user to the
record a flow created (`onSuccess` is read for `type: 'flow'` since the
executor set widened, and the flow example lacked it).
**Premise checks against `origin/main` 756220c** (the order's
hypotheses; the cited commits are unreachable in this shallow clone too
— `git cat-file -t` answers missing for all nine — so the spec lines are
the evidence):
1. *Holds, with one correction to the example.*
`grouping.fields[].orderBy` is `packages/spec/src/ui/view.zod.ts:1441`.
But a `select` level already groups in its declared option order — the
grid's group comparator ranks option values by the field's `options`
(`ui/packages/plugin-grid/src/useGroupedData.ts`, `compareGroupEntries`;
`ObjectGrid.tsx` builds `groupOptionRanks`), and `orderBy` over a select
is refused by `list-view-group-order-unorderable`
(`packages/lint/src/validate-list-view-field-refs.ts:405`;
`rule-explanations.ts:3417`: min/max over the string classes is refused
by `AGGREGATE_FIELD_TYPE_COMPATIBILITY`). So the pipeline-order case is
taught as `{ field: 'stage' }` with no `orderBy`, and the `orderBy`
example is the spec's own fixture case, `period_label` ordered by
`period_start` (`view-grouping-query.test.ts:595`). Eval 7 expects
exactly that split.
2. *Holds.* `DatasetMeasureDurationSchema` at
`packages/spec/src/ui/dataset.zod.ts:276` (`from`, `to`, `unit` ∈
seconds/minutes/hours/days, aggregates avg/min/max/sum, `datetime`
columns only — `DATASET_DURATION_FIELD_TYPE`, line 247). Corrected in
place at the Computed-column bullet; the leave-days example at lines
93–99 stays right because its fields are `date`.
3. *Holds.* Roots and refusals per
`packages/spec/src/ui/action-copy-template.ts`
(`actionConfirmTemplateRoots`, `ACTION_SUCCESS_TEMPLATE_ROOTS`,
`ACTION_ERROR_TEMPLATE_ROOTS`); bulk roots `count` + params by bare name
per `bulk-action.zod.ts:334–364`. One nuance kept out of the teaching: a
registered action's `errorMessage` is an `I18nLabel`, not a template
slot (`action.zod.ts:1424`), and `validate-action-copy-templates.ts`
judges `errorMessage` only on page action rows — "fills none" is true on
both surfaces.
4. *Holds.* `onSuccess` beside `type: 'flow'`
(`action-on-success-executor.ts:25–33`; `action.zod.ts:1719–1721`),
`${result.output.VAR}` reading the flow's `isOutput` variables; the
example's `opportunity_id` is declared `isOutput: true` by
`examples/app-crm/src/flows/convert-lead.flow.ts:47`.
5. *As predicted:* spec lines cited, not commits.
6. *Holds:* 0 hits for `orderBy` / `duration` / `onSuccess` in the
package's evals on base; all three evals are new.
## Tests
No TypeScript changes; the gate that compiles the package's `os:check`
examples and a zod parse probe of every new shape are the tests.
- **Zod parse probe** (`tsx`, against `packages/spec/src` on this head;
script in the dev's scratchpad, nothing committed):
- `ActionSchema.safeParse` of the reassign example (`successMessage:
'Lead {{ record.name }} reassigned.'`) → PARSES; of the convert example
with `onSuccess.navigate` → PARSES; control, `onSuccess` on a `type:
'url'` action → REFUSED ("a `url` action is itself the navigation…").
- `closedScopeTemplateRefusal` over the `successMessage` roots: `'Lead
${record.name} reassigned'` → refused ("write each `${…}` token as the
`{{ }}` hole it names"); `'Lead {name} reassigned'` → refused
(single-brace dialect); `'Lead {{ record.name }} reassigned'` → no
refusal.
- `DatasetMeasureSchema.safeParse({ name: 'avg_days_to_close',
aggregate: 'avg', duration: { from: 'created_at', to: 'closed_at', unit:
'days' } })` → PARSES; controls: `aggregate: 'count'` with `duration` →
REFUSED ("a duration measure takes `aggregate` avg / min / max / sum");
`field` beside `duration` → REFUSED ("it takes no `field`").
- `GroupingFieldSchema.safeParse({ field: 'stage' })` → PARSES; `{
field: 'period_label', orderBy: 'period_start', order: 'desc' }` →
PARSES; control, padded `orderBy: ' period_start'` → REFUSED (the
non-padded rule).
- Both eval files load with `json.load` (shape unchanged: `id` /
`prompt` / `expected_output` / `files` / `assertions`).
- `pnpm exec eslint --no-inline-config
scripts/check-skills-token-ratchet.mjs` → exit 0.
- Ablation: n/a — no tested behaviour changed (docs, fixtures and a
gate's pinned numbers).
## Acceptance notes
- The card's acceptance — an eval per new teaching; `check:skill-docs`,
`check:skill-refs`, `check:skill-examples` green; both readings
reported; additions paid inside the package; nothing removed beyond the
stale lines the card names — is met as read above, with one widening the
ruling ordered: the five `CEILINGS` rows in
`scripts/check-skills-token-ratchet.mjs`, outside
`skills/objectstack-ui/**`. The seat amends the claim's file surface for
them.
- The cuts delete restatements only; each has a surviving home named
above. The card-named stale lines (`actions.md:20-21`, `:64-69`;
`dashboards.md:69-72`, `:90-92`) are rewritten in place, not dropped.
- `references/_index.md` is generator-owned and unchanged
(`check:skill-refs` green); line 1 of `SKILL.md` is untouched (PR #25640
owns it).
- Observed, not filed (os-dev rule 3, none of the three classes):
`rules/actions.md` still says `errorMessage` is "toast copy" for a
registered action, which is right; that a page action row's
`errorMessage` is additionally judged as a template slot is an
objectui-surface nuance with no author-facing choice. `evals/README.md`
describes the two files generically; no edit needed.
- `skip-changeset`: the skills packages carry no `package.json` and
nothing in a released package's `files[]` moves; the ratchet script is
repo tooling.
## Verification
Gates derived with `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` on this tree (50 commands: 42 matched by
path, 8 declared whole-tree), every exit code captured before any pipe;
reconciled with `--ran`.
**48 green, 2 NOT MEASURED (exit 3, prerequisite: a whole-tree build), 0
red, 0 unrun** on head {HEAD}.
<details><summary>Card acceptance gates and the ratchet (exit codes
captured before any pipe)</summary>
- `pnpm --filter @objectstack/spec check:skill-docs` → exit 0
- `pnpm --filter @objectstack/spec check:skill-refs` → exit 0
(`references/_index.md` in sync, unchanged)
- `pnpm --filter @objectstack/spec check:skill-examples` → exit 0 — 264
marked examples type-check across 3 surfaces (230 skills + docs blocks,
the two edited `os:check` blocks in `rules/actions.md` among them),
after building `@objectstack/client-react` / `@objectstack/client` under
the lock
- `node scripts/check-skills-token-ratchet.mjs --self-test` → exit 0 (79
cases); `node scripts/check-skills-token-ratchet.mjs` → exit 0 — every
objectstack-ui row green, the five touched files at headroom 0, bundle
total 206544
</details>
<details><summary>Every other derived family, by exit code</summary>
- `node scripts/check-ci-filter-parity.mjs` → exit 0
- `node scripts/check-closing-keyword-parity.mjs` → exit 0
- `node scripts/check-closing-keyword-parity.mjs --self-test` → exit 0
- `node scripts/check-comment-mask-corpus.mjs` → exit 0
- `node scripts/check-declaration-mirrors.mjs` → exit 0
- `node scripts/check-declaration-mirrors.mjs --self-test` → exit 0
- `node scripts/check-doc-route-spelling.mjs --advisory` → exit 0
- `node scripts/check-doc-route-spelling.mjs --self-test` → exit 0
- `node scripts/check-dts-emitted.mjs --self-test` → exit 0
- `node scripts/check-scripts-symbol-anchors.mjs` → exit 0
- `node scripts/check-scripts-symbol-anchors.mjs --self-test` → exit 0
- `node scripts/check-self-test-wired.mjs` → exit 0
- `node scripts/check-self-test-wired.mjs --self-test` → exit 0
- `node scripts/check-self-test-workflow-commands.mjs` → exit 0
- `node scripts/check-self-test-workflow-commands.mjs --self-test` →
exit 0
- `node scripts/check-whole-set-label-write.mjs` → exit 0
- `node scripts/check-whole-set-label-write.mjs --self-test` → exit 0
- `node scripts/ci/assert-turbo-remote-cache.mjs --self-test` → exit 0
- `node scripts/ci/prune-turbo-cache.mjs --self-test` → exit 0
- `node scripts/pm/bare-root-worklist.mjs --self-test` → exit 0
- `pnpm --filter @objectstack/lint run check:doc-formula-expressions` →
exit 0
- `pnpm check:agent-test-spelling` → exit 0
- `pnpm check:bash32-floor` → exit 0
- `pnpm check:cli-command-ids` → exit 0
- `pnpm check:corpus-claim-drift` → exit 0
- `pnpm check:cross-package-test-inputs` → exit 0
- `pnpm check:doc-authoring` → exit 0
- `pnpm check:driver-memory-census` → exit 0
- `pnpm check:dts-closure` → exit 0
- `pnpm check:entry-guard` → exit 0
- `pnpm check:gitlink-declared` → exit 0
- `pnpm check:nul-bytes` → exit 0
- `pnpm check:parse-guard` → exit 0
- `pnpm check:pm-dispatch-gates` → exit 0
- `pnpm check:pm-governed-merges` → exit 0
- `pnpm check:pm-skill-id-lint` → exit 0
- `pnpm check:pnpm-filter-targets` → exit 0
- `pnpm check:pnpm-flag-spellings` → exit 0
- `pnpm check:ratchet-remedy-authority` → exit 0
- `pnpm check:refd-timer-probe` → exit 0
- `pnpm check:role-word` → exit 0
- `pnpm check:skill-compatibility` → exit 0
- `pnpm check:skill-frame-sync` → exit 0
- `pnpm check:skill-identifier-liveness` → exit 0
- `pnpm check:sourcemap-no-sources-content` → exit 0
- `pnpm check:watch-hint-literal` → exit 0
NOT MEASURED — the gate refused before measuring (exit 3), declared
here, CI runs it:
- `pnpm check:dual-build-cjs-loads` → exit 3 — reads every package's
built `dist/` (93 packages); CI's `Lint & Repo Gates` builds the tree
first
- `pnpm check:lean-entry-closure` → exit 3 — loads built entry points
(`@objectstack/objectql/core` absent here); same CI family
</details>
<details><summary>Reconciliation, builds and the rest</summary>
- `node scripts/pm/dispatch-gates.mjs --ran gates/ran.list` → exit 0 — ✓
dispatch-gates --ran: 50 derived famil(ies) accounted for — 48 run, 2
NOT-MEASURED (2 DERIVED from a recorded exit 3).
- Builds under `scripts/pm/os-verify-lock.sh` (slot `issue-26295`):
`pnpm --filter @objectstack/spec build` VERDICT command-exit 0 (64 s
held); `turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint` exit 0; `turbo run build
--filter=@objectstack/client-react --filter=@objectstack/client` VERDICT
command-exit 0 (133 s held).
- `pnpm check:pm-dispatch-gates` → exit 0 (fast tier, 1901 cases), run
detached as os-dev directs.
- Not owed locally: no package `test` / `typecheck` (no TypeScript
changed; `dispatch-gates` derives no type-check program for this diff);
`test:repo`, `pnpm lint` and the whole-tree scans are CI's. Dogfood
battery: n/a — no `!` in the title and no `(narrowing)` arm.
- CI on the PR: not waited for (the order forbids it); the seat reads
the check-runs.
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01JQwxbXGPgrhvw7MBugmme8)_
Co-authored-by: Claude <noreply@anthropic.com>orderBy, the duration measure, action copy holes, and a flow action's onSuccess (#26385)1 parent 9c3097e commit 591a796
6 files changed
Lines changed: 100 additions & 37 deletions
File tree
- scripts
- skills/objectstack-ui
- evals
- rules
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
611 | 611 | | |
612 | 612 | | |
613 | 613 | | |
614 | | - | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
615 | 620 | | |
616 | 621 | | |
617 | 622 | | |
| |||
621 | 626 | | |
622 | 627 | | |
623 | 628 | | |
624 | | - | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
625 | 640 | | |
626 | 641 | | |
627 | 642 | | |
628 | 643 | | |
629 | 644 | | |
630 | | - | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
631 | 651 | | |
632 | 652 | | |
633 | 653 | | |
634 | 654 | | |
635 | 655 | | |
636 | | - | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
637 | 662 | | |
638 | 663 | | |
639 | 664 | | |
| |||
691 | 716 | | |
692 | 717 | | |
693 | 718 | | |
694 | | - | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
695 | 724 | | |
696 | 725 | | |
697 | 726 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
75 | 85 | | |
76 | 86 | | |
77 | 87 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
63 | 83 | | |
64 | 84 | | |
65 | 85 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
42 | 43 | | |
43 | 44 | | |
44 | 45 | | |
45 | | - | |
| 46 | + | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
52 | | - | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| |||
67 | 68 | | |
68 | 69 | | |
69 | 70 | | |
| 71 | + | |
70 | 72 | | |
71 | 73 | | |
72 | 74 | | |
| |||
114 | 116 | | |
115 | 117 | | |
116 | 118 | | |
117 | | - | |
118 | | - | |
| 119 | + | |
119 | 120 | | |
120 | 121 | | |
121 | 122 | | |
| |||
143 | 144 | | |
144 | 145 | | |
145 | 146 | | |
146 | | - | |
147 | | - | |
| 147 | + | |
148 | 148 | | |
149 | 149 | | |
150 | 150 | | |
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
182 | | - | |
| 182 | + | |
183 | 183 | | |
184 | 184 | | |
185 | 185 | | |
186 | 186 | | |
187 | | - | |
188 | | - | |
| 187 | + | |
189 | 188 | | |
190 | 189 | | |
191 | 190 | | |
192 | 191 | | |
193 | 192 | | |
194 | | - | |
195 | | - | |
196 | | - | |
| 193 | + | |
197 | 194 | | |
198 | 195 | | |
199 | 196 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | | - | |
| 70 | + | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
92 | 95 | | |
93 | 96 | | |
94 | 97 | | |
95 | 98 | | |
96 | 99 | | |
97 | 100 | | |
98 | | - | |
99 | | - | |
| 101 | + | |
| 102 | + | |
100 | 103 | | |
101 | 104 | | |
102 | 105 | | |
| |||
168 | 171 | | |
169 | 172 | | |
170 | 173 | | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | 174 | | |
176 | 175 | | |
177 | 176 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
190 | 190 | | |
191 | 191 | | |
192 | 192 | | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
| 193 | + | |
197 | 194 | | |
198 | 195 | | |
199 | 196 | | |
| |||
233 | 230 | | |
234 | 231 | | |
235 | 232 | | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
| 233 | + | |
| 234 | + | |
242 | 235 | | |
243 | 236 | | |
244 | 237 | | |
| |||
250 | 243 | | |
251 | 244 | | |
252 | 245 | | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
253 | 261 | | |
254 | 262 | | |
255 | 263 | | |
| |||
0 commit comments