Skip to content

docs(openusd): restructure run-on requirement prose - #3

Closed
marcschier wants to merge 3 commits into
mainfrom
fix/openusd-spec-readability
Closed

marcschier wants to merge 3 commits into
mainfrom
fix/openusd-spec-readability

Conversation

@marcschier

@marcschier marcschier commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

What this changes

Readability repairs to workingdrafts/models/openusd/spec.md, produced in an
interactive Lingity editing session. Every change was an explicit editor
decision; nothing was applied autonomously.

Measured result

Policy architecture-review 1.3.0 (document HRI ≥ 85, every substantive block
≥ 85, zero high-severity findings), measured against the pre-edit bytes
(SHA-256 b9418c29…56524).

Measure Before After
Document HRI 3.30 4.21
Policy violations 61 32
Defects 449 419
High severity 49 28
Blocks below the 85 floor 11 3
Lowest substantive block 73.07 80.97

Severity mix: high 49 → 28, medium 223 → 212, low 177 → 179.

Principal repairs

  • Abstract — split at the em-dash; in order to → to. The enabling verb
    allows is deliberately kept, so the registry is not newly asserted to
    perform storage, discovery and federation itself.
  • §1 overview — the four-way discoverable / verifiable / versioned /
    federatable
    enumeration became a list, with the subject restated so it stays
    bound to each item. That block went 73.07 → 98.92.
  • §5.4 asset resolution — procedure split out, with the
    validate-then-retrieve ordering kept explicit as "only after that validation".
  • §5.1 — the xid definition split so the RFC 3986 constraints form their
    own sentence with xRegistry as the stated subject.
  • §3 digest — the two obligations separated into one sentence each.
  • Six further run-on sentences split in §1.2, §1.3, §4.4, §5.3, §5.5, §5.6.

Every split keeps the subject the source already stated, and preserves causal
and ordering cues with an equivalent connective rather than dropping them.

Protected-meaning result, stated honestly

The comparison against the original reports missing 22, added 29,
specified 1, disposition unresolved.

missing/added are re-segmentation artifacts. The claim extractor keys a
claim on a word-bag of its whole sentence, so splitting one sentence retires the
long claim and registers the shorter ones. Each pair was checked by hand and
carries the same obligation, actor and modality. Two are genuine clarity gains:
xRegistry also constrains… now states its subject, and they were derived
became the types were derived.

specified 1 is an authorized delta, not an accident:

actor specified: use assigned to 'consumer'

It comes from splitting "A Consumer … MUST verify it and MUST NOT use an
artifact whose digest does not match" into two sentences. The actor is the same
sentence's own subject — "A Consumer that has retrieved an artifact for which a
digest is declared" — so no obligation changed holder. This was put to the
editor as its own decision and approved with the noun repeated rather than a
pronoun.

Two candidate edits were rejected during the session for changing meaning:
naming an actor to satisfy the passive/agency rules, and rewriting the Abstract's
allows the storage… of into stores, manages, discovers and federates.

Residue — 28 findings retained by editor decision

Rule Count Reason
LING-NOMINALIZATION-001 9 Domain vocabulary: composition (USD composition arcs), dependency closure (a bolded defined term in §1.1), provenance, authentication, authorization, Section
LING-COMPOUND-DEPTH-001 6 Markdown link anchors read as hyphenated compounds; fixing breaks the table of contents
LING-PUNCTUATION-001 6 Markdown link parentheses and extension glosses such as (`.usda`, `.usdc`, `.usd`)
LING-ABBREVIATION-001 4 OPC/UA are the standards body's own names; MUST/SHALL/MAY/REQUIRED are mandated RFC 2119 boilerplate; USD is the spec's subject
LING-LIST-001 3 Line 200 is RFC 2119 boilerplate requiring byte-identical wording; line 489 is the normative assetkind enum value list

Remaining sub-floor blocks: 80.97, 81.69, 82.77.

This does not pass the policy

Final review: exit code 1, accepted: false, HRI 4.21 against a floor of 85.
The gap is a property of applying a plain-language policy to a normative
specification, not an editable defect. Editor acceptance of the residue is not a
Lingity pass, and this PR does not claim one.

Validation

  • tools/verify.py . — succeeded, 51 files.
  • pytest workingdrafts/models/openusd — 1 passed.
  • git diff --check — clean; LF endings preserved, 0 CR bytes.
  • Both commits signed off (DCO).

Update — actor naming (commit dde0bed)

A follow-up interactive session asked which actors this specification
specifies, how they are named, and whether better names exist.

What the audit found. No actor was defined anywhere. §2.1 declared no
capitalization convention and §2.2 defined only things. Eight roles were in
use, inconsistently:

Role Spellings Count Bore a MUST
Consumer Consumer / consumer 23 / 9 capitalized only
Producer Producer 4 yes, §5.1.1 only
publisher publisher 4 never
implementation implementation 12 yes, 8 of them
client client 1 MAY
resolver 3 surface forms 10 never directly

Consumer and Producer were capitalized like defined roles, while
implementation — carrying more obligations than Producer — was not.

Changes. Added §2.2.4 defining Consumer and Producer and stating the
capitalization convention; normalized the 9 lowercase consumer; renamed the 4
publisher to Producer; changed the single client to Consumer. The author
confirmed publisher and Producer name the same party — §5.1.1 had placed
Producer and implementation MUSTs five lines apart, which the text alone did
not resolve.

Three obligations gained an actor, each supported by surrounding text:

§ Before After
4.1 "a collision MUST be rejected" "An implementation MUST reject a case-insensitive collision"
4.5.5 "it MUST be published" "a Producer MUST publish it"
5.1.1 "Inconsistent bindings MUST be rejected" "A Producer MUST reject inconsistent bindings"

Measured:

Before After
LING-AGENCY-001 12 9
LING-PASSIVE-001 68 65
Actor-rule total 104 94
Defects 419 416
Mean block HRI 97.25 97.33
Blocks scoring 100 97 99

The composite document score moved 4.21 → 4.09 while every block measure
improved; that number is dominated by the 28 unchanged high-severity residue
findings and does not track this work.

protected_delta reports specified: 2 — reject assigned to 'implementation'
and reject assigned to 'producer'. Both were explicitly authorized, and both
actors come from surrounding text rather than invention.

Still open — not resolved. Three obligations keep no actor because the source
does not determine one: §1.3 "a usdassetid MUST NOT be derived from the
artifact's bytes" (by whom?), §1.3 "an xid … MUST NOT be used as an asset
identifier" (by whom?), and §5.1.1 "Metadata acquisition … MUST be explicitly
authorized" (by whom?). implementation also remains lowercase and undefined
while carrying 8 obligations, by author decision.

Keep only the wording edits whose Lingity protected_delta stays
equivalent with zero missing, added, specified and unresolved
elements, and whose replacement is genuinely better English.

Lingity architecture-review 1.3.0 is unchanged by these edits:
HRI 3.30, 449 defects, 49 high-severity findings, 11 substantive
blocks below the 85 floor. The remaining defects are dominated by
LING-PASSIVE-001, LING-ACTOR-001 and LING-AGENCY-001, which require
naming an actor the specification does not name. Every such rewrite
trips protected_delta, so the floor is unreachable without changing
normative claims.

Signed-off-by: Marc Schier <marcschier@hotmail.com>
Apply nine editor-approved readability repairs from an interactive
Lingity editing session. Every split keeps the subject the source already
stated, and causal and ordering cues are preserved with an equivalent
connective rather than dropped.

Main repairs:
- Turn the four-way "discoverable / verifiable / versioned / federatable"
  enumeration into a list, restating the subject so it stays bound.
- Split the Abstract at the em-dash and drop "in order to". The enabling
  verb "allows" is kept, so the registry is not newly asserted to perform
  storage, discovery and federation itself.
- Split the asset-resolution procedure, keeping the validate-then-retrieve
  ordering explicit with "only after that validation".
- Split the xid definition so the RFC 3986 constraints form their own
  sentence with xRegistry as the stated subject.
- Separate the two digest obligations into one sentence each.
- Split six further run-on sentences in 1.2, 1.3, 4.4, 5.3, 5.5 and 5.6.

Lingity architecture-review 1.3.0, measured against the pre-edit bytes:

  document HRI     3.30 -> 4.21
  violations         61 -> 32
  defects           449 -> 419
  high severity      49 -> 28
  blocks below 85    11 -> 3
  lowest block    73.07 -> 80.97

The comparison against the original reports missing 22 and added 29.
Those are re-segmentation artifacts: the claim extractor keys a claim on
a word-bag of its whole sentence, so splitting one sentence retires the
long claim and registers the shorter ones. Each pair was checked by hand.

It reports specified 1, "actor specified: use assigned to 'consumer'",
from splitting "MUST verify it and MUST NOT use ..." into two sentences.
The actor is the same sentence's own subject, "A Consumer that has
retrieved an artifact for which a digest is declared", so no obligation
changed holder. This delta was explicitly authorized by the editor.

Twenty-eight findings are retained by editor decision. They are dominated
by the mandated RFC 2119 boilerplate, by Markdown link anchors counted as
hyphenated compounds or parentheticals, by OPC, UA and USD read as
undefined acronyms, and by defined domain terms such as "dependency
closure". The HRI 85 floor is not reachable on a normative specification
without altering what it requires.

Signed-off-by: Marc Schier <marcschier@hotmail.com>
@marcschier marcschier changed the title docs(openusd): apply the meaning-equivalent readability edits docs(openusd): restructure run-on requirement prose Sep 22, 2026
Name the actors consistently. The specification placed obligations on
Consumer, Producer and implementation without defining any of them, and
spelled the same role two ways.

- Add 2.2.4 defining Consumer as the party that retrieves and composes
  artifacts and Producer as the party that publishes them, and state that
  capitalized role names denote defined roles.
- Normalize the nine lowercase "consumer" uses to Consumer. No genuinely
  generic use existed; the split ran along normative versus narrative
  text without ever being declared.
- Rename the four "publisher" uses to Producer. The editor confirmed
  these name the same party as the Producer of 5.1.1, which previously
  appeared in that subsection alone.
- Change the single "client" in 1.2 to Consumer.

Give three obligations an actor, each supported by its surrounding text:

- 4.1  "a collision MUST be rejected"      -> "An implementation MUST
       reject a case-insensitive collision", matching the parallel rule
       later in the same section.
- 4.5.5 "it MUST be published"             -> "a Producer MUST publish it".
- 5.1.1 "Inconsistent bindings MUST be     -> "A Producer MUST reject
       rejected"                              inconsistent bindings".

Lingity architecture-review 1.3.0, measured against the pre-edit bytes:

  LING-AGENCY-001     12 -> 9
  LING-PASSIVE-001    68 -> 65
  actor-rule total   104 -> 94
  defects            419 -> 416
  blocks             240 -> 244
  mean block HRI   97.25 -> 97.33
  blocks scoring 100  97 -> 99

The composite document score moved 4.21 -> 4.09 while every block measure
improved. That number is dominated by the 28 unchanged high-severity
residue findings and does not track this work. Three rules rose by one
each: REDUNDANCY from repeating the role names, and ABBREVIATION and
COMPOUND-DEPTH from the new heading and its anchor.

protected_delta reports specified 2, "reject assigned to 'implementation'"
and "reject assigned to 'producer'". Both were authorized explicitly, and
both actors come from the surrounding text rather than from invention.

Three obligations keep no actor because the source does not determine one,
and they remain open rather than resolved: a usdassetid MUST NOT be derived
from the artifact's bytes, an xid MUST NOT be used as an asset identifier,
and metadata acquisition MUST be explicitly authorized. The inherited
xRegistry 2.1 boilerplate is left untouched.

Signed-off-by: Marc Schier <marcschier@hotmail.com>
@marcschier

Copy link
Copy Markdown
Owner Author

Superseded — folded into xregistry#571 instead of shipping as a separate PR.

All three commits are now in that PR, rebased onto the fork's main (which is xregistry#571's head) as 3db72c4, b5c9abc, cf9f4a0. The rebased blob is byte-identical to what was reviewed here (70e63bce5ed6ca4582d0e1df816776b6156efa25), so nothing was lost in the move.

An upstream PR against xregistry/spec:main was attempted first and abandoned deliberately: upstream's copy of workingdrafts/models/openusd/spec.md is 854 lines against this branch's 964, because xregistry#571 still carries unmerged content for that file. Cherry-picking produced conflicts, and a three-way apply left five conflict regions, one spanning about 100 lines. Reconstructing the edits against upstream's older text would have produced a different change than the one measured, and would then have collided with xregistry#571 on the same file.

Closing without merging. No work is lost.

@marcschier marcschier closed this Sep 22, 2026
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