Skip to content

feat: source_curator per-curator tagging via ogar-from-rails::extract_with (consumes ruff#27)#74

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/source-curator-extract-with
Jun 19, 2026
Merged

feat: source_curator per-curator tagging via ogar-from-rails::extract_with (consumes ruff#27)#74
AdaWorldAPI merged 1 commit into
mainfrom
claude/source-curator-extract-with

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

What

Adds per-curator source tagging so two curators in the same domain stay distinguishable, end to end (consumes ruff#27's extract_with).

  • ogar_vocab::Class.source_curator: Option<String> — the specific product (openproject, redmine, odoo), alongside the existing coarse source_domain (project, erp). #[serde(default)] so it is backward-compatible on the wire.
  • ogar_from_ruff::lift_model_graph sets source_curator from the harvest namespace (None for an empty namespace).
  • ogar_from_rails::extract_with(path, curator) — namespace-tagging entry point (the existing extract stays as the openproject-defaulting wrapper).

Why

source_domain answers which domain (for codebook routing); source_curator answers which product. Both OpenProject and Redmine are project domain, so without the curator tag a cross-curator convergence test cannot tell whose extract a class came from. This is the field the real-corpus OP↔Redmine convergence tests key on.

Tests

extract_with tags Redmine Issue and OpenProject WorkPackage with distinct source_curator while both still converge on project_work_item; source_curator_carries_namespace_distinct_from_domain. Purely additive (110 insertions, 0 deletions); workspace test green.

Note: touches lift_model_graph, same as #72 — whichever merges second needs a trivial rebase (the two additions to the closure are non-overlapping).

…mes ruff#27)

Completes the ruff#27 thread end to end. ruff_ruby_spo::extract_with(path,
namespace) lets a harvest be tagged with its specific curator instead of
the hardcoded 'openproject'. This wires it through OGAR:

- ogar-vocab: Class.source_curator: Option<String> — the SPECIFIC product
  (openproject/redmine/odoo/osb), distinct from the coarse source_domain
  (project/erp). Two curators in one domain (Redmine + OpenProject are
  both project) stay distinguishable. Additive field (serde default); all
  consumers still build.
- ogar-from-ruff: lift_model_graph sets source_curator from
  graph.namespace (empty namespace -> None, not empty string).
- ogar-from-rails: extract_with(source_tree, curator) threads through
  ruff_ruby_spo::extract_with; plain extract() stays the OpenProject
  default.

Tests:
- ogar-from-ruff source_curator_carries_namespace_distinct_from_domain:
  redmine + openproject both project-domain, distinct curators, SAME
  canonical id (convergence holds while provenance stays separable).
- ogar-from-rails real-corpus extract_with_tags_distinct_curators_in_one_-
  domain: Redmine Issue (curator redmine) + OP WorkPackage (curator
  openproject) both -> project_work_item id, distinct curators.

ogar-vocab 41, ogar-from-ruff 25 (+1), real-corpus 14 (+1); clippy clean;
consumers build.
@AdaWorldAPI AdaWorldAPI force-pushed the claude/source-curator-extract-with branch from 8842f0c to abb2efe Compare June 19, 2026 15:45
@AdaWorldAPI AdaWorldAPI merged commit 2362f06 into main Jun 19, 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.

2 participants