Skip to content

Role, responsibility, and agent ontology (v2.10.0) - #74

Merged
seonghobae merged 165 commits into
mainfrom
feat/role-responsibility-agent-ontology
Aug 19, 2026
Merged

Role, responsibility, and agent ontology (v2.10.0)#74
seonghobae merged 165 commits into
mainfrom
feat/role-responsibility-agent-ontology

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Merge leftover post–criterion pairs and fail-closed Rankings from main onto this branch as v2.10.0.

Exact head: dde2f3ff64404888473474c3cb52b8bd9b75e400

What this revision adds

  • Period leftover pairs after IRT main effects (Jeon leftover map). Migration 0026, ADRs 0028 / 0029. After make seed, leftover pairs sit above the member list; click opens that post. Hidden posts stay omitted.
  • Home Rankings panel through RankWeaveClient (ADR 0030). Unavailable copy is Rankings · RankWeave not available. Never invent a fused score or a theta.
  • Number collisions with this branch’s existing ADRs/migrations were renumbered, not deleted: leftover-pair migration is 0026 (not 0012); leftover ADRs are 0028–0029 (not 0017–0018); RankWeave fail-closed is 0030 (not 0024). Protected 0012 / 0017 / 0018 / 0024 stay the analysis-run / related-node / seed-report / role-responsibility records already on this branch.
  • Lineage request uses the first affiliated corp in the same render that /api/me returns, so Request a lineage reconstruction is not left disabled after corps load.

Exact-head checks

  • Tests
  • Security Scan
  • Semgrep
  • PROV-O
  • Strix Security Scan

Do not merge until exact-head required checks are green. Independent current-head approval remains a separate gate.

Confirmed against real Milestone 2 SAP CRM VOC data: post_summary.py's
R&R extraction forced every named actor into a person slot, but real
business correspondence routinely names an organization acting in its
own name ("당사," "SEWA," "Siemens," "GECO"), not an individual.

- RoleResponsibility.actor_name (renamed from person_name) gains
  actor_type_code (prov_person/prov_organization, W3C PROV-O grounded:
  Lebo, Sahoo, & McGuinness, 2013) and an LLM-inferred
  affiliated_organization_name for person actors -- a bare name
  without an employer is hard to place.
- Ontology: :RoleActorPerson rdfs:subClassOf prov:Person,
  :RoleActorOrganization rdfs:subClassOf prov:Organization -- genuine
  subclasses of the real external PROV-O classes, distinct from the
  ontology's existing :Person (a cataloged Keyman with a stable
  person_id; an R&R actor is a free-text name with no cataloged
  identity).
- migrations/0012_role_responsibility_agent_type.sql renames the
  column via RENAME COLUMN (preserves existing rows), not a
  drop/recreate.
- Popup R&R list shows a Person/Organization badge and the inferred
  affiliation; only a person actor still links to the Keyman panel.
- Also fixes a real deployment gap found via browser E2E testing:
  migrations 0005-0011 had accumulated on main without ever being
  applied to the long-running demo Postgres volume, surfacing as
  CORS-looking failures (missing-table 500s lose their CORS header)
  on Evaluate, Reports, Summary, and Chat.

ADR 0006.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
@seonghobae
seonghobae enabled auto-merge (squash) August 14, 2026 01:41
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 220 files, which is 120 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: eb205fcf-b6c1-4dfa-b3fc-a1215a4a55b6

📥 Commits

Reviewing files that changed from the base of the PR and between 80905cf and 4b05b57.

⛔ Files ignored due to path filters (2)
  • frontend/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (220)
  • .github/workflows/tests.yml
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.d/0.71.2-leftover-pairs.md
  • CHANGELOG.d/0.79.0-analysis-run-authorized-read.md
  • CHANGELOG.d/0.80.0-analysis-run-detail-click.md
  • CHANGELOG.d/0.81.0-analysis-run-status-history.md
  • CHANGELOG.d/0.82.0-analysis-run-post-clickthrough.md
  • CHANGELOG.d/0.83.0-analysis-run-cutoff-and-keyman-upgrade.md
  • CHANGELOG.d/0.84.0-tepp-analysis-run.md
  • CHANGELOG.d/0.84.1-analysis-run-digest-a11y.md
  • CHANGELOG.d/0.85.0-analysis-run-create.md
  • CHANGELOG.d/0.86.0-related-nodes-team-org-walk.md
  • CHANGELOG.d/0.86.2-role-catalog-identity.md
  • CHANGELOG.d/0.87.0-retention-purge-grant-admin.md
  • CHANGELOG.d/0.88.0-analysis-run-start.md
  • CHANGELOG.d/0.89.0-analysis-run-live-write-clock.md
  • CHANGELOG.d/0.90.0-analysis-run-cutoff-body-warning.md
  • CHANGELOG.d/0.91.0-analysis-run-reconstructed-edge-click.md
  • CHANGELOG.d/0.92.0-analysis-run-tepp-start.md
  • CHANGELOG.d/0.93.0-seed-analysis-run-reconstruction.md
  • CHANGELOG.d/0.94.0-analysis-run-outbox.md
  • CHANGELOG.d/0.95.0-analysis-run-outbox-delivery.md
  • CHANGELOG.d/0.96.0-seed-period-report-run.md
  • CHANGELOG.d/0.97.0-analysis-run-open-period-report.md
  • CHANGELOG.d/0.98.0-analysis-run-open-report-grouping.md
  • CHANGELOG.d/0.98.1-analysis-run-sql-constants.md
  • CHANGELOG.d/0.99.0-analysis-run-comparison-strip-landing.md
  • CHANGELOG.d/1.0.0-analysis-run-opened-report-next-action.md
  • CHANGELOG.d/1.1.0-analysis-run-opened-report-members.md
  • CHANGELOG.d/1.2.0-analysis-run-opened-member-next-action.md
  • CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md
  • CHANGELOG.d/1.4.0-current-event-lineage-node.md
  • CHANGELOG.d/1.5.0-event-lineage-keyman-eval-next.md
  • CHANGELOG.d/1.6.0-land-keyman-eval-under-next-action.md
  • CHANGELOG.d/1.7.0-name-first-keyman-after-eval.md
  • CHANGELOG.d/1.8.0-land-first-keyman-related.md
  • CHANGELOG.d/1.9.0-name-first-related-after-ada.md
  • CHANGELOG.d/2.0.0-land-first-related-after-priya.md
  • CHANGELOG.d/2.1.0-source-post-revision.md
  • CHANGELOG.d/2.10.0-leftover-pairs-and-rankings.md
  • CHANGELOG.d/2.10.1-analysis-run-accessible-next-action.md
  • CHANGELOG.d/2.10.2-embedded-image-html-parser.md
  • CHANGELOG.d/2.10.3-stale-hidden-run-list.md
  • CHANGELOG.d/2.10.4-retention-purge-reconstruction-children.md
  • CHANGELOG.d/2.11.0-customer-group-tree-searxng.md
  • CHANGELOG.d/2.12.0-persistable-tepp-result.md
  • CHANGELOG.d/2.12.1-tepp-accepted-transport-evidence.md
  • CHANGELOG.d/2.12.2-tepp-accepted-clocks.md
  • CHANGELOG.d/2.12.3-late-demo-cutoff-post.md
  • CHANGELOG.d/2.2.0-name-ask-after-priya-related.md
  • CHANGELOG.d/2.3.0-focus-ask-after-priya-related.md
  • CHANGELOG.d/2.4.0-land-ask-under-next-action.md
  • CHANGELOG.d/2.5.0-name-first-ask-after-landed-chat.md
  • CHANGELOG.d/2.6.0-land-first-ask-answer.md
  • CHANGELOG.d/2.7.0-name-first-cited-after-ask-answer.md
  • CHANGELOG.d/2.7.1-wait-affiliated-corps-lineage-create.md
  • CHANGELOG.d/2.7.2-role-person-catalog-identity.md
  • CHANGELOG.d/2.8.0-land-first-cited-evidence.md
  • CHANGELOG.d/2.9.0-name-evidence-lineage-after-cited.md
  • CHANGELOG.d/milestone2-analysis-run-registry.md
  • CHANGELOG.d/tied-organization-no-auto-create.md
  • CHANGELOG.md
  • CLAUDE.md
  • README.md
  • backend/app/abbreviation_tree_corroboration_ingestion.py
  • backend/app/analysis_run_ingestion.py
  • backend/app/analysis_run_outbox.py
  • backend/app/analysis_run_start.py
  • backend/app/config.py
  • backend/app/corporate_entity_ingestion.py
  • backend/app/customer_group_tree_ingestion.py
  • backend/app/entity_relationship_ingestion.py
  • backend/app/keyman_ingestion.py
  • backend/app/knowledge_graph.py
  • backend/app/main.py
  • backend/app/post_summary_ingestion.py
  • backend/app/report_ingestion.py
  • backend/app/source_post_revision.py
  • backend/tests/test_api.py
  • backend/tests/test_config.py
  • docker/postgres-init/Dockerfile
  • docs/adr/0003-fast-mlsirm-report-integration.md
  • docs/adr/0008-organization-abbreviation-resolution.md
  • docs/adr/0009-cross-post-actor-identity.md
  • docs/adr/0010-corporate-hierarchy-auto-creation.md
  • docs/adr/0013-normalized-analysis-run-registry.md
  • docs/adr/0014-authorized-analysis-run-read.md
  • docs/adr/0015-adaptive-contextual-orchestrator-default.md
  • docs/adr/0016-analysis-run-knowledge-cutoff-posts.md
  • docs/adr/0017-authorized-analysis-run-create.md
  • docs/adr/0018-related-nodes-team-org-walk.md
  • docs/adr/0019-role-catalog-identity.md
  • docs/adr/0020-analysis-run-retention-purge.md
  • docs/adr/0021-authorized-analysis-run-start.md
  • docs/adr/0022-authorized-tepp-start.md
  • docs/adr/0023-analysis-run-outbox.md
  • docs/adr/0024-seed-period-report-analysis-run.md
  • docs/adr/0025-source-post-revision.md
  • docs/adr/0026-tied-organization-similarity.md
  • docs/adr/0027-role-person-catalog-identity.md
  • docs/adr/0028-persist-lsirm-leftover-pairs.md
  • docs/adr/0029-leftover-pair-report-ui.md
  • docs/adr/0030-rankweave-fusion-fail-closed.md
  • docs/adr/0031-embedded-image-html-parser.md
  • docs/adr/0032-retention-purge-reconstruction-children.md
  • docs/adr/0033-customer-group-tree-abbreviation-corroboration.md
  • docs/adr/0034-persistable-tepp-result.md
  • docs/adr/0035-tepp-accepted-transport-evidence.md
  • docs/doctoring/ANALYSIS_RUN_REGISTRY_REFERENCES.md
  • docs/doctoring/DESIGN_TOKEN_REFERENCES.md
  • docs/doctoring/RELATED_NODE_TEAM_ORG_REFERENCES.md
  • docs/doctoring/ROLE_CATALOG_IDENTITY_REFERENCES.md
  • docs/doctoring/SOURCE_POST_REVISION_REFERENCES.md
  • docs/image-content-schema.md
  • docs/ontology/lineageweave-kg.ttl
  • docs/storybook-inventory.md
  • docs/superpowers/plans/2026-08-15-analysis-run-registry.md
  • frontend/.gitignore
  • frontend/.storybook/main.ts
  • frontend/.storybook/preview.ts
  • frontend/package.json
  • frontend/src/App.css
  • frontend/src/App.test.tsx
  • frontend/src/App.tsx
  • frontend/src/LineageDag.tsx
  • frontend/src/PostBody.tsx
  • frontend/src/api.ts
  • frontend/src/components/CitationChip.stories.tsx
  • frontend/src/components/CitationChip.test.tsx
  • frontend/src/components/CitationChip.tsx
  • frontend/src/components/CutoffKnownBody.stories.tsx
  • frontend/src/components/CutoffKnownBody.test.tsx
  • frontend/src/components/CutoffKnownBody.tsx
  • frontend/src/components/LineageEntityPicker.stories.tsx
  • frontend/src/components/LineageEntityPicker.test.tsx
  • frontend/src/components/LineageEntityPicker.tsx
  • frontend/src/components/PopupCloseButton.stories.tsx
  • frontend/src/components/PopupCloseButton.test.tsx
  • frontend/src/components/PopupCloseButton.tsx
  • frontend/src/components/StatusAlert.stories.tsx
  • frontend/src/components/StatusAlert.test.tsx
  • frontend/src/components/StatusAlert.tsx
  • frontend/src/index.css
  • frontend/src/postBodyDisplay.test.ts
  • frontend/src/postBodyDisplay.ts
  • frontend/src/styles/tokens.css
  • frontend/tsconfig.app.json
  • lineageweave/__init__.py
  • lineageweave/abbreviation_tree_corroboration.py
  • lineageweave/chunking.py
  • lineageweave/corporate_hierarchy_resolution.py
  • lineageweave/customer_group_tree.py
  • lineageweave/embedded_image_payload.py
  • lineageweave/image_content.py
  • lineageweave/leftover_pairs.py
  • lineageweave/organization_name_resolution.py
  • lineageweave/period_report.py
  • lineageweave/tepp_client.py
  • lineageweave/tepp_result.py
  • migrations/0001_initial_schema.sql
  • migrations/0015_organization_name_resolution.sql
  • migrations/0016_cross_post_actor_identity.sql
  • migrations/0018_analysis_run_registry.sql
  • migrations/0019_role_catalog_identity.sql
  • migrations/0020_analysis_run_retention_purge.sql
  • migrations/0021_analysis_run_reconstruction.sql
  • migrations/0022_analysis_source_snapshot_member.sql
  • migrations/0023_analysis_run_outbox.sql
  • migrations/0024_source_post_revision.sql
  • migrations/0025_role_person_catalog_identity.sql
  • migrations/0026_report_leftover_pair.sql
  • migrations/0027_abbreviation_tree_corroboration.sql
  • migrations/0028_analysis_run_tepp_result.sql
  • migrations/0029_analysis_run_tepp_accepted.sql
  • migrations/rollback/0018_analysis_run_registry.sql
  • migrations/rollback/0019_role_catalog_identity.sql
  • migrations/rollback/0020_analysis_run_retention_purge.sql
  • migrations/rollback/0021_analysis_run_reconstruction.sql
  • migrations/rollback/0022_analysis_source_snapshot_member.sql
  • migrations/rollback/0023_analysis_run_outbox.sql
  • migrations/rollback/0024_source_post_revision.sql
  • migrations/rollback/0025_role_person_catalog_identity.sql
  • migrations/rollback/0028_analysis_run_tepp_result.sql
  • migrations/rollback/0029_analysis_run_tepp_accepted.sql
  • pyproject.toml
  • scripts/seed_demo_data.py
  • tests/fixtures/synthetic_invoice_embedded_image.html
  • tests/test_abbreviation_tree_corroboration.py
  • tests/test_analysis_run_authorization.py
  • tests/test_analysis_run_create.py
  • tests/test_analysis_run_outbox.py
  • tests/test_analysis_run_reconstruction_schema.py
  • tests/test_analysis_run_registry_schema.py
  • tests/test_analysis_run_scope_grouping_key.py
  • tests/test_analysis_run_start.py
  • tests/test_analysis_run_tepp_accepted_schema.py
  • tests/test_analysis_run_tepp_result_schema.py
  • tests/test_chunking.py
  • tests/test_corporate_hierarchy_resolution.py
  • tests/test_corporate_hierarchy_resolution_branches.py
  • tests/test_customer_group_tree.py
  • tests/test_customer_group_tree_labels.py
  • tests/test_documentation_hygiene.py
  • tests/test_embedded_image_payload.py
  • tests/test_image_content.py
  • tests/test_ingestion_transaction_contracts.py
  • tests/test_leftover_pairs.py
  • tests/test_organization_name_resolution.py
  • tests/test_person_mention_projection.py
  • tests/test_schema.py
  • tests/test_seed_analysis_run_reconstruction.py
  • tests/test_seed_late_demo_post.py
  • tests/test_seed_report_run.py
  • tests/test_seed_tepp_run.py
  • tests/test_source_post_revision.py
  • tests/test_tepp_public_content.py
  • tests/test_tepp_result.py
  • tests/test_tepp_transport_evidence.py
  • tests/test_tied_organization_no_create.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

<hidden_range_assignment>
<range_id>range_5f93e8a6a7f8</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_92d2c52aae4c</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_0f1274bd1162</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_56393412e8af</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_97b7588348c1</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_0e790d12ce70</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_69918025ead2</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_474b195d0152</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_6e454f39ce25</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_9409ec8bd628</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>prov-o-runtime</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_dca1261d9709</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_72639eca2bcc</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_58db3af7f839</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>prov-o-runtime</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_42561bd523e8</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_39c26d25bc24</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_faf4229c6aeb</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_6651bd0ed9a2</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_ca397baced1b</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_3f0d1bfea4c8</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_f11bd227c47c</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_60e4dab88f85</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_5e3fd07aad2e</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a6112fe2fabf</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_5308e220dc2c</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_3d803ebc1160</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_3cf67235574c</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_1859bd79f67b</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_bb70ab7a1a43</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a5c37f9abc28</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_091bcd0a00a6</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_8c3573b9282a</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_b692806900d9</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a1421220e332</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_d66e72876bfe</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_0dd02dbefd1f</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_93a44a46e8d2</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_0a667781c6de</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_13570485dee9</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_cc6692faff58</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_f23cd8c9a090</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_c516d7b27ed2</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_3b4f5170bc67</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a8a657b31480</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_6da1bcda82c9</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_4a44bad0397d</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a7ffd67c8b7d</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_9633f6afefb1</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_4551a7f2f0ef</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_b42698045405</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_39ed1efe6488</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_89c706581475</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_0ff37a7dc7f7</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>analysis-run-registry</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_9de82ebb64b4</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_3ae7b15e5b14</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_da21b19901fe</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_8e6db8381dbd</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_a9bb39160a8e</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_d2189a2224df</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_8cdb6fb0cfe2</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_b981bc14b01d</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_b7e26982c20a</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_44c15dfa8ba8</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_f58ca6013ba5</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_c705c3d483cd</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_e266e97ef1ad</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_7536b0be5cb0</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_d37411268668</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_776009437c6a</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>validation-and-frontend</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_fe1920dd0087</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>actor-model</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_f388cc80bc30</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_e7e329ba0b04</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_ffc4e6f58ac5</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_f5b325b0c335</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_c4730864daa7</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>
<hidden_range_assignment>
<range_id>range_822d141cee48</range_id>
<cohort_id>actor-provenance-analysis</cohort_id>
<layer_id>organization-resolution</layer_id>
</hidden_range_assignment>

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 R&R 및 행위자 온톨로지 변경을 정확히 설명하지만, PROV-O 계층과 분석 실행 레지스트리 등 주요 변경 범위를 충분히 반영하지 않습니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/role-responsibility-agent-ontology

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread lineageweave/post_summary.py Fixed
Drop real-organization names from docs, prompts, and comments. Seed a
synthetic organization actor so the Person/Organization badge is visible
without a live LLM, and reject unknown actor_type_code values.
PersonMention now carries an optional job_title extracted by the LLM
from role phrasing (e.g. "our legal counsel, Sam Okonkwo"), not just
named affiliations. cataloged_person.last_known_job_title persists it,
and _upsert_person treats a conflicting stated title as evidence that a
same-name match is a different real person rather than a re-mention,
so two "Kim Cheolsu"s with different titles get distinct person rows.
Keyman panel renders the title next to the person and per-affiliation
role_title, which existed in the schema but was never surfaced before.

Migration 0013 adds the column additively; 0001_initial_schema.sql
bakes it in for fresh installs, matching this repo's existing pattern.
After make seed, Ada West / Priya Nair / Jordan Hale carry last_known_job_title
so the new title chip is visible without a live extraction.
@seonghobae seonghobae changed the title feat: R&R's named actor is a PROV-O Agent, not always a person feat: R&R actor types + Keyman job titles (v0.69.0) Aug 14, 2026
Strix flagged the local-dev password literal in seed_demo_data.py after
this branch started editing that file. make seed still injects the
compose default; a direct script run requires KEYCLOAK_ADMIN_PASSWORD.
…70.0)

Real post text named a company sub-unit ("설계팀"/design team) that
neither ADR 0006's prov_person nor prov_organization fits -- it's part
of a company, not a person and not the company itself. actor_type_code
gains prov_team, grounded in the W3C Organization Ontology's
org:OrganizationalUnit (Reynolds, 2014), a different W3C vocabulary
from PROV-O that exists specifically for this meso-level case.

A team actor requires affiliated_organization_name in the same way a
person actor does -- unlike an organization actor, a team's own name
never answers "which company." Fixed a real bug the new type surfaced:
the R&R badge's label text was a binary Person/Organization ternary
that would have mislabeled a team as "Organization" (the CSS class
name was already generic; the display text was not).

Migration 0014 is purely additive (one lookup row insert), no schema
change -- actor_type_code already stores an arbitrary FK'd code.
Real post text names organizations by abbreviation ("한수원" for
"한국수력원자력") that corporate_hierarchy_resolution's character-
similarity matching cannot bridge -- an initialism shares almost no
substring with its expansion, so no similarity threshold recovers it.

New lineageweave/organization_name_resolution.py: an LLM proposes the
full name from context (or declines with UNKNOWN), then the *existing*
relation_verification Searxng client cross-verifies the specific raw/
resolved pairing -- no second web-search integration built, reusing
what this repo already has for a structurally identical problem. Only
a search-corroborated resolution is ever substituted in for
resolve_corporate_entity; an unresolved or unverified name still flows
through unchanged, same never-trust-an-unverified-guess discipline as
every other channel here.

Cached in a new organization_name_resolution table
(migrations/0015), keyed by the raw name so the same abbreviation
across many posts is resolved once, not re-queried every mention.
Grounded in SKOS skos:altLabel/skos:prefLabel (Miles & Bechhofer, 2009).

Wired into backend/app/keyman_ingestion.py's affiliation loop and the
private real-data batch script's paced re-implementation of it -- which
was also found missing role_title persistence entirely (a stale copy
predating that feature), fixed alongside this.

Known, documented gap (ADR 0008): the same request's entity-
relationship classification step still uses the raw, unresolved
organization names -- not fixed here, tracked honestly instead of
silently shipped as if both sides already agreed.
…atch (v0.72.0)

_parse_description required a single regex to match TEXT/CAPTION/TAGS
in that exact order in one pass. Reproduced live against real embedded
images from the Milestone 2 batch: real vision responses with the
content right but the formatting only mostly right (bolded labels,
reordered labels, a missing TAGS line) were rejected wholesale,
producing the same "[image: content unavailable]" placeholder as a
genuinely unconfigured vision channel -- discarding real,
already-paid-for content, not a "genuinely could not get it" case.

Each label is now parsed independently by scanning lines for a
TEXT:/CAPTION:/TAGS: prefix (tolerant of markdown emphasis and any
order); only a response with neither TEXT nor CAPTION content raises
ImageDescriptionParseError. Multi-line TEXT (real multi-line OCR
output) is still preserved with real newlines, not flattened.
…ity-agent-ontology

# Conflicts:
#	CHANGELOG.md
#	frontend/package.json
#	lineageweave/__init__.py
#	pyproject.toml
…v0.74.0)

Extraction runs per-post; a team or organization's identity did not
survive across posts the way a Keyman's already did via
cataloged_person -- "설계팀" named in ten posts was ten unrelated
strings, not one entity the KG could link through. Extraction results
must themselves become cross-post lineage clues, not just per-post
artifacts.

New cataloged_team catalog (migrations/0016), identity key (team_name,
affiliated_organization_name) since a bare team name is not by itself
identifying ("설계팀" exists at many real companies) -- reuses the same
resolve_corporate_entity matching Keyman affiliations already use for
the team's parent org, not a second algorithm. An organization actor
resolves against the existing corporate_entity catalog directly, no
new table needed.

knowledge_graph_edges_for_post gains three new edge kinds
(edge_mention_team, edge_team_affiliation, edge_mention_organization)
as distinct object properties, not widened domain/range on the
existing :mentions (which would let RDFS entail every :mentions
subject is both a person and a team). persist_post_summary now
resolves each R&R actor's identity and calls the same
persist_edges_for_post Keyman ingestion already uses -- one function
computes a post's whole edge set regardless of trigger.

A person R&R actor is opportunistically joined to an existing
cataloged_person row by name, never originated by R&R itself --
documented as a real, deliberate gap in ADR 0009 (cataloged_person
needs person_side_code, which R&R's prompt does not currently ask
for), not silently half-done.
@seonghobae
seonghobae marked this pull request as draft August 14, 2026 04:29
auto-merge was automatically disabled August 14, 2026 04:29

Pull request was converted to draft

…y (v0.75.0)

corporate_hierarchy_resolution's similarity matching only ever finds an
ALREADY-cataloged corporate_entity -- it has no path to create one.
Real Milestone 2 data confirmed the actual consequence: 0 of 4,154
person_affiliation rows and 0 of 9,852 R&R organization-actor mentions
ever resolved, because corporate_entity for the real dataset only holds
the employer's own 2-row hierarchy. The standing "통합 고객사 계열
tree AI" requirement (Samsung -> Samsung Electronics Korea -> ...) was
never actually populated for real extraction.

New lineageweave/corporate_hierarchy_inference.py: an LLM proposes a
Group/Company/Plant placement (level + parent name) from the post's
own text, or declines with UNKNOWN. New
backend/app/corporate_entity_ingestion.py's get_or_create_corporate_entity
tries similarity matching first (unchanged), then only creates a real
new row once the proposal is corroborated by the *existing*
relation_verification Searxng client -- no new search integration,
reusing the same reused-verification-client pattern ADR 0008 already
established. Recurses up a bounded (4-level) parent chain so the whole
hierarchy gets real parent_entity_id links, not an orphaned row.

Auto-created corporate_entity_code values are AUTO-<hash>-prefixed --
that column doubles as the real login corp-code Keycloak claim, so an
auto-created counterparty must never collide with that namespace.

Wired into both existing organization-resolution call sites
(keyman_ingestion.py's affiliation loop, post_summary_ingestion.py's
R&R organization-actor loop) rather than a third path, so both routes
to corporate_entity share one creation policy. Found and fixed a
pre-existing gap in backend/tests/test_api.py's seeded_db fixture along
the way: it never seeded the 'plant' corporate_entity_level lookup row.
Comment thread .github/workflows/prov-o-bootstrap.yml Fixed
Comment thread .github/workflows/prov-o-bootstrap.yml Fixed
seonghobae and others added 2 commits August 18, 2026 09:38
Seed synthetic Late Demo public post dated 2026-01-13. After make seed, the January 12 Demo Corp run lists Demo public post and omits Late Demo. Live post list still shows Late Demo. Reuses ADR 0016. No second cutoff. No invented theta.
get_or_create_corporate_entity's post-lock re-check (ADR 0012) used
the same fuzzy score_corporate_entity threshold (0.6) as real mention
resolution, but its actual purpose is narrower: catching a genuine
concurrent duplicate CREATE of THIS exact entity, per its own comment
("may have just created this exact entity"). A child whose name
contains its own just-created parent's name as a prefix -- exactly
the shape the customer-affiliate-tree hierarchy feature is built for
("Acme" -> "Acme Gwangju Plant") -- scores ~0.7 against that parent
alone under SequenceMatcher, so the child silently resolved to its
own parent's id instead of getting its own catalog row.

Fixed by requiring an exact post-normalization match
(min_similarity=1.0) for this specific re-check only; real fuzzy
mention resolution against the full candidate set (abbreviations,
legal suffixes, sibling disambiguation) is unchanged and still covered
by test_resolves_to_the_correct_sibling_not_a_different_one.

Also fixed test_start_analysis_run_recovers_the_a100_fork: it seeded
snapshot_sha256/configuration_sha256/code_revision_sha with
"t"/"u"/"v"-repeated literals, none valid hex, so its first insert
failed analysis_source_snapshot's own check constraint on every real
run.

Both bugs were caught locally, not by CI: this whole test module
requires a live PostgreSQL/Keycloak/Valkey stack
(pytestmark.skipif(not (postgres and keycloak and valkey))) that CI's
"Full test suite" job does not provide, so neither assertion has ever
actually executed across this branch's history. Confirmed via the
CI run log for the current head commit (465 passed, 106 skipped --
this module's tests are among the skipped).

Full suite green after the fix: 555 passed, 16 skipped. Frontend
build and Python compile also verified clean.

Co-Authored-By: Claude Sonnet 5 <[email protected]>

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UX critique (구매자 화면)

이 PR의 제품 표면이 엔터프라이즈 구매자 콘솔이 아니라 봇 메모장/샌드박스로 읽힌다. CI나 R&R 온톨로지 자체 문제가 아니다.

유지

  • Rankings fail-closed: Rankings · RankWeave not available
  • 리니지 요청 버튼은 계열사 로드 후 활성화
  • TEPP를 점수로 위장하지 않음
  • org 뱃지는 현재 #9a3412 / #fff3e0 (이전 #e65100 대비율 이슈는 해소된 것으로 보임)

바꾸어야 하는 IA

구매자 화면은 세 장만: 주간 VOC → 사건 lineage → 역할·책임. 감사는 주간 VOC에서 시작하고 다음 결정은 R&R에서 끝난다.

지금 홈은 고객그룹 트리 · analysis run · Rankings · 캘린더 · 기간 리포트 다음에야 DAG가 나온다. 온 이유가 맨 아래다.

같은 포스트인데 리스트에서 열면 요약→평가→Keyman→Event Lineage이고, Event Lineage에서 들어오면(focusEventLineage) 섹션 순서가 바렌다. 공간 기억이 안 생긴다.

제품 크롬이 아닌 것

분석 런 내부, TEPP 영수증/계약 단락, leftover 샌드박스, next-action 튜터(“X is current. Read Y next.”가 랜딩마다 쌓임), 에이전트 로그. 실패 닫힘 빈 상태는 세 화면에 남겨도 된다. 가짜 점수는 안 된다.

제목은 한글, Ask 플레이스홀더·next-action은 영어라 한 화면도 두 언어로 뛰다.

COMMENT only. 구매자 IA가 세 장으로 고정되기 전에는 이 헤드를 제품 UI로 보지 말 것.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Buyer chrome lock (design council)

#74 HEAD is the only product slice. Buyer chrome is three screens:

  1. Weekly VOC — pick this week's event
  2. Event lineage — follow the branch
  3. Role / responsibility — who did what, then the next decision (CTA on this screen only)

Tokens and Storybook modules attach on this branch only. Do not add:

  • agent log / bot chrome
  • leftover pairs / leftover sandbox
  • TEPP receipts
  • analysis-run registry UI
  • next-action tutor copy (*NextAction status lines, Ask seed tutor)
  • Valkey / orchestrator envelope / Keyverse / ThreadWeave / naruon mailbox fail-closed dumps

Fail-closed is a buyer state on those three screens, not a debug panel.

Existing frontend/src/components/* stories stay as primitives. Screen inventory is VOC / lineage / R&R only. No parallel cloud agent; no leftover PR for this chrome.

Copy link
Copy Markdown
Contributor Author

Cycle 2026-08-18T16:10 KST: GitHub writes are live again (comment/close/push). This comment is not APPROVE and is not a merge signal.

Exact head remains ab77644f90dc317d5f79c2ce83df969ff7a2e5ea (v2.10.0). Independent current-head APPROVE is still required. Do not self-approve. Do not squash from this author. Buyer IA successor stays on #251 (draft, stacked). Do not mix leftover/Rankings main slices into this branch.

Copy link
Copy Markdown
Contributor Author

Cycle 2026-08-18T20:00 KST: exact head ab77644 still needs independent current-head APPROVE. Owner COMMENT is not APPROVE. Do not push this head from the author token. Auto-merge stays on after independent APPROVE + exact-head required success.

Copy link
Copy Markdown
Contributor Author

Cycle 2026-08-18T20:00 KST write-retry.

Exact head ab77644f90dc317d5f79c2ce83df969ff7a2e5ea still open, blocked. No independent exact-head APPROVE. Owner/self COMMENT is not APPROVE. Do not push this head. Do not self-approve. Do not squash-merge.

Do not wait on Checks. Strix ModelBehaviorError remains fail-closed flake (0 vulns) — classifier still absent on ContextualWisdomLab/.github.

…12.5)

Both migrations picked "the" value from a `having count(*) = 1` group
via `min(uuid_column)` -- Postgres has no built-in min(uuid) aggregate,
so both failed outright the first time either actually ran against a
real, non-trivial dataset (0019: organization catalog backfill; 0025:
person catalog backfill, same pattern). Fixed to
`min(uuid_column::text)::uuid`, safe given the query's own
`having count(*) = 1` already guarantees exactly one value per group.

Applying the full migration set 0001-0029 against a real, long-lived
43,814-post dataset also surfaced that this database's original
bootstrap had left earlier migrations (0001, 0016) partially applied --
specific tables/indexes/backfills their own later statements defined
were missing even though their initial create-table statements had
run. All 29 migrations are now confirmed genuinely, fully applied end
to end, verified via direct schema comparison against every table/
index any migration defines, not assumption.

Also flags (does not fix, out of scope here) a real, deterministic,
pre-existing, CI-blind test failure in an unrelated feature area
(analysis-run/TEPP lifecycle) -- see CHANGELOG for the full
investigation. Confirmed via git diff this change touches nothing in
that code path.

Full suite: 553 passed (the 2 pre-existing failures above are the only
ones, both already present before this change and unrelated to it).

Co-Authored-By: Claude Sonnet 5 <[email protected]>

Copy link
Copy Markdown
Contributor Author

Queue 2026-08-19T03:12 KST. No commit pushed to this head (4b05b57a). Independent current-head APPROVE is still required. Weekly VOC (v2.12.0) is on a #258-stacked branch, not this one. I will not self-approve.

Copy link
Copy Markdown
Contributor Author

Queue 2026-08-19T06:03 KST. Exact head 4b05b57 has Tests / SAST / PROV-O / Strix success on this synchronize. No independent APPROVE on this head. I will not self-approve or merge. Model/Copilot review is not a substitute. Only collaborator is seonghobae; an independent reviewer still has to land current-head APPROVE.

@seonghobae
seonghobae merged commit 690f352 into main Aug 19, 2026
30 checks passed
seonghobae added a commit that referenced this pull request Aug 19, 2026
Record current protected main as an explicit parent after #74 was squash-merged independently. Preserve the newer Buyer/Global Ask/runtime tree on this branch, while keeping release metadata monotonic at 2.12.6. Exact-head CI and review evidence must be regenerated on this merge candidate.
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.

3 participants