Skip to content

docs: add ecosystem ownership map and G-17..G-22 gap entries - #1696

Open
seonghobae wants to merge 37 commits into
mainfrom
docs/gap-baseline-ownership-map-and-g17-g22-20260902
Open

docs: add ecosystem ownership map and G-17..G-22 gap entries#1696
seonghobae wants to merge 37 commits into
mainfrom
docs/gap-baseline-ownership-map-and-g17-g22-20260902

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Documentation/traceability update for the control-plane product gap ledger:

  • add §2.4 ecosystem canonical-owner map using responsibility/reuse/implementation/consumption boundaries;
  • add G-17 through G-22 for provider-capability routing, model-timeout administration, executed UI latency evidence, versioned DB-backed i18n authority, Rust-first hot-path/exception evidence, and DB column naming/migration coverage;
  • add docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md with exact-head evidence, policy-vs-research distinctions, revalidation rules, and APA 7th references.

Live authority boundary

ContextualWisdomLab/contextual-orchestrator#1017 is open/Proposed, not protected-main production authority. At the latest audit its exact head is fe043f4e6db8b24a6ab719fc5801bbbf40e046ae, while protected ContextualWisdomLab/contextual-orchestrator main is 8839081659df587b19642be17b9114f9dee8b666. The doctoring note records this explicitly so the G-17 repair is not mistaken for a released owner contract.

G-19's p95 <= 20 ms is an explicit ContextualWisdomLab SLO, not a claim that peer-reviewed HCI literature establishes 20 ms as a universal threshold. G-18 distinguishes a null/default model execution timeout from provider/network communication failure and connection lifecycle. G-20 and G-21 likewise identify organization architecture requirements rather than presenting them as external standards.

Current-main reconciliation

The branch was reconciled non-destructively onto protected .github main after concurrent control-plane merges. No force push or destructive rebase was used. The effective delta is now only:

  1. docs/product-technical-gap-baseline.md
  2. docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md

Runtime/router files that appeared on predecessor history are not in the current effective delta; obsolete review threads on those files were resolved only after this was proven by current-main comparison.

Validation

  • Existing focused contract: python -m pytest tests/test_product_technical_gap_baseline.py -q -> 5 passed on the documentation delta before the latest evidence-note commit.
  • Fresh exact-current-head GitHub Checks/reviews remain authoritative; predecessor evidence does not transfer.
  • This PR is not complete until current substantive review findings are proven resolved and ordinary protected merge admission succeeds.

seonghobae and others added 20 commits September 1, 2026 15:08
…-agent boundary

The shared trailing lookahead excluded a following letter, digit,
underscore, hyphen, or slash, but not a following "?", so a query string
glued directly onto the alias with no separator (/oc?mode=docs,
/opencode?next=x) still matched as a complete mention.

Reported by CodeRabbit on this feature's predecessor PR (#1558, now closed
in favor of this clean stack on #1554). Reproduced first, then added "?" to
the same shared trailing exclusion, verified against the full existing
accept/reject matrix plus the new query-string cases before applying.

Full suite: 2278 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained.
…ix a regression

Two real findings on this exact head (both Devin):

1. (New bug) The bare /opencode and /oc forms' boundary excluded neither a
   preceding "#" (a URL fragment identifier: https://example.com/#/oc) nor
   a following "." (a dotted filename continuation: /oc.json), and the
   trailing boundary used a plain ASCII character class, so a following
   non-ASCII word character was never excluded (/océan, where "é" is a
   Unicode letter outside [A-Za-z0-9_/?-]).

2. (Regression, introduced by the immediately preceding commit) Adding "?"
   to the shared trailing lookahead affected all three opencode-agent
   alternatives, not just the bare-slash forms it was meant for, so
   "@opencode-agent?" and "@cwl-noema-review/@opencode-agent?" — ordinary
   sentence punctuation, not a URL query string — stopped dispatching.

Root cause of both: a single trailing lookahead shared across the whole
alternation can't express "exclude ? only for these two alternatives,
exclude . and # only for these two, but not those." Fixed by giving each
alternative its own leading and trailing lookaround instead of one shared
lookahead outside the group, and switching every boundary in this module
from an ASCII-only character class to Python's Unicode-aware `\w` (which
also closes the same class of gap for the @-mention forms, e.g.
"café@opencode-agent", not just the reported bare-slash cases).

While redesigning, also closed a previously-flagged, out-of-scope gap:
`cwl-noema-review`'s own pattern didn't exclude a preceding "/", so
"docs/@cwl-noema-review/@opencode-agent" still fired Noema (flagged but not
fixed in an earlier round on this same PR chain, since fixing it then would
have needed exactly this per-alternative-boundary work to avoid breaking
the "@cwl-noema-review/@opencode-agent" separator's own recognition of the
Noema mention preceding it).

Verified with a from-scratch script against all ~35 accumulated accept/
reject cases from every prior round on this file before touching source,
catching two design mistakes (a leftover shared trailing "/" that broke the
separator form, and a dropped hyphen exclusion) before they ever reached
the test suite.

Full suite: 2285 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained. git diff --check clean.
…rator

The bare /opencode and /oc forms' boundary excluded neither a following
"%" (a percent-encoded path continuation: /oc%2Fconfig) nor a preceding
":" (a URI scheme separator: scheme:/oc, app:/opencode), so both still
matched as complete, standalone mentions.

Reported by Devin on this PR's current head. Reproduced first, then added
"%" and ":" to that alternative's own leading/trailing exclusion set
alongside the ".", "/", "?", "=", and "#" already excluded there. Verified
against the full accumulated accept/reject matrix (41 cases from every
prior round on this file) before applying.

Full suite: 2289 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained.
Protected main regressed to 99% scripts/ci coverage after #1546 added
live_head_matches, a no-active/no-stale fall-through in
prepare_autofix_slot, and an "already queued or running" wait branch
to pr_review_fix_scheduler.py without covering them, while the
pre-existing inspect_pr conflicted-draft/conflicted-unauthorized
returns and pr_review_merge_scheduler.py's
fetch_workflow_names_by_check_suite_rest pagination/filtering/
permission-denied paths stayed untested. Every PR rebasing onto main
inherits this via the coverage-evidence required check regardless of
its own diff. Test-only change; no production code touched.
The tenth-round fix added both "%" and ":" to the SAME leading-and-trailing
exclusion set for the bare /opencode and /oc forms, but each character is
only ever a URL/path continuation indicator from the direction it actually
appears in a URL:

- "%" starts a percent-encoding escape (%2F), which only ever continues a
  path FORWARD (/oc%2Fconfig) — a preceding "%" (100%/oc) is not a
  URL-encoding pattern.
- ":" separates a URI scheme from its path (scheme:/oc), which only ever
  precedes the alias — a following ":" (/oc:) is not a scheme separator.

Excluding "%" on the leading side and ":" on the trailing side too had no
motivating false-positive case and instead rejected ordinary usage
(reported by Devin on this PR's current head): "/oc:" (colon as a label
separator after the command) and "100%/oc" (a percentage immediately
before a command, no space).

Fixed by splitting the shared set into direction-specific leading
(".", "/", "?", "=", "#", ":", plus \w and "-") and trailing (".", "/",
"?", "=", "#", "%", plus \w and "-") exclusion sets. Verified against the
full accumulated accept/reject matrix (43 cases from every prior round on
this file) before applying.

Also fixes an unrelated, pre-existing test-harness flake this branch
inherited: tests/test_opencode_required_verdict_regression.py's fake `gh`
script didn't drain stdin before exiting on the dispatches branch, so the
upstream `jq -cn | gh api --input -` pipe intermittently received SIGPIPE
under `set -o pipefail` (exit 141) — a timing race, not a production bug
(the real `gh api --input -` does read its stdin). Root-caused and fixed
the same way as the already-diagnosed instance of this flake elsewhere in
this PR chain: `cat >/dev/null` before recording the dispatch. Verified
with 20 consecutive clean runs of the previously-flaky test after the fix.

Full suite: 2293 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained.
Distinguishing "/oc:" (accept: a colon used as a label separator, at end
of string or before a space) from "/oc:config" (reject: a colon-delimited
path segment) needs more context than a single trailing character can
express — both have ":" as the character immediately after the alias.
Likewise "100%/oc" (accept: a percentage before a command) from
"docs/%/oc" (reject: a literal "%" path segment) both have "%" as the
character immediately before the alias.

Reported by Devin on this PR's current head. Reproduced first
(/oc:config and docs/%/oc both matched before the fix). Fixed by adding
two fixed-width two-character lookarounds on top of the existing
single-character exclusion sets, rather than widening those sets (which
cannot distinguish the accept case from the reject case sharing the same
immediate character):

- `(?<!/%)` before the alias: rejects a "%" immediately preceded by a
  path separator (a literal "%" path segment), while still accepting a
  "%" preceded by a digit/word (a percentage).
- `(?!:\w)` after the alias: rejects a ":" immediately followed by a word
  character (a colon-delimited path segment), while still accepting a ":"
  at end of string or followed by non-word text (a label separator).

Verified against the full accumulated accept/reject matrix (47 cases from
every prior round on this file) before applying.

Full suite: 2297 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained.
Adds a dated traceability entry for the coverage gap this PR closes:
root cause (#1546's uncovered additions plus the older #1547/#1551/
#1554 gap, neither of which merged or transfers evidence here), the
fix and its verification, the resolved Devin false-positive on
sub-clause coverage, and the known pre-existing SIGPIPE test flake
left unremediated as out of scope.
…sh too

The twelfth-round fix's trailing colon lookaround, (?!:\w), only rejected
a colon immediately followed by a word character (/oc:config), so a colon
immediately followed by a slash (/oc:/config, /oc://foo) still matched —
exactly as much a path/URI structure as the word-character case, just
missed because the lookaround checked for a word character specifically
instead of "word character or slash".

Reported by Devin on this PR's current head. Reproduced first
(/oc:/config and /oc://foo both matched before the fix). Fixed by widening
(?!:\w) to (?!:[\w/]), still leaving the true accept case ("/oc:" at end
of string, or followed by a space or other non-word/non-slash text)
untouched.

Verified against the full accumulated accept/reject matrix (50 cases from
every prior round on this file) before applying.

Full suite: 2301 passed, 1 skipped, 21 subtests passed. 100% coverage and
100% docstrings maintained.
The former scheduler-coverage base #1554 closed unmerged while #1567 became the canonical current-main owner. Preserve #1559's current four mention-router owner blobs exactly on top of #1567, including the latest parser/rejection regressions, and exclude the unrelated SIGPIPE fixture change owned by #1561. This is a normal history-preserving merge; no predecessor checks or reviews transfer.
Advance the mention-router stack to #1567's new exact head after its traceability-only product-gap baseline commit. Preserve the current four mention-router owner blobs exactly and keep the separately owned SIGPIPE fixture out of this tree. Normal non-force history; no stale evidence transfer.
Raise scoped docstring coverage for the newly added scheduler REST regression helpers to 100% without changing test behavior or production code.
Advance the mention-router stack to #1567's exact head after its scoped 100% docstring repair. Preserve the four mention-router owner blobs exactly and keep unrelated SIGPIPE fixture ownership separate. Normal non-force history; no stale evidence transfer.
…-alias-stacked-1554

# Conflicts:
#	CHANGELOG.md
#	docs/product-technical-gap-baseline.md
Bring the mention-router PR current with main (advanced via #1227,
#1617, and other independently merged fixes) so its stalled/queued
checks re-run against an up-to-date head instead of a stale one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX
Pick up main's #1635 fix for the docs-index probe JSON-fixture
regression in test_repository_metadata_reconciliation.py (the same
issue this branch's prior merge commit had discovered and locally
worked around, but the working-tree fix was never actually committed
before the previous push).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX
Adds §2.4 (canonical-owner map transcribing the standing directive's
~25-repository ownership assignment, so future work chooses a repository
by product-responsibility boundary rather than by name) and six new Gap
register rows:

- G-17: provider-group-name hardcoding in contextual-orchestrator's
  proxy_capability() (confirmed and fixed in
  ContextualWisdomLab/contextual-orchestrator#1017), distinguished from
  the legitimate ZDR-attestation-ledger non-violation in zdr_policy.py
  and the NIM-removal-migration-superseded instance in
  run_opencode_review_model_pool.sh.
- G-18: missing LLM model-timeout admin console (per-model view/set/
  clear/restore, no global ceiling, cancellation-cause attribution).
- G-19: no executed p95<=20ms E2E performance evidence in any UI-owning
  repo.
- G-20: no i18n-as-versioned-DB-resource architecture found.
- G-21: Rust-preference tightening not yet reflected in
  contextual_orchestrator's own Python hot paths, no per-exception ADR.
- G-22: two confirmed DB column-naming violations (agent_pool,
  orchestration_records) invisible to the existing table/index/view/
  sequence/constraint-only naming static analysis.

Also appends a dated narrative entry documenting the #1017 audit and fix,
matching this document's established per-increment log convention.

Verified: tests/test_product_technical_gap_baseline.py passes (5 passed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX
@coderabbitai

coderabbitai Bot commented Sep 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 11 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 518ae055-7431-463f-8ac3-40d9c76d9995

📥 Commits

Reviewing files that changed from the base of the PR and between 7827191 and 342fac8.

📒 Files selected for processing (2)
  • docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
  • docs/product-technical-gap-baseline.md

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 seonghobae added documentation Improvements or additions to documentation priority: medium Normal-priority or P2 work status: draft Draft pull request type: docs Documentation, ADR, PRD, or technical writing labels Sep 2, 2026 — with ChatGPT Codex Connector
The 2026-09-02 narrative entry for contextual-orchestrator#1017 claimed the
"routing" -> "routing_config" KV category rename had "zero orphaning risk."
PR reviewer seonghobae correctly identified this as false for the
Postgres-backed production boundary (pg_llm_batch.PostgresConfigStore keys
com_config by the literal f"{category}.{key}" primary key, so the call-site
rename alone orphans any already-persisted routing.<key> row). Updates the
entry to describe the actual fix: an idempotent, additive-only backfill
migration landed in the same PR, plus the RED-before-GREEN test evidence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX
@seonghobae
seonghobae marked this pull request as ready for review September 2, 2026 07:16
devin-ai-integration[bot]

This comment was marked as resolved.

…ership-map-and-g17-g22-20260902

# Conflicts:
#	docs/product-technical-gap-baseline.md

Copy link
Copy Markdown
Contributor Author

This PR's diff had gone stale (branch was 2 commits behind main), which caused Devin Review's 4 comments to fire against scripts/ci/agent_mention_router.py, .github/workflows/agent-mention-router.yml, and docs/automation/review-agent-comment-invocation.md — files this PR never touches. I verified directly (git diff origin/main on those paths returned empty before the merge) and merged main into this branch to bring the diff current; it now shows only docs/product-technical-gap-baseline.md, this PR's actual and only change. The merge itself needed conflict resolution in two spots in that same doc (a G-16 row main had independently gained, and two dated narrative sections appended near-simultaneously) — both resolved additively, keeping both sides' content, matching this document's established resolution convention. tests/test_product_technical_gap_baseline.py passes on the merged head; the full suite was also re-verified (minus two newly-merged, unrelated test files that only parse on Python ≥3.12 due to nested f-string syntax — confirmed via ast.parse on 3.12/3.13, not a real CI issue, just this sandbox's older default interpreter).


Generated by Claude Code

Devin Review correctly caught that this document lives in .github, so a
bare "#1017" reference resolves to #1017 (an
unrelated PR) instead of the intended
ContextualWisdomLab/contextual-orchestrator#1017 -- breaking traceability
and matching this repo's own binding convention (CLAUDE.md /
docs/CWL-MASTER-CONTEXT.md section 7: cross-repo references as
owner/repo#num or full URLs). Qualifies the three remaining
under-qualified references (the G-17 row's "priority action" cell, the
dated section heading, and its "Status" paragraph's "until #1017 merges"
line) to the full ContextualWisdomLab/contextual-orchestrator#1017 form,
matching the convention already used correctly elsewhere in the same
section.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Good catch — fixed in 528a5844. Three bare #1017 references (the G-17 row's action cell, the dated section heading, and its Status paragraph) resolved to ContextualWisdomLab/.github#1017 since this doc lives in .github, breaking the cross-repo link to the actual contextual-orchestrator#1017. All three now use the fully-qualified ContextualWisdomLab/contextual-orchestrator#1017 form, matching this repo's own binding convention and the correct form already used elsewhere in the same section. tests/test_product_technical_gap_baseline.py still passes (5 passed).

On the two remaining analysis notes: the "external gap evidence needs revalidation" and "new gaps lack APA/doctoring traceability" notes are fair characterizations of this document's inherent nature (a live, continuously-revalidated snapshot per its own header disclaimer, not a static authority) rather than defects introduced by this specific change — G-18 through G-22 are audit findings recording an absence (no evidence found), not new features being implemented, so they don't yet have their own research citations to attach. Leaving those as-is; happy to revisit if you see a more specific actionable gap.


Generated by Claude Code

devin-ai-integration[bot]

This comment was marked as resolved.

…ategories

Devin Review correctly noted that wrapping ContextualWisdomLab/
contextual-orchestrator#1017 in backticks prevents GitHub's cross-repo
autolinking even after qualifying it with the owner -- inline code spans
are never autolinked. Removes the backtick wrapping from all three
occurrences (G-17's observation and priority-action cells, the dated
entry's Status paragraph) plus the Fix paragraph's occurrence for
consistency, while leaving every other backtick-wrapped identifier
(module/function/class names) untouched.

Also refines §2.4's ecosystem canonical-owner map to match the standing
directive's newer, more precisely-categorized breakdown: previously
grouped pairs (enterprise-architecture-core+context-graph-contracts,
ConceptWeave+semantic-data-portal, contextual-orchestrator+noema,
appguardrail+wardnet) are now listed as distinct rows with their actual
individually-scoped responsibilities, organized under five explicit
categories (조직·계약, 의미·데이터, AI·운영, Identity·보안·runtime, 재사용
기능) plus the existing domain-product-consumer row, matching the
"core foundation is a selective control plane per responsibility, not a
shared installation" framing.

Verified: tests/test_product_technical_gap_baseline.py passes (5 passed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Right — qualifying the owner wasn't enough since inline code spans are never autolinked by GitHub. Fixed in 44c2117c: removed the backtick wrapping from all cross-repo ContextualWisdomLab/contextual-orchestrator#1017 occurrences (the G-17 row's two cells, the Fix paragraph, and the Status paragraph), leaving every other backtick-wrapped code identifier untouched. Also took the opportunity to refine §2.4's ownership map to the more precisely-categorized per-repo breakdown from the latest standing directive text (previously-grouped pairs are now distinct rows under five explicit categories). tests/test_product_technical_gap_baseline.py still passes.


Generated by Claude Code

devin-ai-integration[bot]

This comment was marked as resolved.

seonghobae and others added 2 commits September 2, 2026 17:02
Devin Review findings on PR #1696:

- The "no duplicating immature core in consumers" principle was cited as
  living in this document's own §5, but §5 is "실행 루프와 고객의 다음
  행동" (the execution loop) and does not discuss duplication at all --
  a dangling internal reference. The principle is actually defined right
  here in §2.4 itself; the citation now says so and points out §5 is
  unrelated, instead of pointing at the wrong section.
- The ownership-map row for `noema` listed only its GitHub Actions OIDC
  token-exchange role, dropping the established "공유 agent runtime·
  GitHub review agent" (shared agent runtime / GitHub review agent) role
  documented in docs/CWL-MASTER-CONTEXT.md:36. Restored both
  responsibilities in the row so the map doesn't leave that existing
  capability without a stated owner.

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Pushed a follow-up commit (b7cbfc24) addressing this round's Devin Review findings on docs/product-technical-gap-baseline.md:

  • Fixed the broken §5 cross-reference: §2.4's intro paragraph cited "§5의 'no duplicating immature core in consumers' 원칙," but this document's §5 is "실행 루프와 고객의 다음 행동" (the execution loop) and never discusses duplication — a dangling internal reference. The principle is actually defined right there in §2.4 itself; the citation now says so explicitly and notes §5 is unrelated, rather than pointing at the wrong section.
  • Restored noema's shared-runtime role: the §2.4 ownership-map row for noema listed only its GitHub Actions OIDC token-exchange responsibility, dropping the established "공유 agent runtime·GitHub review agent" (shared agent runtime / GitHub review agent) role documented in docs/CWL-MASTER-CONTEXT.md:36. Restored both responsibilities in the row.

On the two lower-priority analysis notes from this same round (unlimited-timeout risk in G-18, no-evidence-for-p95≤20ms in G-19, over-constrained i18n architecture in G-20, unproven Rust-conversion scope in G-21): these are critiques of the substance of the user's own explicit, repeatedly-stated standing directive requirements, not transcription errors on my part. I'm not unilaterally softening or contradicting those gap descriptions based on an automated reviewer's opinion of the user's own deliberate design decisions — noting the critique here rather than silently overriding explicit repeated instructions.

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).


Generated by Claude Code

Preserve the docs-only ecosystem ownership map and G-17..G-22 product-gap delta while integrating protected main acbb8e7. The effective delta remains docs/product-technical-gap-baseline.md only. Two-parent reconciliation preserves both histories without force-push or destructive rebase.
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 8 new potential issues.

Devin Review

Comment thread docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
Comment thread docs/product-technical-gap-baseline.md Outdated
Comment thread docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
Comment on lines +134 to +139
| G-17 | `contextual-orchestrator`의 `proxy_capability()`가 이미지-생성 엔드포인트를 `agent.provider_name == "openrouter"` 리터럴 비교로 재작성했다(provider 식별자를 라우팅 조건으로 하드코딩 — 확인·수정됨: ContextualWisdomLab/contextual-orchestrator#1017, `ModelAgent.image_generation_endpoint` 선언적 capability 필드로 교체). `scripts/ci/run_opencode_review_model_pool.sh`의 `is_nvidia_nim_candidate()`도 provider-prefix 문자열 비교로 같은 패턴을 갖고 있으나, 이는 NIM 직접 통신 제거 마이그레이션(§8 orchestrator/free 고정)으로 대체될 예정이라 별도 fix 대상에서 제외했다 | provider GROUP명이 라우팅/선택/failover 조건에 남아 있으면 신규 provider 추가·제거 시 코드 변경이 필요해지고, "표시/관리자 별칭"이라는 정책이 실제로 지켜지지 않는다 | ContextualWisdomLab/contextual-orchestrator#1017 병합 후, 조직 전체(§2.4 ownership map의 LLM 게이트웨이 소비 저장소 포함)에서 provider 이름 문자열 비교로 라우팅/선택/failover를 분기하는 잔여 코드를 grep-detect 회귀 테스트로 고정하고, `run_opencode_review_model_pool.sh`는 NIM 제거 PR에서 함께 정리한다 |
| G-18 | LLM 모델 타임아웃에 앱/에이전트/게이트웨이 전역 우선순위 상한이 존재하며, 모델별 조회/설정/해제/복원을 제공하는 관리자 웹 콘솔이 `contextual-orchestrator`에 없다. 취소 사유(사용자 취소/provider 종료/관리자 설정 타임아웃)를 구분해 귀속하는 계약도 없다 | 추론·스트리밍·툴콜링이 실제로 진행 중인데 경과 시간만으로 요청이 끊기면, 정상적으로 응답을 생성하던 고가 요청이 낭비되고 원인도 알 수 없다 | 기본값을 무제한/null로 바꾸고 통신 실패는 upstream provider 자체 timeout/error로만 종료되게 하며, `/admin` 콘솔에 모델별 타임아웃 view/set/clear/restore(단위, 우선순위, 상속, 입력 검증, 감사 추적)와 `/api/v1/*` 계약, 취소-사유 귀속 필드를 추가한다. 소유 저장소는 `contextual-orchestrator`다 |
| G-19 | 반복 웹 페이지 E2E 성능에 대해 예외 없는 p95 ≤20ms 하드 게이트와 표본 축소·느린 측정 배제·비현실적 캐시 예열 금지 조항이 어떤 UI 소유 저장소에도 k6/Playwright 등 executed 증거로 존재하는지 미확인이다 | 실측 없이 "빠르다"고 주장하면 실제 고객이 체감하는 지연이 방치된다 | UI 소유 저장소별로 페이지 단위 k6/Lighthouse-CI p95 측정을 CI 필수 증거로 추가하고, 위반 시 원인이 JS 번들 크기·힙·DOM·hydration·메인스레드 블로킹·GC 등 구조적이면 최적화가 아니라 프론트엔드 스택 교체를 ADR로 기록한다. Figma File ID N/A인 이 저장소는 게이트 정의만 문서화하고, 실측/교체는 각 UI repo 소유다 |
| G-20 | 번역(i18n)이 버전관리되는 DB 자원으로 관리되고, 서버/네이티브가 화면별 필요한 키만 캐싱해 가져오며, 전체 카탈로그를 브라우저에 내려보내지 않는 아키텍처가 어느 소비 저장소에도 확인되지 않았다. 번역 리뷰/승인/배포/롤백 API와 관리 UI를 소유하는 저장소도 없다 | 번역 파일/JS 번들 방식은 배포 없이 문구를 고칠 수 없고, 전체 카탈로그 다운로드는 SPA를 가정하지 않는 서버/네이티브 화면에서 낭비와 불일치를 만든다 | 기존 저장소 중 적합한 곳이 없으면 전용 신규 저장소(번역 DB, 화면별 key 캐시 API, 리뷰/승인/배포/롤백 API+관리 UI)를 신설하고 §2.4 ownership map에 추가한다. Keyverse는 인증 백엔드로만 유지하고 로그인/가입/복구 UI는 각 제품이 자체 구축한다 |
| G-21 | 수리과학/psychometrics/EDA core뿐 아니라 성능·안정성·보안이 중요한 모든 런타임 경로에서 Python이 기피 대상이 됐으나, 현재 `contextual_orchestrator/`의 다수 모듈(`orchestrator.py` 등 도메인 핵심)이 여전히 Python으로 구현되어 있고 각 예외에 대한 전용 ADR(제거 조건 명시)이 없다 | 속도·안정성·보안이 중요한 경로가 Python GIL/성능 한계에 계속 노출되고, 예외 기준이 문서화되지 않아 재검토 시점을 판단할 수 없다 | Rust 경계로 분리 가능한 hot path(예: token counting, redaction, cost ledger 연산)를 식별해 Rust API 경계로 전환하거나, Python-전용 ML 런타임 의존처럼 불가피한 경우 제거 조건을 명시한 전용 ADR을 `contextual-orchestrator`/`fast-mlsirm`/`TEPP` 등 소유 저장소에 남긴다 |
| G-22 | DB 객체명 규칙(두 단어 이상 snake_case 우선) 위반이 `contextual_orchestrator/orchestrator.py`의 `agent_pool`(단일어 컬럼 `priority`/`disabled`)과 `orchestration_records`(단일어 컬럼 `kind`/`key`/`payload`/`seq`) 테이블에 남아 있다. `conventions.require_object_name()`과 `tests/test_database_object_naming.py`는 테이블/인덱스/뷰/시퀀스/제약 이름만 검사하고 `CREATE TABLE` 본문의 컬럼명은 검사하지 않아 이 위반이 회귀 게이트를 통과했다 | 컬럼명 불일치가 누적되면 신규 기여자의 스키마 이해 비용이 커지고, 명명 규칙이 실제로는 부분적으로만 강제된다는 사실이 감춰진다 | 기존 sqlite 영속 상태를 깨지 않는 마이그레이션(컬럼 rename + 하위호환 읽기 경로 또는 명시적 1회성 migration script)을 설계하고, `test_database_object_naming.py`의 static-analysis 범위를 컬럼명까지 확장해 동일 위반의 재발을 막는다 |

@devin-ai-integration devin-ai-integration Bot Sep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔍 Fresh gaps retain an older snapshot date

September gap evidence now appears under an August file-level snapshot date. The inventory disclaimer prevents misuse, but row-level dates would reduce ambiguity.

Devin Review

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

Comment thread docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
Comment thread docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
Comment thread docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md
Devin Review on PR #1696 (based_on_repo_rules: true): the §2.4 ownership
map assigns isolation to quarantine-sandbox-runtime as a single-responsibility
owner, but the mandatory docs/CWL-MASTER-CONTEXT.md:36 describes noema as
"agent runtime... + the lightweight quarantine sandbox" -- the same
responsibility assigned to a different repository.

Not resolving this unilaterally: deciding which source is authoritative (or
whether these are genuinely distinct tiers -- noema's own lightweight
embedded sandbox vs. a dedicated org-wide isolation service) is an
architectural decision this doc has no authority to make on its own.
Added a footnote on the quarantine-sandbox-runtime row documenting the
conflict, the two plausible resolutions, and the three concrete guardrails
consumers should follow until an ADR resolves it (don't pick one arbitrarily
and build a parallel implementation; the real owner records the
noema/wardnet/naruon/quarantine-sandbox-runtime relationship in an ADR;
CWL-MASTER-CONTEXT.md and this table get updated together once resolved).

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Pushed 750f02ab addressing the sandbox-isolation ownership conflict Devin flagged (based_on_repo_rules: true): §2.4's row assigns isolation to quarantine-sandbox-runtime, while docs/CWL-MASTER-CONTEXT.md:36 assigns the same responsibility to noema ("agent runtime... + the lightweight quarantine sandbox").

I'm not resolving this unilaterally — deciding which source is authoritative, or whether these are genuinely distinct tiers (noema's own lightweight embedded sandbox vs. a dedicated org-wide isolation service), is an architectural decision this document has no authority to make on its own. Added a footnote on the row documenting the conflict, the two plausible resolutions, and three concrete guardrails for consumers until an ADR resolves it: don't arbitrarily pick one and build a parallel implementation; the real owner should record the noema/wardnet/naruon/quarantine-sandbox-runtime relationship in an ADR; and CWL-MASTER-CONTEXT.md + this table get updated together once resolved.

On the "draft policy becomes active too early" finding (#1692 dependency): this appears already substantially addressed by the concurrent reconciliation work already on this branch — the doctoring note now explicitly states G-17 through G-22 evidence "remains Draft/Proposed and must not merge ahead of the canonical policy prerequisite." Leaving that as-is rather than duplicating.

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).


Generated by Claude Code

devin-ai-integration[bot]

This comment was marked as resolved.

Devin Review on PR #1696 (analysis): the ownership table used bare
repository names instead of owner/repo references or URLs, so readers
could not directly verify each claimed canonical owner -- also at odds
with this repo's own binding convention (CLAUDE.md / CWL-MASTER-CONTEXT.md
§7: "cross-repo references as owner/repo#num or full URLs").

Converted every Canonical owner cell to a markdown link
(`ContextualWisdomLab/<repo>` -> https://github.com/ContextualWisdomLab/<repo>).
Mechanical formatting change only; no ownership assignment changed.

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Pushed 8bff7e7f addressing Devin's "owner references are not navigable" finding: converted every §2.4 Canonical owner cell to a markdown link (ContextualWisdomLab/<repo> → its GitHub URL), matching this repo's own binding convention (owner/repo or full URLs for cross-repo references). Mechanical formatting change only — no ownership assignment changed.

Leaving the "fresh gaps retain an older snapshot date" note as informational — the document's own inventory disclaimer already covers this, and adding row-level dates across the whole gap register is a larger scope change than this specific PR's remit.

Verified: tests/test_product_technical_gap_baseline.py passes (5/5).


Generated by Claude Code

Preserve the #1696 single-writer product-gap and evidence delta on current protected main after concurrent control-plane merges. Both histories are retained; no force push or destructive rebase.

Copy link
Copy Markdown
Contributor Author

The required noema-review check failed on the current head (342fac8b, job 100500321846) with:

pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.

Not this PR's diff#1696 only touches docs/product-technical-gap-baseline.md and docs/doctoring/gap-baseline-g17-g22-evidence-2026-09-02.md; the failure is a network read-timeout downloading the maturin build dependency from PyPI during environment setup, before any review logic ran. Died at install (checkout/install class), not a source or test failure.

Re-ran the failed job once (rerun_failed_jobs on run 33640080908) to confirm this was transient network flake rather than a reproducible issue. If it fails again with the same signature, that's a real, persistent problem outside this PR's scope worth escalating rather than re-running further.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

noema-review failed again after the re-run — a new, real (non-flake) failure, not this PR's diff

Head 342fac8b, run 33640080908 (the re-run I triggered earlier for the PyPI/maturin timeout): the dependency install and gateway preflight both succeeded this time (4/12 orchestrator/free routes ready), but the actual review call failed differently:

##[error]Noema model-output repair remained invalid; initial failure: Noema LLM response was not valid JSON (Expecting ',' delimiter: line 1 column 2107 (char 2106))...; repair failure: Noema LLM response was not valid JSON (Expecting ',' delimiter: line 1 column 2394 (char 2393))...

This is not caused by this PR's doc-only diff (2 files). It's a genuinely new failure mode I haven't seen tracked yet: the free-pool model produced malformed JSON, and noema_review_gate.py's one repair attempt also came back malformed (longer, still broken) rather than fixing it. I already spent this workflow's one re-run on the earlier PyPI timeout, so per this repo's CI-red re-run policy I'm not re-running again — a second failure here is real, not a flake.

I haven't root-caused this one yet (unlike gap-baseline item 4, this specific "repair also invalid" shape isn't documented there). Flagging it now rather than silently re-running; will follow up with a dedicated gap-baseline entry once I've traced whether this is a caller-side repair-prompt issue or a free-tier-model reliability issue.


Generated by Claude Code

@seonghobae seonghobae removed the status: draft Draft pull request label Sep 6, 2026
@seonghobae seonghobae added the status: needs-review Open pull request requiring current-head review or checks label Sep 6, 2026 — with ChatGPT Codex Connector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: docs Documentation, ADR, PRD, or technical writing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants