feat(ogar-vocab): ProjectNews + ProjectMessage (2 more promotions)#70
Conversation
Continuing the OP <-> Redmine ladder from the probe overlap. Both News and Message are cross-curator with substantive shape: | Canonical | id | Redmine | OpenProject | |--------------------|---------|---------|-------------| | project_news | 0x0114 | News | News | | project_message | 0x0115 | Message | Message | ProjectNews — universal shape (project + author + comments + title/ summary/description). Both curators ship the same AR structure. ProjectMessage — threaded forum/board discussion. Note the parent- container divergence: Redmine 'Board' vs OP 'Forum' (a future project_forum promotion can close that). The self-referential 'last_reply' edge captures the acts_as_tree thread chain. - CODEBOOK entries: 0x0114 and 0x0115 in the project-mgmt block. - Resolver arms (singular/plural/PascalCase per the doctrine). - Canonical class functions with Language::Unknown, typed attrs, and the obvious family edges to existing canonicals (project, author -> project_actor, comments -> project_comment for News; author -> project_actor, last_reply -> ProjectMessage self-ref for Message). - Extended codebook_ids_are_domain_prefixed_and_consistent, project_- mgmt_batch_promotions_each_have_a_codebook_id_and_shape, and project_- mgmt_resolver_arms_collapse_curator_names to cover the 2 new concepts. - New real-corpus test: redmine_and_openproject_news_and_message_converge iterates both curators' News + Message and asserts canonical_concept + canonical_id match. ogar-vocab 41, ogar-from-ruff 24, real-corpus 12 (+1); clippy clean. Project-mgmt block (0x01XX) is now 21 concepts.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5ab5e11e30
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Tree self-reference: both curators use `acts_as_tree` with | ||
| // `belongs_to :last_reply, class_name: "Message"` linking the | ||
| // thread chain. | ||
| family_edge("last_reply", "ProjectMessage"), |
There was a problem hiding this comment.
Preserve the Message parent edge
When loading threaded forum messages, this self-edge does not represent the thread structure: in both Redmine and OpenProject last_reply_id is only a cached pointer from a topic to its latest reply, while the actual reply tree comes from acts_as_tree/parent_id. As a result, replies generally have no last_reply, so consumers using the canonical ProjectMessage shape cannot reconstruct parent/child discussions; add a canonical parent/children self-reference or avoid treating last_reply as the thread chain.
Useful? React with 👍 / 👎.
Two more promotions — News + Message
project_news0x0114NewsNewsproject_message0x0115MessageMessageproject_news— universal shape across both curators:belongs_to :project+:author+has_many :comments+title/summary/descriptionscalars. Thecommentsfamily edge points at the existingproject_commentcanonical (closes a back-ref).project_message— threaded forum/board discussion withacts_as_tree. The parent-container diverges between curators (RedmineBoardvs OPForum— a futureproject_forumpromotion would close that), butMessageitself converges. The self-referentiallast_replyedge captures the thread chain.What
CODEBOOKentries0x0114–0x0115in the project-mgmt block.Language::Unknown+ typed attrs + obvious family edges.codebook_ids_are_domain_prefixed_and_consistent,project_mgmt_batch_promotions_each_have_a_codebook_id_and_shape, andproject_mgmt_resolver_arms_collapse_curator_names.redmine_and_openproject_news_and_message_convergeiterates both curators'News+Messageand asserts canonical_concept + canonical_id match.Green
ogar-vocab41 ·ogar-from-ruff24 ·ogar-from-rails12 real-corpus (+1) · clippy clean.Codebook now 23 promoted concepts
Project-mgmt (
0x01XX): 21 concepts (0x0101project →0x0115project_message).Commerce (
0x02XX): 6 concepts.Reserved future blocks: OSINT (
0x07XX), OCR (0x08XX), Health (0x09XX).🤖 Generated with Claude Code