diff --git a/generated/PR_TBox_Rulebook.md b/generated/PR_TBox_Rulebook.md
index e79eadd..cce46ba 100644
--- a/generated/PR_TBox_Rulebook.md
+++ b/generated/PR_TBox_Rulebook.md
@@ -1,6 +1,6 @@
# Pernod Ricard Data MetaModel — T-Box Rulebook
-**Version 1.2** — Draft for review — generated 2026-08-03
+**Version 1.4** — Draft for review — generated 2026-08-03
> Generated from `rules.yaml`. Do not edit this document: edit the source and regenerate (EV-007, EV-008).
@@ -188,7 +188,7 @@ The IRI is identity. It is immutable in the RDF sense — changing one is a migr
## TN-009 — A relation begins with a verb
-**Statement.** The local name of an object property begins with a verb, in lower case. Both the active form and the passive or participial form are admitted: a past participle is a verb in first position. No relation begins with a preposition or with a noun.
+**Statement.** The local name of an object property begins with a verb, in lower case. Both the active form and the passive or participial form are admitted: a past participle is a verb in first position. An adverb qualifying that verb is transparent and may precede it. No relation begins with a preposition or with a noun.
| | |
|---|---|
@@ -198,12 +198,12 @@ The IRI is identity. It is immutable in the RDF sense — changing one is a migr
| Executor | `check_tbox_naming.py` |
| Procedure | _pending_ |
-**Why.** A relation reads as a verb and an attribute reads as a noun. The distinction is what lets a reader tell an edge from a field without opening the declaration. The explicit clause on participial forms is required: read literally, a verb-first rule would condemn a whole family of sound relations such as computedBy, storedIn and derivedFrom.
+**Why.** A relation reads as a verb and an attribute reads as a noun. The distinction is what lets a reader tell an edge from a field without opening the declaration. Two clauses are stated rather than left implicit, because a literal reading would condemn sound relations: the participial one, which covers a whole family such as computedBy, storedIn and derivedFrom, and the adverbial one, which covers a relation whose verb is qualified rather than replaced.
| From | To | Note |
|---|---|---|
| pr:inDatabase | pr:isInDatabase | a preposition is not a verb |
-| pr:primaryLocation | pr:primarilyStoredIn | a noun is not a verb |
+| pr:primaryLocation | pr:primarilyStoredIn | a noun is not a verb; the adverb is transparent and the verb follows |
| pr:computedBy | pr:computedBy | participial form is conforming |
## TN-010 — The is prefix is either a copula or a predicate
@@ -507,7 +507,7 @@ Nothing is left to be guessed. What a term is, what it applies to, where it sits
## TN-025 — Every property declares its domain and range
-**Statement.** rdfs:domain and rdfs:range are mandatory on every property, EXCEPT where the property is deliberately polymorphic. A polymorphic property states so in its comment and has its scope declared in SHACL. Silent absence is a violation; documented absence is not.
+**Statement.** rdfs:domain and rdfs:range are mandatory on every property, EXCEPT where the property is deliberately polymorphic. A polymorphic property declares pr:polymorphic true and has its scope declared in SHACL. Silent absence is a violation; declared absence is not.
| | |
|---|---|
@@ -517,30 +517,31 @@ Nothing is left to be guessed. What a term is, what it applies to, where it sits
| Executor | `check_tbox_naming.py` |
| Procedure | _pending_ |
-**Why.** A property with no domain cannot be targeted by any control. But some properties are polymorphic by design, their scope controlled class by class in SHACL rather than by twin properties; giving those an rdfs:domain would trigger the RDFS retyping described in TN-028. The rule therefore separates the two cases rather than demanding a domain everywhere.
+**Why.** A property with no domain cannot be targeted by any control. But some properties are polymorphic by design, their scope controlled class by class in SHACL rather than by twin properties; giving those an rdfs:domain would trigger the RDFS retyping described in TN-028. The rule therefore separates the two cases rather than demanding a domain everywhere. The distinction is carried by an axiom and not by a sentence in the comment: a checker looking for a phrase in prose fails the moment someone words it differently, and what matters is declared rather than read, exactly as for abstractness.
| From | To | Note |
|---|---|---|
-| a polymorphic property with no domain and no comment | violation | silence is indistinguishable from omission |
-| a polymorphic property with no domain | conforming | scope declared in SHACL |
+| a property with no domain and no declaration | violation | silence is indistinguishable from omission |
+| a property with no domain, declaring pr:polymorphic true | conforming | scope declared in SHACL |
-## TN-026 — Every term declares how it was authored
+## TN-026 — Every concrete class declares how its instances are produced
-**Statement.** pr:authoringMode is mandatory on every term. pr:harvestSource is mandatory if and only if the mode is HARVESTED.
+**Statement.** Every CONCRETE CLASS declares pr:authoringMode, stating whether its instances are ASSERTED by governance or HARVESTED from a system. pr:harvestSource is mandatory if and only if the mode is HARVESTED. The declared mode agrees with the provenance axis the class descends from: a class under CapturedObject declares HARVESTED, one under DefinedObject declares ASSERTED. Nothing else carries the property: not an abstract class, not a property, not a term of the vocabulary in its own right.
| | |
|---|---|
| Severity | **BLOCKING** |
-| Applies to | class, object_property, datatype_property, annotation_property |
+| Applies to | class |
| Enforced at | script |
| Executor | `check_tbox_naming.py` |
| Procedure | _pending_ |
-**Why.** Provenance decides who may edit a term and what a divergence means. A term stating where its data comes from without stating that it is harvested, or declaring itself harvested without naming a source, is half-declared in a way no control can catch. Declared symmetrically, provenance also makes a harvester specifiable from the model itself rather than from a side document.
+**Why.** A term of the vocabulary is declared, always and by definition; recording that on every term would repeat one fact a hundred times and say nothing. It is the INSTANCES that have a provenance, and the class is where the model states which one: a governance object is asserted by a domain, a physical column is harvested from a system. The distinction matters because a class can be declared and describe captured things at once — CapturedObject itself is a declared term naming harvested instances, and conflating the two is what once put a harvesting mode on an abstraction. Nothing is inherited. A subclass declares its own mode rather than taking its parent's, so that the declaration is read where the instances are typed and not chased up a chain. The agreement clause is what keeps that free of contradiction: the axis says what kind of thing the class describes, the mode says how those things arrive, and a class under CapturedObject declaring ASSERTED is stating both at once. Declared this way, provenance also makes a harvester specifiable from the model itself rather than from a side document.
| From | To | Note |
|---|---|---|
-| harvestSource present | authoringMode HARVESTED | |
+| authoringMode on an abstract class | nothing | an abstraction has no instances to produce |
+| a class under CapturedObject declaring ASSERTED | violation | the mode contradicts the axis |
| authoringMode HARVESTED, harvestSource absent | harvestSource declared | |
## TN-027 — A concrete class has one layer and one provenance
diff --git a/generated/PR_TBox_Rulebook.xlsx b/generated/PR_TBox_Rulebook.xlsx
index d8b951f..cfc7d3e 100644
Binary files a/generated/PR_TBox_Rulebook.xlsx and b/generated/PR_TBox_Rulebook.xlsx differ
diff --git a/generated/pr_metamodel_viewer.html b/generated/pr_metamodel_viewer.html
index c901f38..c4a605d 100644
--- a/generated/pr_metamodel_viewer.html
+++ b/generated/pr_metamodel_viewer.html
@@ -204,7 +204,7 @@ footer{background:var(--navy);color:rgba(255,255,255,.5);padding:7px 20px;