Skip to content

ci(docs): every number on the README and the supported profile names its model (#1192) - #1484

Merged
DrunkOnJava merged 9 commits into
mainfrom
ci/1192-numbers-name-their-model
Nov 5, 2026
Merged

DrunkOnJava merged 9 commits into
mainfrom
ci/1192-numbers-name-their-model

Conversation

@DrunkOnJava

@DrunkOnJava DrunkOnJava commented Nov 5, 2026 •

Copy link
Copy Markdown
Owner

Summary

W10 of the 1.0 criteria (#1192): tools/ci/measured_numbers.py, the last steps of the PII guard job, fails a number on the README or the supported profile that has no model of a new "Model index" table in docs/reference-models.md within 300 characters in its own clause, or a number on a local only or not shared model without those words beside that model's name, or an index row that does not say who can fetch its model. The pages are edited until they pass, and the figures the second read found stale are updated. One Measure dispatch is documented as the command that re-runs the numbers on the models anyone can fetch. The criteria's W10 row records both and stays not measured.

Motivation

W10 was not measured because nothing checked that a number names its model (#1192). Several figures rest on models nobody else can fetch (Snowdon Towers' exports, the MIT house, the 255ribeiro projects, flowbim's house, the pre-2015 files, the client models), and a reader could not tell which.

Changes

  • tools/ci/measured_numbers.py and tools/ci/test_measured_numbers.py; three steps at the end of ci.yml's pii-guard job (the check, --refusals, the failure-first tests).
  • docs/reference-models.md: the Model index (19 models, four fetchability words) and "Re-run the numbers" (the Measure dispatch, what it covers, what it does not).
  • README.md, docs/supported-profile.md, docs/evidence.md, docs/support-matrix.json, docs/release-1.0-criteria.md: models named, local only and not shared said, eight clauses marked <!-- w10: reason -->, the stale saved-mesh figures replaced, and a sentence on how to read the figures.
  • docs/maintaining.md: "Numbers on the README and the supported profile".
  • changelog.d/changed/1192-numbers-name-their-model.md.

The rule

Every numeral on the two pages, in a heading as in a cell, is a number except what its spelling marks as an identifier (an issue, a report, a hash, a date, a Revit release or other year, a Measure run id, a layout width, a tool's version, the 1.0 release). It needs a name from the index within 300 characters in its own clause (between semicolons and sentence ends, never split inside parentheses; each cell, item and heading its own unit). local only / not shared must stand beside that model's name (within 60 characters and nearer to it than to another model's name; "both" and "all" reach back). A number that is not a measurement carries <!-- w10: reason -->, which fails without a reason or with nothing to excuse, and the failure message says so. No allowlist. A pattern for measurements would miss the next form someone writes; this fails any new form until it names a model.

What it cannot catch (stated in docs/maintaining.md): a number placed near the wrong model's name, a number that is not true or not current, a measured count inside a code span that is more than a number, a figure spelled out in words, and the pages other than these two.

Second read, and what I changed

  • Stale figures updated, not relabelled. The BIM4LCA office's 1,294 of 1,709 and RE1's 207 and 148 of 214 (Measure 40192112285, October) are now run 41850769925's at e024f03c, which RE-304 and RE-331 section 4.4 agree on, and which I re-totalled from that run's scorer files: the office 1,554 of 1,650 exact as built and 1,638 of 1,738 at permit (265 of 269 doors and all 269 windows exact as built, run 41850758987 for the default export, RE-331 section 4.1), RE1 148 of 228 exact (Architecture 45 of 53, Electrical 31 of 47, Mechanical 65 of 68, Plumbing 7 of 60) and 228 of 228 within 0.01 ft of Revit's box. The "221 of 269 doors keep their box" and "1,294 of the 1,352 bodies then drawn" sentences are gone. Core Interior: your note said 158 of 158 stands; run 41850769925 scores 138 saved-mesh bodies there (132 doors, 6 windows) and no shading device, and RE-331 says 138, so the pages now say 138 of 138. RE-78's 158 counted 20 shading devices; I did not find why they are no longer scored. Snowdon Towers' 3,332 of 3,736 stays, labelled as RE-78's local run not re-run since.
  • profile 8 files' ElementIds: now the one Revit-side check from Element records beyond 2024/2025: derive the marker from the schema and measure the older envelope (RE-80 follow-up) #421 (2026-11-04), with its counts; the other 7 are not checked.
  • 1,030 and 724: cited to feat(elements): draw tapered walls with their leaning exterior face (#358) (RE-86) #446, not RE-70 to RE-74 (also on docs/evidence.md).
  • --large-model: the source's presets (2 GiB per stream, 8 GiB inflate on 64-bit), marked.
  • Beams and landings hold on 28 Revit 2025 models, arcs on 25 (README, profile). docs/compatibility.md, docs/evidence.md line 15 and docs/support-matrix.json lines 395, 422 and 440 still say 25 for the beam and landing claims; outside the two pages, not changed.
  • 923 of 942 Snowdon beams: the fetched samples (run 41787230413, RE-328 section 3), no longer local only.
  • Index rows: the MIT house (the course page serves it, no script fetches it), 255ribeiro (GitHub repository, no script fetches it), Vitoria (ALD26 Before is spent and measured in full, the rest held out); W10 row "none was cut"; fork dispatch and -f ifc_flags= figures stated as untried and not covered; the "nobody has re-run and compared" caveat is on the README and the profile.
  • A pull request that moves a figure edits the page: docs/maintaining.md.
  • Check: parentheses, headings, proximity, local-only nearness, the marker way out in the message, steps last.

Numbers that could not be traced to a run, or only weakly

Testing

Unit tests are banned here; the one exception is a pure helper, and test_measured_numbers.py is that (35 cases, failure-first, no file or network I/O; the first 28 are unchanged).

  • No Rust changed; tools/check-local.sh N/A (CI is the build)
  • End to end on the real pages: python3 tools/ci/measured_numbers.py passes (255 of 271 numbers name a model, 8 clauses marked). On the pages as they were at f009976e, the first form of the check failed 51 clauses.
  • python3 tools/ci/measured_numbers.py --refusals copies the pages and the index to a scratch directory, appends or breaks one thing each time, and the check refuses it for the stated reason: a number with no model, a local-only model that does not say so, a local-only word beside another model's name, a number far from its model in a long clause, a number in a heading, a marker with no reason, a marker with nothing to excuse, an index row with no fetchability. It runs in CI. A scratch copy with ", and 4,321 more beams" added to the 3,592-character Properties clause also fails.
  • 22 mutations of the script (longest name, flag surviving its unit, stale marker, no reason required, years, thousands comma, link targets, hashes, heading rule, headings skipped, name boundary, any word flagging, flag to every nearby name, unbounded flag gap, "both" and "all" ignored, unbounded proximity, split inside parentheses, glued unit, number-only code span, 2D, numberless clause needing a flag, message without the marker way out), each run against the tests in a scratch copy: all fail them.
  • changelog.py check, api-doc-ids.py, readme-matrix.py --check, wasm-api.py docs, render-mcp-tools.py --check, check-workflows.py (PyYAML in a scratch venv, 0 errors) pass; the matrix is valid JSON; the script and tests also pass on Python 3.11 and 3.12.
  • Not run: actionlint (the environment's command filter refused it) and CI itself, the first run of the new steps on a runner.
  • Not measured: that the re-run command reproduces the pages' figures. Nobody has compared; the dispatch is the one the cited runs were made with. I did not dispatch Measure.

Audit-honesty checklist

  • README / docs reflect the current state after this PR
  • Changelog fragment under changelog.d/changed/
  • No new limitation beyond those stated above
  • No emojis; no private paths or personal email addresses in committed files
  • N/A: no reverse-engineering finding

Legal and contribution hygiene

  • Apache-2.0; no Autodesk source; no fixtures added

Breaking changes

None for users. A pull request that adds a number to the README or the supported profile without a model fails the PII guard job (docs/maintaining.md). Open pull requests that touch these pages pass their own CI until their next run after this merges, and #1468 (12 bindings becomes 13) will meet the marker at README line 85.

Related issues

Refs #1192. Not Closes: the third done-when item is the maintainer setting W10's bar, and the row's status records the result without moving proposed.

…its model (#1192)

W10 of the 1.0 criteria asks that a reader can tell, for every number on the
README and the supported profile, which model it was measured on and whether
they can fetch it. tools/ci/measured_numbers.py now checks it in the PII guard
job: a number whose clause names no model of the new "Model index" table in
docs/reference-models.md fails, so does a number on a local-only or not-shared
model whose clause does not say so, and so does an index row that does not say
who can fetch its model.

The rule is closed rather than a pattern for measurements: every digit is a
number except what its spelling marks as an identifier (an issue, a report, a
hash, a date, a Revit release, a Measure run id, a tool's version), and a
number that is not a measurement carries <!-- w10: reason -->, which fails
without a reason or with nothing to excuse. The script has no allowlist.

On the pages as they were, 51 clauses failed it (39 with no model, 12 on a
local-only model that did not say so). Each now names its model; the Snowdon
Towers, 255ribeiro, flowbim, pre-2015 and client-model figures say "local only"
or "not shared"; Snowdon Towers' 1,030 of 1,078 walls, which traced to no
committed report, is labelled as a local run of 2026-09-27 not re-run since.
Eight clauses carry a marker (release versions, the wasm binding count that
wasm-api.py pins, resource-limit defaults, an exit status, a value rvt-rs
writes).

docs/reference-models.md documents the one Measure dispatch that re-runs the
numbers on the models anyone can fetch, with what it does not cover, and
docs/maintaining.md says how a new number keeps to the rule. The W10 row of the
criteria records the check and stays "not measured": the re-run half is
documented, not verified, and the bar is the maintainer's.

Refs #1192
# Conflicts:
#	.github/workflows/ci.yml
#	docs/supported-profile.md
…e page as not re-run, and name the base of the failing count (#1192)

The profile labels them (local run of 2026-09-27 in #446, RE-322's quote of RE-70 to RE-74); the evidence page carried the same figures unlabelled. The changelog fragment names the commit its 51 failing clauses were counted on. Refs #1192
@DrunkOnJava DrunkOnJava added the ready-when-green Draft whose code is complete: marked ready for review once its fast CI passes label Nov 5, 2026
@DrunkOnJava
DrunkOnJava marked this pull request as ready for review November 5, 2026 21:52
@DrunkOnJava DrunkOnJava removed the ready-when-green Draft whose code is complete: marked ready for review once its fast CI passes label Nov 5, 2026
… check (#1192)

The second read of #1484 found figures the first pass only labelled and a
check that was looser than its documentation.

Figures. The saved-mesh figures from Measure run 40192112285 (October) were
stale: the BIM4LCA office's 1,294 of 1,709 and RE1's 207 and 148 of 214 are
now run 41850769925's at e024f03, which RE-304 and RE-331 section 4.4 agree
with: the office 1,554 of 1,650 as built and 1,638 of 1,738 at permit, RE1
148 of 228 exact and 228 of 228 within 0.01 ft of Revit's box, Core Interior
138 of 138. The office's doors are all drawn from their saved meshes (265 of
269 exact, run 41850758987). Also corrected: the 8 client models' ElementIds
were checked on one of them (#421, 2026-11-04); the 1,030 and 724 wall
figures cite #446; the --large-model preset is the source's 2 GiB and 8 GiB;
the beam and landing claim holds on 28 Revit 2025 models and the arc claim on
25; the 923 of 942 Snowdon Towers beams are on the fetched samples and not
local only; the index says what the MIT house, 255ribeiro and Vitoria rows
actually are; the re-run docs say that -f ifc_flags= figures, a fork dispatch
and the figures' re-run are untried or uncovered.

Check. Nothing inside parentheses ends a clause; headings are read; a number
must have a model name within 300 characters in its own clause; "local only"
must stand beside that model's name (nearer to it than to another model's, with
"both" and "all" reaching back); the failure message says how to mark a number
that is no measurement; the steps run last in the PII guard job. New refusals:
a number far from its model, a number in a heading, a local-only word beside
another model's name. 35 pure-judgement tests, 22 mutations of the script each
caught.

Refs #1192
… on every page (#1192)

RE-345 read 28 Revit 2025 models for beams and tread landings (puzzbobb's 24 and RE1's four) and counts 25 with Revit's own 2025 exports (puzzbobb's 24 and RE1 Architecture) for the arc and shaft census. compatibility.md, evidence.md, status.md, maintaining.md and the support matrix's beam, landing and arc notes now say which, as the README and the supported profile do. Refs #1192
@DrunkOnJava
DrunkOnJava enabled auto-merge (squash) November 5, 2026 22:57
@DrunkOnJava
DrunkOnJava merged commit 8060ecc into main Nov 5, 2026
38 checks passed
@DrunkOnJava
DrunkOnJava deleted the ci/1192-numbers-name-their-model branch November 5, 2026 23:28
DrunkOnJava added a commit that referenced this pull request Nov 6, 2026
… the 20 plates and 116 rooms were outlines before the option landed (#1492) (#1508)

## Summary

RE-78 counted 158 saved-mesh bodies on Core Interior (132 doors, 6
windows, 20 shading devices); `mesh_bodies_vs_ifc` and `rvt-ifc
--saved-meshes` count 138. Nothing changed on `main`: the 158 was
measured on 2026-09-27, when the 20 plates and the 116 rooms were record
boxes. RE-95 (#467, 6e0dfaa) closed the plates' sketch outlines and
RE-101 (#473, 68a44c0) gave the rooms their stored-solid outlines on
2026-09-28, and `saved_meshes::attach` replaces only a body whose
`ProfileResolved` is false, as it did at 7386177, the first commit on
`main` with `--saved-meshes`. No export changes and no body that
measured exact was lost.

## Motivation

#1492: the pages were corrected to 138 of 138 in #1484 without saying
why the 20 stopped being scored.

## Changes

- `reports/element-framing/RE-78-saved-graphics-meshes.md`: the result
line stops naming the shading devices, the Core Interior shading-device
row says it is from before RE-95, and a dated note under the first table
gives the commits and the rule. The Snowdon rows are said to be from the
same earlier tree, local only and not re-run.
- `tools/re/shading_bodies_vs_ifc.py`: `mesh_bodies_vs_ifc` with every
`IfcShadingDevice` selected whatever its `BodySource`, and a count of
the `BodySource` and `ProfileResolved` of the plates before its table.
Run by name through `-f scorers=` (as `slab_bodies_vs_ifc` is); not in
the standing scorer list.
- `changelog.d/research/1492-shading-plates-not-saved-meshes.md`.

## Testing

Unit tests are banned in this repository; none added.

- [x] Commit found by reading, not inferred from dates: `git merge-base
--is-ancestor 6e0dfaa 7386177` and `... 68a44c0 7386177` both hold,
`git show 7386177:src/ifc/saved_meshes.rs` has the `||
profile_resolved` skip (line 75), and PR #420's own body says its Core
Interior row (158) is from before its rebase onto `main`. The Measure
run that body cites (36717043673) exported IFC byte-identical to
`main`'s, so it did not draw the meshes and did not re-measure the 158.
- [x] Measure run 41850769925 (`--saved-meshes`, `e024f03c`): `rvt-ifc`
prints `138 of 138 bounding-box bodies drawn from their saved graphics`,
and `mesh_bodies_vs_ifc` and `saved_meshes_vs_ifc` score 132 doors and 6
windows, no shading device.
- [x] The new scorer, run on Revit's small Core Interior IFC against
itself (one shading device): selects it and scores ratio 1.0000. That
checks the selection, not rvt-rs.
- [x] Measure run 42133202790 (filtered: `core-interior`, `-f
ifc_flags=--saved-meshes`, scorers `plan_profiles_vs_ifc
mesh_bodies_vs_ifc saved_meshes_vs_ifc shading_bodies_vs_ifc`; code
`daf36102`, scorers from `3fb0d241`; success), read back:
- The 20 plates are `BodySource` `partition_element_record_bbox` with
`ProfileResolved` true (the record-box source stays on a body whose
outline is resolved).
- Shape against Revit's body of the same Tag (`shading_bodies_vs_ifc`):
volume within 0.01% on 20 of 20, every vertex within 0.001 ft both ways
on 20 of 20, Revit's vertices on rvt-rs's surface on 20 of 20; the
largest distance 1.539e-06 ft (10 `Floor:Structural Slab`, 10
`Floor:Arch Topping Slab - 2"`).
- Plan outline (`plan_profiles_vs_ifc`): area within 0.1%, vertices and
outline within 0.01 ft, 20 of 20 (and 80 of 80 `IfcSlab`).
- `mesh_bodies_vs_ifc` and `saved_meshes_vs_ifc` score 138 bodies (132
doors, 6 windows), no plate and no room; `rvt-ifc` prints `138 of 138
bounding-box bodies drawn from their saved graphics`.
- Not measured: the plates' saved meshes against Revit's (the option
leaves the plates alone, so no run draws them), and the rooms' shape
(Revit's export holds no spaces to score them against).

## Audit-honesty checklist

- [x] The docs say what was and was not measured; the plates' shape
figure is labelled not yet measured on this head
- [x] A fragment under `changelog.d/research/`
- [x] No emojis, private paths or PII

## Legal and contribution hygiene

- [x] Apache-2.0; no Autodesk source; no new fixtures

## Breaking changes

None. No `src/` change, no export change.

## Related issues

Closes #1492.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant