@mindflight/mindbrain-personal-studio 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +16 -8
  2. package/build/client/_app/immutable/chunks/{D0UIlUGZ.js → CIErFlYG.js} +1 -1
  3. package/build/client/_app/immutable/chunks/CIErFlYG.js.br +0 -0
  4. package/build/client/_app/immutable/chunks/CIErFlYG.js.gz +0 -0
  5. package/build/client/_app/immutable/entry/{app.CR-imLox.js → app.mURYm8o_.js} +2 -2
  6. package/build/client/_app/immutable/entry/app.mURYm8o_.js.br +0 -0
  7. package/build/client/_app/immutable/entry/app.mURYm8o_.js.gz +0 -0
  8. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js +1 -0
  9. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.br +2 -0
  10. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.gz +0 -0
  11. package/build/client/_app/immutable/nodes/{1.CTEedoSY.js → 1.DHKtMeFI.js} +1 -1
  12. package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.br +1 -0
  13. package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.gz +0 -0
  14. package/build/client/_app/version.json +1 -1
  15. package/build/client/_app/version.json.br +0 -0
  16. package/build/client/_app/version.json.gz +0 -0
  17. package/build/handler.js +4 -4
  18. package/build/index.js +4 -4
  19. package/build/server/chunks/chunks/{internal.js-WOmQXGMa.js → internal.js-C3tV0XXj.js} +2 -2
  20. package/build/server/chunks/chunks/{internal.js-WOmQXGMa.js.map → internal.js-C3tV0XXj.js.map} +1 -1
  21. package/build/server/chunks/{handler-BIDedSZq.js → handler-DlaCCnxx.js} +3 -3
  22. package/build/server/chunks/{handler-BIDedSZq.js.map → handler-DlaCCnxx.js.map} +1 -1
  23. package/build/server/chunks/{index.js-YVPJa0so.js → index.js-BGfKWHak.js} +2 -2
  24. package/build/server/chunks/{index.js-YVPJa0so.js.map → index.js-BGfKWHak.js.map} +1 -1
  25. package/build/server/chunks/{manifest.js-aGRKuiqF.js → manifest.js-CnmaNf5D.js} +3 -3
  26. package/build/server/chunks/{manifest.js-aGRKuiqF.js.map → manifest.js-CnmaNf5D.js.map} +1 -1
  27. package/build/server/chunks/nodes/{1.js-Dhh3ErZY.js → 1.js-BypjwBYB.js} +2 -2
  28. package/build/server/chunks/nodes/{1.js-Dhh3ErZY.js.map → 1.js-BypjwBYB.js.map} +1 -1
  29. package/examples/immeuble/ACCEPTANCE.yaml +82 -0
  30. package/examples/immeuble/BIM_LITE.md +15 -0
  31. package/examples/immeuble/CHECKLIST.md +128 -0
  32. package/examples/immeuble/README.md +121 -0
  33. package/examples/immeuble/bundle/immeuble.bundle.json +22786 -0
  34. package/examples/immeuble/contracts/answer_artifacts.seed.jsonl +34 -0
  35. package/examples/immeuble/contracts/business_capabilities.seed.jsonl +25 -0
  36. package/examples/immeuble/contracts/consumer_contract.yaml +131 -0
  37. package/examples/immeuble/contracts/immeuble_structured_import_model.json +310 -0
  38. package/examples/immeuble/contracts/mapping_external_to_canonical.json +375 -0
  39. package/examples/immeuble/contracts/mapping_external_to_canonical.yaml +55 -0
  40. package/examples/immeuble/contracts/mapping_external_to_canonical_ws.json +65 -0
  41. package/examples/immeuble/contracts/model_contract.json +943 -0
  42. package/examples/immeuble/contracts/projection_catalog.yaml +366 -0
  43. package/examples/immeuble/contracts/scenarios.yaml +27 -0
  44. package/examples/immeuble/contracts/semantic_proposal.golden.json +1 -0
  45. package/examples/immeuble/contracts/source_profile.yaml +38 -0
  46. package/examples/immeuble/fake_data/DeltaFinding.csv +20 -0
  47. package/examples/immeuble/fake_data/ProjectionResult.csv +13 -0
  48. package/examples/immeuble/fake_data/ag_meeting.csv +4 -0
  49. package/examples/immeuble/fake_data/agenda_item.csv +4 -0
  50. package/examples/immeuble/fake_data/architect.csv +3 -0
  51. package/examples/immeuble/fake_data/architecture_firm.csv +2 -0
  52. package/examples/immeuble/fake_data/bank_account.csv +3 -0
  53. package/examples/immeuble/fake_data/billing_group.csv +41 -0
  54. package/examples/immeuble/fake_data/block.csv +10 -0
  55. package/examples/immeuble/fake_data/budget_line.csv +3 -0
  56. package/examples/immeuble/fake_data/building.csv +6 -0
  57. package/examples/immeuble/fake_data/cellar.csv +41 -0
  58. package/examples/immeuble/fake_data/change_order.csv +2 -0
  59. package/examples/immeuble/fake_data/charge_call.csv +58 -0
  60. package/examples/immeuble/fake_data/claim.csv +4 -0
  61. package/examples/immeuble/fake_data/coda_entry.csv +49 -0
  62. package/examples/immeuble/fake_data/compliance_certificate.csv +10 -0
  63. package/examples/immeuble/fake_data/contractor.csv +4 -0
  64. package/examples/immeuble/fake_data/decision.csv +5 -0
  65. package/examples/immeuble/fake_data/defect_reserve.csv +3 -0
  66. package/examples/immeuble/fake_data/household.csv +41 -0
  67. package/examples/immeuble/fake_data/inspection.csv +3 -0
  68. package/examples/immeuble/fake_data/insurance_policy.csv +4 -0
  69. package/examples/immeuble/fake_data/intervention.csv +13 -0
  70. package/examples/immeuble/fake_data/invoice.csv +3 -0
  71. package/examples/immeuble/fake_data/lease_contract.csv +12 -0
  72. package/examples/immeuble/fake_data/maintenance_ticket.csv +13 -0
  73. package/examples/immeuble/fake_data/meter.csv +4 -0
  74. package/examples/immeuble/fake_data/meter_reading.csv +19 -0
  75. package/examples/immeuble/fake_data/milestone.csv +3 -0
  76. package/examples/immeuble/fake_data/organization.csv +12 -0
  77. package/examples/immeuble/fake_data/parking_space.csv +8 -0
  78. package/examples/immeuble/fake_data/permit.csv +3 -0
  79. package/examples/immeuble/fake_data/person.csv +85 -0
  80. package/examples/immeuble/fake_data/private_garden.csv +7 -0
  81. package/examples/immeuble/fake_data/progress_event.csv +2 -0
  82. package/examples/immeuble/fake_data/quote.csv +3 -0
  83. package/examples/immeuble/fake_data/receipt.csv +2 -0
  84. package/examples/immeuble/fake_data/reminder.csv +11 -0
  85. package/examples/immeuble/fake_data/service_contract.csv +4 -0
  86. package/examples/immeuble/fake_data/shared_equipment.csv +8 -0
  87. package/examples/immeuble/fake_data/shared_space.csv +10 -0
  88. package/examples/immeuble/fake_data/unit.csv +41 -0
  89. package/examples/immeuble/fake_data/work_package.csv +4 -0
  90. package/examples/immeuble/fake_data/worksite_project.csv +3 -0
  91. package/examples/immeuble/gap-rules/L0-patrimoine.json +57 -0
  92. package/examples/immeuble/gap-rules/L1-syndic-naive.json +36 -0
  93. package/examples/immeuble/gap-rules/L1-syndic.json +61 -0
  94. package/examples/immeuble/gap-rules/L2-chantier.json +87 -0
  95. package/examples/immeuble/gap-rules/L2-exploitation.json +87 -0
  96. package/examples/immeuble/gap-rules/L2-finance.json +48 -0
  97. package/examples/immeuble/gap-rules/L2-maintenance.json +107 -0
  98. package/examples/immeuble/gap-rules/L2-syndic-filtered.json +39 -0
  99. package/examples/immeuble/gap-rules/L3-full.json +332 -0
  100. package/examples/immeuble/gap-rules/closed-world-contract.md +76 -0
  101. package/examples/immeuble/gap-rules/demo.json +51 -0
  102. package/examples/immeuble/gap-rules/expected-findings.yaml +100 -0
  103. package/examples/immeuble/gap-rules/gap-scenarios.yaml +79 -0
  104. package/examples/immeuble/gap-rules/motifs.json +38 -0
  105. package/examples/immeuble/gap-rules/syndic.json +40 -0
  106. package/examples/immeuble/import_manifest.yaml +25 -0
  107. package/examples/immeuble/import_ready/graph_edges_import.csv +848 -0
  108. package/examples/immeuble/import_ready/mfo_facets_import.csv +559 -0
  109. package/examples/immeuble/index.md +140 -0
  110. package/examples/immeuble/model/immeuble_model.json +418 -0
  111. package/examples/immeuble/reports/01-model.validation.json +56 -0
  112. package/examples/immeuble/reports/02-mapping.validation.json +9 -0
  113. package/examples/immeuble/reports/acceptance.validation.json +161 -0
  114. package/examples/immeuble/reports/consumer_contract.validation.json +162 -0
  115. package/examples/immeuble/reports/graph_edges.jsonl +847 -0
  116. package/examples/immeuble/reports/graph_nodes.jsonl +558 -0
  117. package/examples/immeuble/reports/hybrid-compare.json +144 -0
  118. package/examples/immeuble/reports/immeuble-import-scenario.json +233 -0
  119. package/examples/immeuble/reports/live-artifacts-refresh.validation.json +51 -0
  120. package/examples/immeuble/reports/pipeline_audit.json +59 -0
  121. package/examples/immeuble/reports/projection_audit.json +69 -0
  122. package/examples/immeuble/reports/projection_audit_immeuble.json +257 -0
  123. package/examples/immeuble/reports/projection_audit_immeuble.md +122 -0
  124. package/examples/immeuble/reports/projection_candidates.json +1596 -0
  125. package/examples/immeuble/reports/projection_candidates.md +117 -0
  126. package/examples/immeuble/reports/projection_model_validation.md +115 -0
  127. package/examples/immeuble/reports/reindex.json +4 -0
  128. package/examples/immeuble/reports/reset-immeuble-workspace.json +32 -0
  129. package/examples/immeuble/reports/schema-id-prefix-check.json +5 -0
  130. package/examples/immeuble/scripts/audit-immeuble-projections.mjs +254 -0
  131. package/examples/immeuble/scripts/build-immeuble-model.mjs +308 -0
  132. package/examples/immeuble/scripts/compare-immeuble-snapshots.sh +227 -0
  133. package/examples/immeuble/scripts/enrich-immeuble-demo.mjs +1135 -0
  134. package/examples/immeuble/scripts/reset-immeuble-workspace.mjs +139 -0
  135. package/examples/immeuble/scripts/run-immeuble-backend.sh +164 -0
  136. package/examples/immeuble/scripts/run-immeuble-import.mjs +232 -0
  137. package/examples/immeuble/scripts/run-immeuble-live-lab.sh +439 -0
  138. package/examples/immeuble/scripts/seed-immeuble-gap-rules.mjs +69 -0
  139. package/examples/immeuble/scripts/start-immeuble-demo.sh +52 -0
  140. package/examples/immeuble/scripts/starterkit/analysis-lenses.mjs +181 -0
  141. package/examples/immeuble/scripts/starterkit/analyze-projection-candidates.mjs +714 -0
  142. package/examples/immeuble/scripts/starterkit/audit-ghostcrab-projections.mjs +674 -0
  143. package/examples/immeuble/scripts/starterkit/facet-prefix.mjs +166 -0
  144. package/examples/immeuble/scripts/starterkit/sqlite-utils.mjs +131 -0
  145. package/examples/immeuble/scripts/verify-immeuble-acceptance.mjs +284 -0
  146. package/examples/immeuble/scripts/verify-immeuble-live-artifacts.mjs +140 -0
  147. package/examples/immeuble/scripts/yaml-lite.mjs +96 -0
  148. package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites-immo-mcp.md +161 -0
  149. package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites.md +39 -0
  150. package/examples/immeuble/sources/agent-prompts/prompts/01-discovery-and-model-proposal.md +42 -0
  151. package/examples/immeuble/sources/agent-prompts/prompts/02-ontology-register.md +44 -0
  152. package/examples/immeuble/sources/agent-prompts/prompts/03-gap-rules-design.md +44 -0
  153. package/examples/immeuble/sources/agent-prompts/prompts/04-document-ingest.md +40 -0
  154. package/examples/immeuble/sources/agent-prompts/prompts/05-graph-extraction.md +44 -0
  155. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-immo-mcp.md +109 -0
  156. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-test-immo-mcp3.md +30 -0
  157. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare.md +63 -0
  158. package/examples/immeuble/sources/checklists/gap-rules-checklist.md +42 -0
  159. package/examples/immeuble/sources/checklists/ontology-checklist.md +54 -0
  160. package/examples/immeuble/sources/documents/README.md +42 -0
  161. package/examples/immeuble/sources/documents/annexes-caves-garages-jardins.md +8 -0
  162. package/examples/immeuble/sources/documents/annexes-jardins-garages.md +1 -0
  163. package/examples/immeuble/sources/documents/baux-erables.md +1 -0
  164. package/examples/immeuble/sources/documents/baux-locatifs.md +11 -0
  165. package/examples/immeuble/sources/documents/coda-janvier-2026.md +10 -0
  166. package/examples/immeuble/sources/documents/composition-menages.md +1 -0
  167. package/examples/immeuble/sources/documents/composition-occupants.md +18 -0
  168. package/examples/immeuble/sources/documents/expected-coverage.json +70 -0
  169. package/examples/immeuble/sources/documents/extrait-coda-janvier-2026.md +1 -0
  170. package/examples/immeuble/sources/documents/groupes-facturation.md +30 -0
  171. package/examples/immeuble/sources/documents/manifest.json +79 -0
  172. package/examples/immeuble/sources/documents/note-architecte-chantier-erables.md +3 -0
  173. package/examples/immeuble/sources/documents/permis-urbanisme-erables.md +3 -0
  174. package/examples/immeuble/sources/documents/procedures-operationnelles.md +3 -0
  175. package/examples/immeuble/sources/documents/pv-ag-budget-2026.md +1 -0
  176. package/examples/immeuble/sources/documents/pv-reception-reserves-erables.md +3 -0
  177. package/examples/immeuble/sources/documents/registre-coproprietaires.md +24 -0
  178. package/examples/immeuble/sources/documents/reglement-copropriete-tilleuls.md +1 -0
  179. package/examples/immeuble/sources/documents/statuts-erables.md +22 -0
  180. package/examples/immeuble/sources/documents/statuts-tilleuls.md +19 -0
  181. package/examples/immeuble/sources/documents/succession-jean-dupont.md +3 -0
  182. package/examples/immeuble/sources/documents/titre-propriete-tilleuls-a3.md +1 -0
  183. package/examples/immeuble/sources/documents/trous-pedagogiques.md +3 -0
  184. package/examples/immeuble/sources/ontology/README.md +1 -0
  185. package/examples/immeuble/sources/ontology/core.yaml +444 -0
  186. package/examples/immeuble/success-criteria.yaml +35 -0
  187. package/fixtures/immeuble-demo.sqlite +0 -0
  188. package/package.json +11 -2
  189. package/scripts/lib/sqlite-runtime.mjs +1 -1
  190. package/scripts/load-immeuble-demo.sh +103 -0
  191. package/scripts/seed-immeuble-projections.mjs +75 -148
  192. package/scripts/verify-immeuble-demo-sources.mjs +93 -0
  193. package/scripts/verify-immeuble-demo.mjs +69 -0
  194. package/build/client/_app/immutable/chunks/D0UIlUGZ.js.br +0 -0
  195. package/build/client/_app/immutable/chunks/D0UIlUGZ.js.gz +0 -0
  196. package/build/client/_app/immutable/entry/app.CR-imLox.js.br +0 -0
  197. package/build/client/_app/immutable/entry/app.CR-imLox.js.gz +0 -0
  198. package/build/client/_app/immutable/entry/start.DV-AjeAB.js +0 -1
  199. package/build/client/_app/immutable/entry/start.DV-AjeAB.js.br +0 -2
  200. package/build/client/_app/immutable/entry/start.DV-AjeAB.js.gz +0 -0
  201. package/build/client/_app/immutable/nodes/1.CTEedoSY.js.br +0 -0
  202. package/build/client/_app/immutable/nodes/1.CTEedoSY.js.gz +0 -0
@@ -0,0 +1,332 @@
1
+ {
2
+ "ontology_id": "immeuble::core",
3
+ "workspace_id": "immeuble",
4
+ "replace": true,
5
+ "rules": [
6
+ {
7
+ "rule_id": "unit-one-cellar",
8
+ "entity_type": "unit",
9
+ "relation_type": "assigned_cellar",
10
+ "direction": "out",
11
+ "target_entity_type": "cellar",
12
+ "min_count": 1,
13
+ "severity": "error",
14
+ "label": "Chaque lot doit avoir une cave assignee"
15
+ },
16
+ {
17
+ "rule_id": "unit-in-building",
18
+ "entity_type": "unit",
19
+ "relation_type": "contains",
20
+ "direction": "in",
21
+ "target_entity_type": null,
22
+ "min_count": 1,
23
+ "severity": "error",
24
+ "label": "Chaque lot doit etre rattache a un immeuble ou bloc"
25
+ },
26
+ {
27
+ "rule_id": "building-has-block",
28
+ "entity_type": "building",
29
+ "relation_type": "contains",
30
+ "direction": "out",
31
+ "target_entity_type": "block",
32
+ "min_count": 1,
33
+ "severity": "error",
34
+ "label": "Chaque immeuble doit contenir au moins un bloc"
35
+ },
36
+ {
37
+ "rule_id": "building-has-shared-space",
38
+ "entity_type": "building",
39
+ "relation_type": "contains",
40
+ "direction": "out",
41
+ "target_entity_type": "shared_space",
42
+ "min_count": 1,
43
+ "severity": "warning",
44
+ "label": "Chaque immeuble doit declarer au moins une partie commune"
45
+ },
46
+ {
47
+ "rule_id": "meter-measures-asset",
48
+ "entity_type": "meter",
49
+ "relation_type": "measures_asset",
50
+ "direction": "out",
51
+ "target_entity_type": null,
52
+ "min_count": 1,
53
+ "severity": "warning",
54
+ "label": "Chaque compteur doit mesurer un asset"
55
+ },
56
+ {
57
+ "rule_id": "unit-has-owner",
58
+ "entity_type": "unit",
59
+ "relation_type": "owns",
60
+ "direction": "in",
61
+ "target_entity_type": null,
62
+ "min_count": 1,
63
+ "severity": "error",
64
+ "label": "Chaque lot actif doit avoir un coproprietaire",
65
+ "metadata_json": "{\"entity_filter\":{\"metadata\":{\"usage_status\":{\"not_one_of\":[\"vacant_works\",\"vacant\"]}}}}"
66
+ },
67
+ {
68
+ "rule_id": "occupied-unit-has-occupant",
69
+ "entity_type": "unit",
70
+ "relation_type": "occupies",
71
+ "direction": "in",
72
+ "target_entity_type": "person",
73
+ "min_count": 1,
74
+ "severity": "error",
75
+ "label": "Lot occupe sans occupant declare",
76
+ "metadata_json": "{\"entity_filter\":{\"metadata\":{\"usage_status\":{\"not_one_of\":[\"vacant_works\",\"vacant\"]}}}}"
77
+ },
78
+ {
79
+ "rule_id": "tenant-occupied-has-lease",
80
+ "entity_type": "unit",
81
+ "relation_type": "leases",
82
+ "direction": "in",
83
+ "target_entity_type": "lease_contract",
84
+ "min_count": 1,
85
+ "severity": "warning",
86
+ "label": "Lot loue sans contrat de bail lie",
87
+ "metadata_json": "{\"entity_filter\":{\"metadata\":{\"usage_status\":{\"one_of\":[\"tenant_occupied\",\"owner_abroad_tenant\"]}}}}"
88
+ },
89
+ {
90
+ "rule_id": "billing-group-bills-unit",
91
+ "entity_type": "unit",
92
+ "relation_type": "bills_to",
93
+ "direction": "in",
94
+ "target_entity_type": "billing_group",
95
+ "min_count": 1,
96
+ "severity": "warning",
97
+ "label": "Chaque lot actif doit avoir un groupe de facturation",
98
+ "metadata_json": "{\"entity_filter\":{\"metadata\":{\"usage_status\":{\"not_one_of\":[\"vacant_works\",\"vacant\"]}}}}"
99
+ },
100
+ {
101
+ "rule_id": "household-has-member",
102
+ "entity_type": "household",
103
+ "relation_type": "household_member",
104
+ "direction": "out",
105
+ "target_entity_type": "person",
106
+ "min_count": 1,
107
+ "severity": "warning",
108
+ "label": "Chaque menage doit avoir au moins un membre"
109
+ },
110
+ {
111
+ "rule_id": "charge-call-has-billing-group",
112
+ "entity_type": "charge_call",
113
+ "relation_type": "bills_to",
114
+ "direction": "out",
115
+ "target_entity_type": "billing_group",
116
+ "min_count": 1,
117
+ "severity": "error",
118
+ "label": "Chaque appel de charges doit cibler un groupe de facturation"
119
+ },
120
+ {
121
+ "rule_id": "matched-coda-has-charge-call",
122
+ "entity_type": "coda_entry",
123
+ "relation_type": "matched_to",
124
+ "direction": "out",
125
+ "target_entity_type": "charge_call",
126
+ "min_count": 1,
127
+ "severity": "warning",
128
+ "label": "Chaque CODA rapproche doit pointer vers un appel"
129
+ },
130
+ {
131
+ "rule_id": "open-charge-has-reminder",
132
+ "entity_type": "charge_call",
133
+ "relation_type": "triggered",
134
+ "direction": "out",
135
+ "target_entity_type": "reminder",
136
+ "min_count": 1,
137
+ "severity": "warning",
138
+ "label": "Un appel ouvert doit declencher une relance",
139
+ "metadata_json": "{\"entity_filter\":{\"metadata\":{\"status\":{\"one_of\":[\"open\",\"overdue\"]}}}}"
140
+ },
141
+ {
142
+ "rule_id": "reminder-has-charge-source",
143
+ "entity_type": "reminder",
144
+ "relation_type": "triggered",
145
+ "direction": "in",
146
+ "target_entity_type": "charge_call",
147
+ "min_count": 1,
148
+ "severity": "warning",
149
+ "label": "Chaque relance doit provenir d'un appel ouvert"
150
+ },
151
+ {
152
+ "rule_id": "service-contract-covers-asset",
153
+ "entity_type": "service_contract",
154
+ "relation_type": "covers_asset",
155
+ "direction": "out",
156
+ "target_entity_type": null,
157
+ "min_count": 1,
158
+ "severity": "error",
159
+ "label": "Chaque contrat de maintenance doit couvrir un asset"
160
+ },
161
+ {
162
+ "rule_id": "service-contract-has-provider",
163
+ "entity_type": "service_contract",
164
+ "relation_type": "provided_by",
165
+ "direction": "out",
166
+ "target_entity_type": "organization",
167
+ "min_count": 1,
168
+ "severity": "error",
169
+ "label": "Chaque contrat de maintenance doit avoir un prestataire"
170
+ },
171
+ {
172
+ "rule_id": "ticket-concerns-asset",
173
+ "entity_type": "maintenance_ticket",
174
+ "relation_type": "concerns_asset",
175
+ "direction": "out",
176
+ "target_entity_type": null,
177
+ "min_count": 1,
178
+ "severity": "warning",
179
+ "label": "Chaque ticket doit concerner un asset"
180
+ },
181
+ {
182
+ "rule_id": "ticket-has-intervention",
183
+ "entity_type": "maintenance_ticket",
184
+ "relation_type": "has_intervention",
185
+ "direction": "out",
186
+ "target_entity_type": "intervention",
187
+ "min_count": 1,
188
+ "severity": "warning",
189
+ "label": "Chaque ticket doit avoir une intervention planifiee"
190
+ },
191
+ {
192
+ "rule_id": "intervention-has-provider",
193
+ "entity_type": "intervention",
194
+ "relation_type": "provided_by",
195
+ "direction": "out",
196
+ "target_entity_type": "organization",
197
+ "min_count": 1,
198
+ "severity": "warning",
199
+ "label": "Chaque intervention doit avoir un prestataire"
200
+ },
201
+ {
202
+ "rule_id": "claim-covered-by-policy",
203
+ "entity_type": "claim",
204
+ "relation_type": "covered_by",
205
+ "direction": "out",
206
+ "target_entity_type": "insurance_policy",
207
+ "min_count": 1,
208
+ "severity": "error",
209
+ "label": "Chaque sinistre doit etre relie a une police"
210
+ },
211
+ {
212
+ "rule_id": "certificate-certifies-asset",
213
+ "entity_type": "compliance_certificate",
214
+ "relation_type": "certifies_asset",
215
+ "direction": "out",
216
+ "target_entity_type": null,
217
+ "min_count": 1,
218
+ "severity": "error",
219
+ "label": "Chaque certificat doit certifier un asset"
220
+ },
221
+ {
222
+ "rule_id": "meter-has-recent-reading",
223
+ "entity_type": "meter",
224
+ "relation_type": "records_reading",
225
+ "direction": "out",
226
+ "target_entity_type": "meter_reading",
227
+ "min_count": 1,
228
+ "severity": "warning",
229
+ "label": "Chaque compteur doit avoir au moins un releve"
230
+ },
231
+ {
232
+ "rule_id": "ag-has-agenda-item",
233
+ "entity_type": "ag_meeting",
234
+ "relation_type": "has_agenda_item",
235
+ "direction": "out",
236
+ "target_entity_type": "agenda_item",
237
+ "min_count": 1,
238
+ "severity": "warning",
239
+ "label": "Chaque AG doit avoir un ordre du jour"
240
+ },
241
+ {
242
+ "rule_id": "agenda-item-has-decision",
243
+ "entity_type": "agenda_item",
244
+ "relation_type": "decided_by",
245
+ "direction": "out",
246
+ "target_entity_type": "decision",
247
+ "min_count": 1,
248
+ "severity": "warning",
249
+ "label": "Chaque point approuve doit avoir une decision"
250
+ },
251
+ {
252
+ "rule_id": "worksite-has-architect",
253
+ "entity_type": "worksite_project",
254
+ "relation_type": "designs_for",
255
+ "direction": "in",
256
+ "target_entity_type": "architect",
257
+ "min_count": 1,
258
+ "severity": "error",
259
+ "label": "Chaque chantier doit avoir un architecte responsable"
260
+ },
261
+ {
262
+ "rule_id": "worksite-has-work-package",
263
+ "entity_type": "worksite_project",
264
+ "relation_type": "has_work_package",
265
+ "direction": "out",
266
+ "target_entity_type": "work_package",
267
+ "min_count": 1,
268
+ "severity": "error",
269
+ "label": "Chaque chantier doit contenir au moins un lot de travaux"
270
+ },
271
+ {
272
+ "rule_id": "work-package-affects-asset",
273
+ "entity_type": "work_package",
274
+ "relation_type": "affects_asset",
275
+ "direction": "out",
276
+ "target_entity_type": null,
277
+ "min_count": 1,
278
+ "severity": "warning",
279
+ "label": "Chaque lot de travaux doit affecter au moins un asset"
280
+ },
281
+ {
282
+ "rule_id": "work-package-has-contractor",
283
+ "entity_type": "work_package",
284
+ "relation_type": "executes_work_package",
285
+ "direction": "in",
286
+ "target_entity_type": "contractor",
287
+ "min_count": 1,
288
+ "severity": "error",
289
+ "label": "Chaque lot de travaux doit etre lie a une entreprise"
290
+ },
291
+ {
292
+ "rule_id": "worksite-has-permit",
293
+ "entity_type": "worksite_project",
294
+ "relation_type": "authorized_by",
295
+ "direction": "out",
296
+ "target_entity_type": "permit",
297
+ "min_count": 1,
298
+ "severity": "warning",
299
+ "label": "Chaque chantier doit etre autorise par un permis ou une decision"
300
+ },
301
+ {
302
+ "rule_id": "worksite-has-budget-line",
303
+ "entity_type": "worksite_project",
304
+ "relation_type": "has_budget_line",
305
+ "direction": "out",
306
+ "target_entity_type": "budget_line",
307
+ "min_count": 1,
308
+ "severity": "warning",
309
+ "label": "Chaque chantier doit avoir une ligne budget"
310
+ },
311
+ {
312
+ "rule_id": "reserve-linked-to-inspection",
313
+ "entity_type": "defect_reserve",
314
+ "relation_type": "has_reserve",
315
+ "direction": "in",
316
+ "target_entity_type": "inspection",
317
+ "min_count": 1,
318
+ "severity": "error",
319
+ "label": "Chaque reserve doit etre liee a une inspection"
320
+ },
321
+ {
322
+ "rule_id": "invoice-linked-to-work-package",
323
+ "entity_type": "invoice",
324
+ "relation_type": "invoiced_by",
325
+ "direction": "in",
326
+ "target_entity_type": "work_package",
327
+ "min_count": 1,
328
+ "severity": "warning",
329
+ "label": "Chaque facture chantier doit etre rattachee a un lot de travaux"
330
+ }
331
+ ]
332
+ }
@@ -0,0 +1,76 @@
1
+ # Closed-world contract — immeuble training axioms
2
+
3
+ Human-readable mapping from ontology edges to gap rules used in the training curriculum.
4
+ Each rule expresses a **competency question** the syndic expects to answer from the graph.
5
+
6
+ Ontology: `immeuble-training::core` (same taxonomy as the narrative demo, distinct workspace IDs).
7
+
8
+ ## Track A — Data repair (rules fixed, fix graph)
9
+
10
+ | Module | Rules pack | Axiom (plain language) | Edge | Filter |
11
+ |--------|------------|------------------------|------|--------|
12
+ | A1 | `L0-patrimoine.json` | Every unit has exactly one cellar and sits in a building | `assigned_cellar`, `contains` | none |
13
+ | A2 | `L2-syndic-filtered.json` | Occupied units declare occupants; rented units declare leases | `occupies`, `leases` | exclude `vacant` / `vacant_works`; lease rule only on `tenant_occupied`, `owner_abroad_tenant` |
14
+ | A3 | same as A2 | After data fixes, syndic contract is green | — | — |
15
+
16
+ Catalogued draft defects (see `training-manifest.yaml`):
17
+
18
+ | ID | Violation | Rule |
19
+ |----|-----------|------|
20
+ | E01 | Tilleuls A1 missing `occupies` | `occupied-unit-has-occupant` |
21
+ | E02 | Five tenant units missing `leases` | `tenant-occupied-has-lease` |
22
+ | E03 | Marie Lambert isolated | native `isolated_entity` (fixed by `represents` edge in golden) |
23
+
24
+ ## Track B — Rule design (graph fixed, evolve axioms)
25
+
26
+ | Module | Rules pack | Lesson | Key change |
27
+ |--------|------------|--------|------------|
28
+ | B1 | `L1-syndic-naive.json` | Unfiltered `unit-has-owner` flags **Érables A4** (`vacant_works`) | no `entity_filter` |
29
+ | B2 | `L2-syndic-filtered.json` | Add `usage_status` filters — false positive removed | `not_one_of: [vacant_works, vacant]` |
30
+ | B3 | `L3-full.json` + `motifs.json` | Finance + structural motifs | `billing-group-bills-unit`; building→all units motif |
31
+
32
+ ## Rule reference
33
+
34
+ ### `unit-has-owner`
35
+
36
+ - **Question:** Who owns this lot?
37
+ - **Graph:** incoming `owns` from `person`
38
+ - **L1:** all units
39
+ - **L2/L3:** units where `metadata.usage_status` ∉ `{vacant, vacant_works}`
40
+
41
+ ### `occupied-unit-has-occupant`
42
+
43
+ - **Question:** Who lives in this owner-occupied lot?
44
+ - **Graph:** incoming `occupies` from `person`
45
+ - **Filter:** same vacant exclusion as owner rule
46
+
47
+ ### `tenant-occupied-has-lease`
48
+
49
+ - **Question:** Which lease contract covers this rented lot?
50
+ - **Graph:** incoming `leases` from `lease_contract`
51
+ - **Filter:** `usage_status` ∈ `{tenant_occupied, owner_abroad_tenant}`
52
+
53
+ ### `billing-group-bills-unit` (L3 only)
54
+
55
+ - **Question:** Which billing group invoices this lot?
56
+ - **Graph:** incoming `bills_to` from `billing_group`
57
+ - **Filter:** exclude vacant units
58
+
59
+ ### Patrimoine rules (L0)
60
+
61
+ - `unit-one-cellar` — outgoing `assigned_cellar` → exactly one `cellar`
62
+ - `unit-in-building` — incoming `contains` from building/block
63
+ - `garage-at-most-one-unit` — incoming `assigned_garage` cardinality ≤ 1
64
+
65
+ ### Motifs (`motifs.json`)
66
+
67
+ - **Building complete patrimoine:** building → `contains` → **all** units → cellar path (`require_all_targets: true` on the contains step)
68
+ - **Occupied unit household:** unit → occupant → person path for non-vacant units
69
+
70
+ ## Related fixtures
71
+
72
+ | Fixture | Role |
73
+ |---------|------|
74
+ | `examples/immeuble/reference/` | Immutable narrative with intentional native issues |
75
+ | `examples/immeuble/gap-rules/` | Explicit draft/golden pair for exercises |
76
+ | `ws_immeuble_scenarios` | Fast synthetic CI (see `immeuble_scenarios_test.sql`) |
@@ -0,0 +1,51 @@
1
+ {
2
+ "ontology_id": "immeuble::core",
3
+ "workspace_id": "immeuble",
4
+ "replace": true,
5
+ "rules": [
6
+ {
7
+ "rule_id": "unit-one-cellar",
8
+ "entity_type": "unit",
9
+ "relation_type": "assigned_cellar",
10
+ "direction": "out",
11
+ "target_entity_type": "cellar",
12
+ "min_count": 1,
13
+ "max_count": 1,
14
+ "severity": "error",
15
+ "label": "Chaque lot doit avoir exactement une cave assignée"
16
+ },
17
+ {
18
+ "rule_id": "unit-in-building",
19
+ "entity_type": "unit",
20
+ "relation_type": "contains",
21
+ "direction": "in",
22
+ "target_entity_type": null,
23
+ "min_count": 1,
24
+ "severity": "error",
25
+ "label": "Chaque lot doit être rattaché à un immeuble ou bloc (contains entrant)"
26
+ },
27
+ {
28
+ "rule_id": "garage-at-most-one-unit",
29
+ "entity_type": "parking_space",
30
+ "relation_type": "assigned_garage",
31
+ "direction": "in",
32
+ "target_entity_type": "unit",
33
+ "min_count": 0,
34
+ "max_count": 1,
35
+ "severity": "warning",
36
+ "label": "Un garage ne doit pas être assigné à plusieurs lots"
37
+ },
38
+ {
39
+ "rule_id": "leased-unit-has-lease",
40
+ "entity_type": "unit",
41
+ "relation_type": "leases",
42
+ "direction": "either",
43
+ "target_entity_type": "lease_contract",
44
+ "min_count": 0,
45
+ "severity": "info",
46
+ "label": "Lot loué sans contrat de bail lié (informatif si status=loué)",
47
+ "enabled": false,
48
+ "metadata_json": "{\"scenario\":\"tenant-lease\",\"note\":\"Enable when filtering rented units by facet or metadata\"}"
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,100 @@
1
+ workspace_id: immeuble
2
+ ontology_id: immeuble::core
3
+ profile: pedagogical
4
+ expected_findings:
5
+ - id: df_unit_owner_missing
6
+ rule_id: unit-has-owner
7
+ severity: error
8
+ label: "Lot sans proprietaire"
9
+ procedure_id: procedure_proprietaires
10
+ entity_id: 2062
11
+ - id: df_unit_occupant_missing
12
+ rule_id: occupied-unit-has-occupant
13
+ severity: error
14
+ label: "Lot occupe sans occupant"
15
+ procedure_id: procedure_occupation
16
+ entity_id: 2127
17
+ - id: df_lease_missing
18
+ rule_id: tenant-occupied-has-lease
19
+ severity: warning
20
+ label: "Lot loue sans bail lie"
21
+ procedure_id: procedure_baux
22
+ entity_id: 2391
23
+ - id: df_billing_missing
24
+ rule_id: billing-group-bills-unit
25
+ severity: warning
26
+ label: "Lot sans groupe facturation"
27
+ procedure_id: procedure_finance
28
+ entity_id: 2099
29
+ - id: df_cellar_missing
30
+ rule_id: unit-one-cellar
31
+ severity: error
32
+ label: "Cave non assignee"
33
+ procedure_id: procedure_annexes
34
+ entity_id: 2092
35
+ - id: df_coda_unknown
36
+ rule_id: coda-entry-reviewed
37
+ severity: warning
38
+ label: "CODA en revue manuelle"
39
+ procedure_id: procedure_coda
40
+ entity_id: 2123
41
+ - id: df_reminder_missing
42
+ rule_id: open-charge-has-reminder
43
+ severity: warning
44
+ label: "Relance sans preuve"
45
+ procedure_id: procedure_relances
46
+ entity_id: 2085
47
+ - id: df_ag_action_missing
48
+ rule_id: agenda-item-has-decision
49
+ severity: warning
50
+ label: "Decision AG sans action"
51
+ procedure_id: procedure_ag
52
+ entity_id: 2444
53
+ - id: df_contract_provider_missing
54
+ rule_id: service-contract-has-provider
55
+ severity: error
56
+ label: "Contrat sans prestataire"
57
+ procedure_id: procedure_maintenance
58
+ entity_id: 2278
59
+ - id: df_intervention_provider_missing
60
+ rule_id: intervention-has-provider
61
+ severity: warning
62
+ label: "Intervention sans prestataire"
63
+ procedure_id: procedure_interventions
64
+ entity_id: 2288
65
+ - id: df_certificate_expired
66
+ rule_id: certificate-valid
67
+ severity: error
68
+ label: "Certificat incendie expire"
69
+ procedure_id: procedure_conformite
70
+ entity_id: 2080
71
+ - id: df_claim_policy_missing
72
+ rule_id: claim-covered-by-policy
73
+ severity: error
74
+ label: "Sinistre sans police"
75
+ procedure_id: procedure_sinistres
76
+ entity_id: 2441
77
+ - id: df_worksite_budget_over
78
+ rule_id: worksite-has-budget-line
79
+ severity: warning
80
+ label: "Budget chantier depasse"
81
+ procedure_id: procedure_chantier
82
+ entity_id: 2453
83
+ - id: df_invoice_budget_missing
84
+ rule_id: invoice-linked-to-work-package
85
+ severity: warning
86
+ label: "Facture chantier sans budget"
87
+ procedure_id: procedure_chantier
88
+ entity_id: 2454
89
+ - id: df_reserve_open
90
+ rule_id: reserve-linked-to-inspection
91
+ severity: error
92
+ label: "Reserve reception ouverte"
93
+ procedure_id: procedure_chantier
94
+ entity_id: 2457
95
+ - id: df_meter_reading_unvalidated
96
+ rule_id: meter-has-recent-reading
97
+ severity: warning
98
+ label: "Releve compteur non valide"
99
+ procedure_id: procedure_compteurs
100
+ entity_id: 2296
@@ -0,0 +1,79 @@
1
+ # Immeuble training — gap diagnostics fixture profiles
2
+ # Draft vs golden workspaces for curriculum modules A1–A4 and B1–B3.
3
+
4
+ ontology_id: immeuble-training::core
5
+ workspaces:
6
+ draft: immeuble-training-draft
7
+ golden: immeuble-training-golden
8
+ manifest: examples/immeuble/contracts/consumer_contract.yaml
9
+ source_narrative: examples/immeuble/bundle/immeuble.bundle.json
10
+
11
+ profiles:
12
+ - id: training-a1-patrimoine
13
+ description: Track A module A1 — patrimoine rules on draft (structure OK)
14
+ workspace: immeuble-training-draft
15
+ rules: examples/immeuble/gap-rules/L0-patrimoine.json
16
+ module: A1
17
+ expect_summary:
18
+ missing_required_relations: 0
19
+
20
+ - id: training-a2-syndic-gaps
21
+ description: Track A module A2 — syndic filtered rules on draft (catalogued E01–E02)
22
+ workspace: immeuble-training-draft
23
+ rules: examples/immeuble/gap-rules/L2-syndic-filtered.json
24
+ module: A2
25
+ expect_summary:
26
+ missing_required_relations_min: 6
27
+ expect_rule_ids:
28
+ - occupied-unit-has-occupant
29
+ - tenant-occupied-has-lease
30
+
31
+ - id: training-a3-golden-clean
32
+ description: Track A module A3 — same syndic rules on resolved golden graph
33
+ workspace: immeuble-training-golden
34
+ rules: examples/immeuble/gap-rules/L2-syndic-filtered.json
35
+ module: A3
36
+ expect_summary:
37
+ missing_required_relations: 0
38
+
39
+ - id: training-b1-naive-fp
40
+ description: Track B module B1 — naive owner rule false positive on vacant_works unit
41
+ workspace: immeuble-training-golden
42
+ rules: examples/immeuble/gap-rules/L1-syndic-naive.json
43
+ module: B1
44
+ expect_rule_ids:
45
+ - occupied-unit-has-occupant
46
+ expect_entity_name: Érables Appartement A4
47
+
48
+ - id: training-b2-filtered
49
+ description: Track B module B2 — filtered syndic rules on golden
50
+ workspace: immeuble-training-golden
51
+ rules: examples/immeuble/gap-rules/L2-syndic-filtered.json
52
+ module: B2
53
+ expect_summary:
54
+ missing_required_relations: 0
55
+
56
+ - id: training-b3-full
57
+ description: Track B module B3 — L3 rules + motifs on golden
58
+ workspace: immeuble-training-golden
59
+ rules: examples/immeuble/gap-rules/L3-full.json
60
+ motifs: examples/immeuble/gap-rules/motifs.json
61
+ module: B3
62
+
63
+ - id: training-coverage-with-seeds
64
+ description: Coverage workshop — entity types + catalogue-facets.seed.json on golden
65
+ workspace: immeuble-training-golden
66
+ seed: examples/immeuble/contracts/answer_artifacts.seed.jsonl
67
+ expect_summary:
68
+ catalogue_available: true
69
+
70
+ ci_profiles: []
71
+ ci_test_files: []
72
+ - id: chantier-lite
73
+ title: BIM lite chantier
74
+ rules: examples/immeuble/gap-rules/L2-chantier.json
75
+ expect_rule_ids:
76
+ - worksite-has-architect
77
+ - worksite-has-work-package
78
+ - work-package-affects-asset
79
+ - work-package-has-contractor
@@ -0,0 +1,38 @@
1
+ {
2
+ "ontology_id": "immeuble-training::core",
3
+ "replace": true,
4
+ "motifs": [
5
+ {
6
+ "motif_id": "building-unit-cellar",
7
+ "label": "Immeuble → lot → cave",
8
+ "severity": "error",
9
+ "path": [
10
+ { "entity_type": "building" },
11
+ { "relation_type": "contains", "direction": "out", "require_all_targets": true },
12
+ { "entity_type": "unit" },
13
+ { "relation_type": "assigned_cellar", "direction": "out" },
14
+ { "entity_type": "cellar" }
15
+ ]
16
+ },
17
+ {
18
+ "motif_id": "lease-to-rented-unit",
19
+ "label": "Bail lié au lot loué",
20
+ "severity": "warning",
21
+ "path": [
22
+ { "entity_type": "lease_contract" },
23
+ { "relation_type": "leases", "direction": "out" },
24
+ { "entity_type": "unit" }
25
+ ]
26
+ },
27
+ {
28
+ "motif_id": "billing-group-bills-unit",
29
+ "label": "Groupe facturation → lot",
30
+ "severity": "info",
31
+ "path": [
32
+ { "entity_type": "billing_group" },
33
+ { "relation_type": "bills_to", "direction": "out" },
34
+ { "entity_type": "unit" }
35
+ ]
36
+ }
37
+ ]
38
+ }