Skip to content

feat(vocab+class-view): mint HR domain (0x0DXX) — closes final 4-of-11 cross-axis identity gap from odoo-rs #14#127

Merged
AdaWorldAPI merged 5 commits into
mainfrom
claude/hr-domain-mint-close-final-odoo-aliases-gap
Jun 24, 2026
Merged

feat(vocab+class-view): mint HR domain (0x0DXX) — closes final 4-of-11 cross-axis identity gap from odoo-rs #14#127
AdaWorldAPI merged 5 commits into
mainfrom
claude/hr-domain-mint-close-final-odoo-aliases-gap

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Phase-3 HR cluster (C3) — closes the final cross-axis gap

The full closure of the 11-class gap surfaced by odoo-rs PR #14's
alignment_pin::seeded_classes_have_compatible_ogar_identity:

After C3 merges: 11-of-11 closed.

New concept domain: HR (0x0DXX)

class_id concept OSB / Odoo / alignment
0x0D01 HR_EMPLOYEE OSB Employee, Odoo hr.employee (vcard:Individual)
0x0D02 HR_DEPARTMENT OSB Department, Odoo hr.department (org:OrganizationalUnit)
0x0D03 HR_JOB OSB Job, Odoo hr.job (org:Role)
0x0D04 HR_EMPLOYMENT_CONTRACT OSB Contract, Odoo hr.contract (fibo:Contract — payroll computation stays outside the codebook)

Distinct from Auth (which is the IdP→classid bridge) and from Health
(PHI). Mirrors arago HIRO HR semantics + Odoo hr.* + vcard/org/fibo
alignment.

Synchronised across the registries (same shape as #110 AuthStore + #111 + #126)

File Change
ogar-vocab/src/lib.rs ConceptDomain enum +1 variant HR
ogar-vocab/src/lib.rs canonical_concept_domain +1 arm 0x0D → HR
ogar-vocab/src/lib.rs CODEBOOK +4 rows
ogar-vocab/src/lib.rs class_ids mod +4 typed consts
ogar-vocab/src/lib.rs class_ids::ALL +4 entries
ogar-vocab/src/lib.rs builders +4 hr_employee() / hr_department() / hr_job() / hr_employment_contract() Class fns
ogar-vocab/src/lib.rs all_promoted_classes() +4 calls in new 0x0DXX block
ogar-vocab/src/lib.rs tests 0x0D00 → HR test arm (was Unassigned); concepts_in_domain(ConceptDomain::HR).count() == 4
ogar-vocab/src/ports.rs ODOO_ALIASES +4 entries (hr.employee, hr.department, hr.job, hr.contract); count-drift assert 16 → 20
ogar-class-view/src/lib.rs +4 imports + +4 entries in all_canonical_classes()

Class attribute shapes

Schema-aligned minimal attributes per the alignment table in odoo-rs PR #14:

hr_employee():            full_name, email, phone, employee_id     // vcard:Individual
hr_department():          name, manager_ref, parent_ref             // org:OrganizationalUnit
hr_job():                 title, description, department_ref        // org:Role
hr_employment_contract(): start_date, end_date, contract_type, salary  // fibo:Contract (no payroll engine)

Why no keystone-spec review (unlike #110 AuthStore)

AuthStore #110 needed docs/CLASSID-RBAC-KEYSTONE-SPEC.md §7 because RBAC has heavy enforcement implications (authorize() is the runtime gate). HR is plain identity/master-data — same shape as Commerce 0x02XX or Health 0x09XX additions. No enforcement gate to design; the classid is just the identity key for the four entities. Mirroring drift discipline (E-OGAR-AUTH-MIRROR-DRIFT) applies as usual.

Cross-repo follow-up needed

  • lance-graph mirror updatelance_graph_contract::ogar_codebook::CODEBOOK needs to add the 4 HR entries; ConceptDomain::HR mirror variant; canonical_concept_domain 0x0D arm; lance-graph-ogar::parity::domains_agree +1 arm (O::HR, C::HR). Same pattern as D3 #606.
  • odoo-rs alignment_pin updatetests/alignment_pin.rs::seeded_classes_have_compatible_ogar_identity should now report 0 remaining un-mapped seeded classes (was 7; will be 0 once odoo-rs bumps the OGAR pin past this PR). The hard-pin assertion can also extend from commerce-arm-only to "all 15 seeded classes have an OGAR classid" — total closure.

Refs

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

…oo_hr_models_resolve_into_the_hr_domain sibling test

Copy link
Copy Markdown
Owner Author

Test fix pushed.

CI failure: odoo_commerce_models_resolve_into_the_commerce_domain iterated ALL OdooPort::aliases() asserting each lands in the Commerce domain. The skip list had ONE deliberate exception (account.analytic.line — the cross-arm bridge to PROJECT_MGMT). My new hr.* aliases land in the HR domain (0x0DXX), violating that assertion.

Two-part fix in the same commit ():

  1. Extended the skip-list: name == "account.analytic.line" || name.starts_with("hr.")
  2. Added sibling test odoo_hr_models_resolve_into_the_hr_domain asserting the 4 hr.* aliases land in ConceptDomain::HR — same shape as the commerce test, positive coverage for the new domain

CI should now go green.

(Same shape as the C2 #126 rebase fix earlier today — different failure mode, but the discipline that catches both is in E-OGAR-API-EDIT-PULL-FIRST: pull main, splice narrow, push thin. I pulled the live branch state, spliced the test edits, pushed clean.)

@AdaWorldAPI AdaWorldAPI merged commit 597ecb1 into main Jun 24, 2026
1 check passed
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