@mindflight/mindbrain-personal-studio 0.6.1 → 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.
- package/README.md +16 -8
- package/build/client/_app/immutable/chunks/CIErFlYG.js +1 -0
- package/build/client/_app/immutable/chunks/CIErFlYG.js.br +0 -0
- package/build/client/_app/immutable/chunks/CIErFlYG.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CVz6aYsT.js → app.mURYm8o_.js} +2 -2
- package/build/client/_app/immutable/entry/app.mURYm8o_.js.br +0 -0
- package/build/client/_app/immutable/entry/app.mURYm8o_.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js +1 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.br +2 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.BBtxY46Q.js → 1.DHKtMeFI.js} +1 -1
- package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{internal.js-D8EA_he2.js → internal.js-C3tV0XXj.js} +2 -2
- package/build/server/chunks/chunks/{internal.js-D8EA_he2.js.map → internal.js-C3tV0XXj.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/{_server.ts.js-Dyfsc-VA.js → _server.ts.js-CAsXxBRq.js} +7 -2
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-CAsXxBRq.js.map +1 -0
- package/build/server/chunks/{handler-BjXBCd1c.js → handler-DlaCCnxx.js} +3 -3
- package/build/server/chunks/{handler-BjXBCd1c.js.map → handler-DlaCCnxx.js.map} +1 -1
- package/build/server/chunks/{index.js-BJYcV8V7.js → index.js-BGfKWHak.js} +2 -2
- package/build/server/chunks/{index.js-BJYcV8V7.js.map → index.js-BGfKWHak.js.map} +1 -1
- package/build/server/chunks/{manifest.js-Ddaot0P4.js → manifest.js-CnmaNf5D.js} +4 -4
- package/build/server/chunks/{manifest.js-Ddaot0P4.js.map → manifest.js-CnmaNf5D.js.map} +1 -1
- package/build/server/chunks/nodes/{1.js-BRigw_9J.js → 1.js-BypjwBYB.js} +2 -2
- package/build/server/chunks/nodes/{1.js-BRigw_9J.js.map → 1.js-BypjwBYB.js.map} +1 -1
- package/examples/immeuble/ACCEPTANCE.yaml +82 -0
- package/examples/immeuble/BIM_LITE.md +15 -0
- package/examples/immeuble/CHECKLIST.md +128 -0
- package/examples/immeuble/README.md +121 -0
- package/examples/immeuble/bundle/immeuble.bundle.json +22786 -0
- package/examples/immeuble/contracts/answer_artifacts.seed.jsonl +34 -0
- package/examples/immeuble/contracts/business_capabilities.seed.jsonl +25 -0
- package/examples/immeuble/contracts/consumer_contract.yaml +131 -0
- package/examples/immeuble/contracts/immeuble_structured_import_model.json +310 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical.json +375 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical.yaml +55 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical_ws.json +65 -0
- package/examples/immeuble/contracts/model_contract.json +943 -0
- package/examples/immeuble/contracts/projection_catalog.yaml +366 -0
- package/examples/immeuble/contracts/scenarios.yaml +27 -0
- package/examples/immeuble/contracts/semantic_proposal.golden.json +1 -0
- package/examples/immeuble/contracts/source_profile.yaml +38 -0
- package/examples/immeuble/fake_data/DeltaFinding.csv +20 -0
- package/examples/immeuble/fake_data/ProjectionResult.csv +13 -0
- package/examples/immeuble/fake_data/ag_meeting.csv +4 -0
- package/examples/immeuble/fake_data/agenda_item.csv +4 -0
- package/examples/immeuble/fake_data/architect.csv +3 -0
- package/examples/immeuble/fake_data/architecture_firm.csv +2 -0
- package/examples/immeuble/fake_data/bank_account.csv +3 -0
- package/examples/immeuble/fake_data/billing_group.csv +41 -0
- package/examples/immeuble/fake_data/block.csv +10 -0
- package/examples/immeuble/fake_data/budget_line.csv +3 -0
- package/examples/immeuble/fake_data/building.csv +6 -0
- package/examples/immeuble/fake_data/cellar.csv +41 -0
- package/examples/immeuble/fake_data/change_order.csv +2 -0
- package/examples/immeuble/fake_data/charge_call.csv +58 -0
- package/examples/immeuble/fake_data/claim.csv +4 -0
- package/examples/immeuble/fake_data/coda_entry.csv +49 -0
- package/examples/immeuble/fake_data/compliance_certificate.csv +10 -0
- package/examples/immeuble/fake_data/contractor.csv +4 -0
- package/examples/immeuble/fake_data/decision.csv +5 -0
- package/examples/immeuble/fake_data/defect_reserve.csv +3 -0
- package/examples/immeuble/fake_data/household.csv +41 -0
- package/examples/immeuble/fake_data/inspection.csv +3 -0
- package/examples/immeuble/fake_data/insurance_policy.csv +4 -0
- package/examples/immeuble/fake_data/intervention.csv +13 -0
- package/examples/immeuble/fake_data/invoice.csv +3 -0
- package/examples/immeuble/fake_data/lease_contract.csv +12 -0
- package/examples/immeuble/fake_data/maintenance_ticket.csv +13 -0
- package/examples/immeuble/fake_data/meter.csv +4 -0
- package/examples/immeuble/fake_data/meter_reading.csv +19 -0
- package/examples/immeuble/fake_data/milestone.csv +3 -0
- package/examples/immeuble/fake_data/organization.csv +12 -0
- package/examples/immeuble/fake_data/parking_space.csv +8 -0
- package/examples/immeuble/fake_data/permit.csv +3 -0
- package/examples/immeuble/fake_data/person.csv +85 -0
- package/examples/immeuble/fake_data/private_garden.csv +7 -0
- package/examples/immeuble/fake_data/progress_event.csv +2 -0
- package/examples/immeuble/fake_data/quote.csv +3 -0
- package/examples/immeuble/fake_data/receipt.csv +2 -0
- package/examples/immeuble/fake_data/reminder.csv +11 -0
- package/examples/immeuble/fake_data/service_contract.csv +4 -0
- package/examples/immeuble/fake_data/shared_equipment.csv +8 -0
- package/examples/immeuble/fake_data/shared_space.csv +10 -0
- package/examples/immeuble/fake_data/unit.csv +41 -0
- package/examples/immeuble/fake_data/work_package.csv +4 -0
- package/examples/immeuble/fake_data/worksite_project.csv +3 -0
- package/examples/immeuble/gap-rules/L0-patrimoine.json +57 -0
- package/examples/immeuble/gap-rules/L1-syndic-naive.json +36 -0
- package/examples/immeuble/gap-rules/L1-syndic.json +61 -0
- package/examples/immeuble/gap-rules/L2-chantier.json +87 -0
- package/examples/immeuble/gap-rules/L2-exploitation.json +87 -0
- package/examples/immeuble/gap-rules/L2-finance.json +48 -0
- package/examples/immeuble/gap-rules/L2-maintenance.json +107 -0
- package/examples/immeuble/gap-rules/L2-syndic-filtered.json +39 -0
- package/examples/immeuble/gap-rules/L3-full.json +332 -0
- package/examples/immeuble/gap-rules/closed-world-contract.md +76 -0
- package/examples/immeuble/gap-rules/demo.json +51 -0
- package/examples/immeuble/gap-rules/expected-findings.yaml +100 -0
- package/examples/immeuble/gap-rules/gap-scenarios.yaml +79 -0
- package/examples/immeuble/gap-rules/motifs.json +38 -0
- package/examples/immeuble/gap-rules/syndic.json +40 -0
- package/examples/immeuble/import_manifest.yaml +25 -0
- package/examples/immeuble/import_ready/graph_edges_import.csv +848 -0
- package/examples/immeuble/import_ready/mfo_facets_import.csv +559 -0
- package/examples/immeuble/index.md +140 -0
- package/examples/immeuble/model/immeuble_model.json +418 -0
- package/examples/immeuble/reports/01-model.validation.json +56 -0
- package/examples/immeuble/reports/02-mapping.validation.json +9 -0
- package/examples/immeuble/reports/acceptance.validation.json +161 -0
- package/examples/immeuble/reports/consumer_contract.validation.json +162 -0
- package/examples/immeuble/reports/graph_edges.jsonl +847 -0
- package/examples/immeuble/reports/graph_nodes.jsonl +558 -0
- package/examples/immeuble/reports/hybrid-compare.json +144 -0
- package/examples/immeuble/reports/immeuble-import-scenario.json +233 -0
- package/examples/immeuble/reports/live-artifacts-refresh.validation.json +51 -0
- package/examples/immeuble/reports/pipeline_audit.json +59 -0
- package/examples/immeuble/reports/projection_audit.json +69 -0
- package/examples/immeuble/reports/projection_audit_immeuble.json +257 -0
- package/examples/immeuble/reports/projection_audit_immeuble.md +122 -0
- package/examples/immeuble/reports/projection_candidates.json +1596 -0
- package/examples/immeuble/reports/projection_candidates.md +117 -0
- package/examples/immeuble/reports/projection_model_validation.md +115 -0
- package/examples/immeuble/reports/reindex.json +4 -0
- package/examples/immeuble/reports/reset-immeuble-workspace.json +32 -0
- package/examples/immeuble/reports/schema-id-prefix-check.json +5 -0
- package/examples/immeuble/scripts/audit-immeuble-projections.mjs +254 -0
- package/examples/immeuble/scripts/build-immeuble-model.mjs +308 -0
- package/examples/immeuble/scripts/compare-immeuble-snapshots.sh +227 -0
- package/examples/immeuble/scripts/enrich-immeuble-demo.mjs +1135 -0
- package/examples/immeuble/scripts/reset-immeuble-workspace.mjs +139 -0
- package/examples/immeuble/scripts/run-immeuble-backend.sh +164 -0
- package/examples/immeuble/scripts/run-immeuble-import.mjs +232 -0
- package/examples/immeuble/scripts/run-immeuble-live-lab.sh +439 -0
- package/examples/immeuble/scripts/seed-immeuble-gap-rules.mjs +69 -0
- package/examples/immeuble/scripts/start-immeuble-demo.sh +52 -0
- package/examples/immeuble/scripts/starterkit/analysis-lenses.mjs +181 -0
- package/examples/immeuble/scripts/starterkit/analyze-projection-candidates.mjs +714 -0
- package/examples/immeuble/scripts/starterkit/audit-ghostcrab-projections.mjs +674 -0
- package/examples/immeuble/scripts/starterkit/facet-prefix.mjs +166 -0
- package/examples/immeuble/scripts/starterkit/sqlite-utils.mjs +131 -0
- package/examples/immeuble/scripts/verify-immeuble-acceptance.mjs +284 -0
- package/examples/immeuble/scripts/verify-immeuble-live-artifacts.mjs +140 -0
- package/examples/immeuble/scripts/yaml-lite.mjs +96 -0
- package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites-immo-mcp.md +161 -0
- package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites.md +39 -0
- package/examples/immeuble/sources/agent-prompts/prompts/01-discovery-and-model-proposal.md +42 -0
- package/examples/immeuble/sources/agent-prompts/prompts/02-ontology-register.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/03-gap-rules-design.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/04-document-ingest.md +40 -0
- package/examples/immeuble/sources/agent-prompts/prompts/05-graph-extraction.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-immo-mcp.md +109 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-test-immo-mcp3.md +30 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare.md +63 -0
- package/examples/immeuble/sources/checklists/gap-rules-checklist.md +42 -0
- package/examples/immeuble/sources/checklists/ontology-checklist.md +54 -0
- package/examples/immeuble/sources/documents/README.md +42 -0
- package/examples/immeuble/sources/documents/annexes-caves-garages-jardins.md +8 -0
- package/examples/immeuble/sources/documents/annexes-jardins-garages.md +1 -0
- package/examples/immeuble/sources/documents/baux-erables.md +1 -0
- package/examples/immeuble/sources/documents/baux-locatifs.md +11 -0
- package/examples/immeuble/sources/documents/coda-janvier-2026.md +10 -0
- package/examples/immeuble/sources/documents/composition-menages.md +1 -0
- package/examples/immeuble/sources/documents/composition-occupants.md +18 -0
- package/examples/immeuble/sources/documents/expected-coverage.json +70 -0
- package/examples/immeuble/sources/documents/extrait-coda-janvier-2026.md +1 -0
- package/examples/immeuble/sources/documents/groupes-facturation.md +30 -0
- package/examples/immeuble/sources/documents/manifest.json +79 -0
- package/examples/immeuble/sources/documents/note-architecte-chantier-erables.md +3 -0
- package/examples/immeuble/sources/documents/permis-urbanisme-erables.md +3 -0
- package/examples/immeuble/sources/documents/procedures-operationnelles.md +3 -0
- package/examples/immeuble/sources/documents/pv-ag-budget-2026.md +1 -0
- package/examples/immeuble/sources/documents/pv-reception-reserves-erables.md +3 -0
- package/examples/immeuble/sources/documents/registre-coproprietaires.md +24 -0
- package/examples/immeuble/sources/documents/reglement-copropriete-tilleuls.md +1 -0
- package/examples/immeuble/sources/documents/statuts-erables.md +22 -0
- package/examples/immeuble/sources/documents/statuts-tilleuls.md +19 -0
- package/examples/immeuble/sources/documents/succession-jean-dupont.md +3 -0
- package/examples/immeuble/sources/documents/titre-propriete-tilleuls-a3.md +1 -0
- package/examples/immeuble/sources/documents/trous-pedagogiques.md +3 -0
- package/examples/immeuble/sources/ontology/README.md +1 -0
- package/examples/immeuble/sources/ontology/core.yaml +444 -0
- package/examples/immeuble/success-criteria.yaml +35 -0
- package/fixtures/immeuble-demo.sqlite +0 -0
- package/package.json +16 -3
- package/scripts/lib/sqlite-runtime.mjs +1 -1
- package/scripts/load-immeuble-demo.sh +103 -0
- package/scripts/seed-immeuble-projections.mjs +75 -148
- package/scripts/verify-immeuble-demo-sources.mjs +93 -0
- package/scripts/verify-immeuble-demo.mjs +69 -0
- package/build/client/_app/immutable/chunks/BmeSanva.js +0 -1
- package/build/client/_app/immutable/chunks/BmeSanva.js.br +0 -0
- package/build/client/_app/immutable/chunks/BmeSanva.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CVz6aYsT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CVz6aYsT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js +0 -1
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.br +0 -2
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.gz +0 -0
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js.map +0 -1
- package/scripts/build-serenity-v6-concept-review-pack.mjs +0 -493
- package/scripts/build-serenity-v6-review-pack.mjs +0 -479
- package/scripts/create-serenity-production-v6.mjs +0 -627
- package/scripts/export-serenity-v6-backup.mjs +0 -178
- package/scripts/import-serenity-v6-user-decisions.mjs +0 -543
- package/scripts/materialize-serenity-v6-snapshots.mjs +0 -675
|
@@ -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
|
+
}
|