From 6af3dc78967177948d9045c47a252b41f654f194 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 24 Aug 2026 03:19:37 +0900 Subject: [PATCH 1/3] docs: keep buyer-gap evidence non-identifying --- CHANGELOG.md | 3 +++ docs/product-technical-gap-baseline.md | 14 +++++++------- tests/test_documentation_hygiene.py | 8 ++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ed1a099..d547f7221 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ All notable changes to this project are documented here. Format follows ### Fixed +- The product-gap baseline now records private-runtime findings only as + aggregate synthetic-fixture contracts and identifies the existing + post-scoped lineage DAG without retaining post or organization identifiers. - `make smoke` and `make seed` now run through the locked project `uv` environment, so local OIDC and synthetic-data workflows resolve the same pinned dependencies as CI. diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index e65883463..c72d36efe 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,18 +1,18 @@ # Product & Technical Gap Baseline ## 1. Known Parsing & Frontend Display Gaps -- **Footnote Parsing**: `post=00505695-3e61-1fd1-83c5-263f88a9e77a` fails to recognize footnotes (li/oi level errors). -- **Table Parsing**: `post=00505695-3e61-1fd1-80c6-86bb61c8ddc5` completely fails at parsing tables. -- **Indentation**: Incorrect indentation rendering in `post=00505695-7571-1fd1-83c3-d521b187ad5b` and `post=00505695-3e61-1fd1-83c0-497b3c1c455e`. -- **Image/Table OCR**: `post=00505695-7571-1fd1-83dd-3d22a61a5734` fails text recognition for tables inside images, markdown parsing fails, and image OCR description is too shallow for Ontology & Semantics. -- **Math/Superscripts**: `post=00505695-9612-1fe1-83a7-e30153323f25` fails to parse superscripts like m^3 properly. Needs strict Ontology grammar for math formulas. -- **Missing UI Elements**: DAG (Directed Acyclic Graph) view is currently missing from the frontend for `post=00505695-7571-1fd1-83c5-895ed333cdbc`. +- **Footnote Parsing**: Keep this gap open until a synthetic nested-footnote fixture preserves list levels end to end. +- **Table Parsing**: Keep this gap open until a synthetic table fixture survives source parsing and buyer rendering. +- **Indentation**: Keep this gap open until synthetic continuation-line fixtures preserve semantic nesting without presentation-only alignment. +- **Image/Table OCR**: Keep this gap open until synthetic image-table fixtures prove region recognition, OCR, and ontology evidence through contextual-orchestrator. +- **Math/Superscripts**: Keep this gap open until synthetic formula fixtures preserve superscripts such as m^3 under the governed ontology grammar. +- **Missing UI Elements**: (Resolved) `EventLineageSection` renders `LineageDag` whenever the authorized post-scoped graph contains nodes. If an authorized runtime post still shows no graph, record only an aggregate, non-identifying reproduction and reopen this as a reconstruction-data gap. ## 2. LLM Extraction & Knowledge Graph Gaps - **Multiple Project Extraction**: (Resolved) LLM prompt updated to request key_events as objects with project_name, separating events correctly. - **5W1H Missing**: (Resolved) LLM prompt updated to explicitly request 5W1H evidence items in the JSON output array. - **R&R and Keyman Missing**: (Resolved) LLM prompt updated to explicitly instruct using actual stated names rather than collective titles. -- **Entity Resolution / Searxng**: Abbreviations like "한전" and "한국전력" are not mapped properly using Searxng and KG corroboration. +- **Entity Resolution / Searxng**: Keep this gap open until synthetic organization-alias fixtures prove abbreviation mapping with Searxng and knowledge-graph corroboration. - **Meso-level Team Mapping**: (Resolved) Checked extraction logic; `team` mapping logic is present and correct, but LLM needed better explicit instruction which is covered by R&R resolution. - **Base64 Image Omni-modal**: Current text-only embedding fails on images. Omni-modal LLM processing is required for images to capture layout, font size, colors, and spatial meaning. diff --git a/tests/test_documentation_hygiene.py b/tests/test_documentation_hygiene.py index 010bb5e5d..d90a752f3 100644 --- a/tests/test_documentation_hygiene.py +++ b/tests/test_documentation_hygiene.py @@ -8,6 +8,7 @@ _ROOT = Path(__file__).resolve().parents[1] _ADR_DIRECTORY = _ROOT / "docs" / "adr" +_PRODUCT_GAP_BASELINE = _ROOT / "docs" / "product-technical-gap-baseline.md" _ROLE_CATALOG_COLUMNS = ( "cataloged_team_id", "cataloged_corporate_entity_id", @@ -46,6 +47,13 @@ def test_adr_numbers_are_unique_and_documents_are_not_placeholders() -> None: assert duplicates == [], f"duplicate ADR numbers: {duplicates}" +def test_product_gap_baseline_contains_no_private_post_identifiers() -> None: + """Buyer-gap evidence stays aggregate and cannot identify private runtime posts.""" + baseline = _PRODUCT_GAP_BASELINE.read_text(encoding="utf-8") + + assert "post=" not in baseline + + def test_fetch_persisted_summary_reads_stored_catalog_ids() -> None: """ADR 0019 / 0027: fetch must not rejoin the catalog by a non-unique name.""" From aeb9af4e717cce0877acf6fe26d492ee60d80c7f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 24 Aug 2026 03:39:56 +0900 Subject: [PATCH 2/3] test: detect private post identifier variants --- tests/test_documentation_hygiene.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/test_documentation_hygiene.py b/tests/test_documentation_hygiene.py index d90a752f3..2258fb384 100644 --- a/tests/test_documentation_hygiene.py +++ b/tests/test_documentation_hygiene.py @@ -15,6 +15,12 @@ "cataloged_person_id", ) _ADR_NAME = re.compile(r"^(?P[0-9]{4})-.+\.md$") +_PRIVATE_POST_IDENTIFIER = re.compile( + r"(?ix)" + r"\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b" + r"|\bpost(?:_id)?\s*(?:=|:)\s*[`'\"]?[a-z0-9][a-z0-9-]{5,}" + r"|\bpost\s+[`'\"]?(?:[0-9][a-z0-9-]{5,}|[a-f][a-f0-9-]{7,})\b" +) _FORBIDDEN_MARKERS = ( "PLACEHOLDER_DO_NOT_WRITE", "TODO_WRITE_ADR", @@ -51,7 +57,17 @@ def test_product_gap_baseline_contains_no_private_post_identifiers() -> None: """Buyer-gap evidence stays aggregate and cannot identify private runtime posts.""" baseline = _PRODUCT_GAP_BASELINE.read_text(encoding="utf-8") - assert "post=" not in baseline + for private_reference in ( + "post=synthetic-12345", + "post: synthetic-12345", + "post 12345678", + "00000000-0000-4000-8000-000000000000", + ): + assert _PRIVATE_POST_IDENTIFIER.search(private_reference) + assert _PRIVATE_POST_IDENTIFIER.search("authorized post evidence remains aggregate") is None + + match = _PRIVATE_POST_IDENTIFIER.search(baseline) + assert match is None, f"private post identifier in product-gap baseline: {match.group(0)!r}" def test_fetch_persisted_summary_reads_stored_catalog_ids() -> None: From c2edd9c01585c45964d3c85b1ab8fa283b93e9b4 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 24 Aug 2026 03:54:00 +0900 Subject: [PATCH 3/3] test: avoid verbose identifier regex mode --- tests/test_documentation_hygiene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_documentation_hygiene.py b/tests/test_documentation_hygiene.py index 2258fb384..3b0f9829a 100644 --- a/tests/test_documentation_hygiene.py +++ b/tests/test_documentation_hygiene.py @@ -16,7 +16,7 @@ ) _ADR_NAME = re.compile(r"^(?P[0-9]{4})-.+\.md$") _PRIVATE_POST_IDENTIFIER = re.compile( - r"(?ix)" + r"(?i)" r"\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b" r"|\bpost(?:_id)?\s*(?:=|:)\s*[`'\"]?[a-z0-9][a-z0-9-]{5,}" r"|\bpost\s+[`'\"]?(?:[0-9][a-z0-9-]{5,}|[a-f][a-f0-9-]{7,})\b"