Skip to content

feat(dashboard): project typed operational evidence - #649

Merged
seonghobae merged 3 commits into
feat/dashboard-case-metricsfrom
feat/dashboard-ontology-projection
Aug 25, 2026
Merged

feat(dashboard): project typed operational evidence#649
seonghobae merged 3 commits into
feat/dashboard-case-metricsfrom
feat/dashboard-ontology-projection

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • require source-backed semantic target types for external-information relations
  • publish OWL/RDF-reified operations facts with PROV-O evidence lineage, without knowledge_graph_edge aliases
  • expose typed relation labels and bounded JSON-LD on the Dashboard

Evidence

  • backend focused: 69 passed
  • frontend: lint, 384 tests, build, Storybook build passed
  • broader pytest reached 1187 passed / 12 skipped; pre-existing live API fixture duplicate snapshot errors were unrelated; ontology publication failures found during that run were fixed and revalidated

Stack


Open in Devin Review

@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.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6ea99518-fda5-44e9-8343-b0b14c0beaf2

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Reviewed exact head 2bf34931971f6770cff56f2c7d92a1abe81bd048 after syncing the current parent branch. The parent had advanced, so the branch now contains the parent merge without force-pushing. I also resolved the test conflict by retaining both the typed external-relation coverage and the required-question subset assertion.

One migration-number collision was found with the independently queued 0212 knowledge-cutoff migration. The operations target migration is now 0213_operations_external_relation_target.sql, and its schema test reference follows it; SQL is otherwise unchanged. This keeps sorted replay deterministic.

Local evidence: uv run --extra dev --extra backend pytest -q tests/test_operations_case_analysis.py tests/test_operations_case_ingestion.py tests/test_operations_dashboard.py tests/test_schema.py -k 'operations or migration' → 20 passed, 17 deselected.

@seonghobae
seonghobae merged commit 2165a5d into feat/dashboard-case-metrics Aug 25, 2026
3 of 4 checks passed
@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head follow-up: Storybook EvidenceReady was rebuilt and rendered at 1440x1100 with synthetic data after the semantic target-label spacing fix. Visual inspection confirmed the external-information card shows 업무 관계 · 프로젝트 distinctly from its value, with no card overflow. Screenshot remains local and non-identifying per ADR 0001. Focused component test: 8 passed; Storybook build passed.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 2 potential issues.

Open in Devin Review

Comment on lines +158 to +174
relation_target_kind = fact.get("relation_target_kind_code")
if (
not isinstance(value, str)
or not value.strip()
or not isinstance(fact_evidence, str)
or not fact_evidence.strip()
or fact_source is None
or fact_evidence not in fact_source.text
or (
fact["fact_type_code"] == "external_relation"
and relation_target_kind not in EXTERNAL_RELATION_TARGET_KINDS
)
or (
fact["fact_type_code"] != "external_relation"
and relation_target_kind is not None
)
):

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📝 Info: Parse validation is intentionally stricter than DB constraint

parse_operations_case_response (lineageweave/operations_case_analysis.py:158-174) rejects external_relation facts with no valid relation_target_kind_code and non-external facts that carry one. The migration CHECK still permits null on external_relation rows for legacy data; the dashboard projects those as untyped. The asymmetry is deliberate and matches the ADR.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +82 to +86
"http://www.w3.org/1999/02/22-rdf-syntax-ns#object": {
"@id": f"{case_id}:fact:{ordinal}:target",
"@type": target_class,
"http://www.w3.org/2000/01/rdf-schema#label": fact["value_text"],
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📝 Info: Reified relation object is a synthetic node, not a resolved entity

For external_relation facts, _operations_case_jsonld sets the reified rdf:object to a minted URN {case_id}:fact:{ordinal}:target typed as the target class with rdfs:label = value_text, not a resolved Order/Project/Sales entity IRI. Downstream consumers get an unlinked target node per fact.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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