docs(directive): sync product-goal-directive.md with the user's current text - #1757
docs(directive): sync product-goal-directive.md with the user's current text#1757seonghobae wants to merge 16 commits into
Conversation
…nt text Two peer sessions this cycle independently flagged that at least one live /loop's standing text carried content (an i18n language list, LLM provider-group/timeout language, a fuller core-foundation ownership map) that this file did not have, and correctly declined to guess at a fix themselves. The user then re-pasted their current full /loop invocation directly into this session, giving primary-source text to reconcile against instead of a secondhand description. Diffed all nine sections in full. Six had genuinely new content (the "PR 0" refinement in #1, a full Close-vs-repair policy in #2, a decision-record completeness bar in #3, the 8-language i18n list + DB-versioned-translation architecture in #4, an explicit p95<=20ms target in #7, null-timeout semantics + admin-web scope in #8, and a much larger categorized core-foundation ownership map naming 15 repos not previously listed in #9). Appended each as a dated addendum, preserving all existing quoted text and prior Devin/CodeRabbit correction notes untouched. Two sections (#5, #6) had no new content and were left alone. docs/doctoring/product-goal-directive-sync-20260903.md records the full diff table and resolves the open question both peers had flagged to the user: the content they described was real, just genuinely missing from this file -- not a citation error on either peer's part. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Warning Review limit reachedNext included review available in 1 minute. View limit detailsLimit 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. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (2)
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. Comment |
…Devin Review)
Devin correctly caught that this addendum's editorial gloss ("not a hard
gate that blocks merges on its own") weakened a requirement the user stated
unconditionally ("맞춘다"), and this file's own header explicitly warns
against reinterpreting quoted sections when copying them. Removes the
softening; the addendum now only clarifies measurement method (realistic
benchmarks, no shortcuts), not whether the target binds.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…works (#1868) The .github-side follow-up this entry named as still-needed (call_llm not reading the HTTPError response body, so it couldn't surface served_model) shipped in #1831 (merged), hardened by #1835 and #1850. Found incidentally while handling an unrelated Autofix event on PR #1757: a fresh gateway failure now logs phase=response_error and a real model name (served_model=google/gemma-4-31b-it) instead of the old unknown/connecting pair. The underlying gateway instability (502 after 284.7s) is still a separate, open, recurring problem -- but the telemetry gap that made every prior instance of it undiagnosable is closed. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
|
The single red check here is not caused by this pull request and cannot be fixed from this branch. Recording the evidence so the next person does not spend the diagnosis again, and re-running only the failed job rather than pushing a commit. What actually failed
Every route the sidecar probed is This is the org-wide chain already root-caused elsewhere: return [model for model in (discovered or []) if not getattr(model, "evidence_only", False)]— while the policy layer had admitted free routes across three credential accounts. Why no commit was pushed hereThis PR is documentation-only (
Instead I re-ran only the failed job ( If this check goes red again with the same 🤖 Generated with Claude Code |
|
Correction to my comment above: the cause I named is wrong. The conclusion is unchanged — this failure is not from this PR and no commit here fixes it — but the mechanism is not the launcher's
What actually starves it — an account cap the sidecar raises above the policy default.
for row in eligible_rows:
account = provider_account(str(row["provider"]))
if per_account[account] >= account_cap: # 8, from the sidecar
continue
per_account[account] += 1
picked.append(row)
if len(picked) >= limit: # 12
break
That is the Credit: What does not change: this PR is documentation-only, nothing in its diff reaches the sidecar, and merging 🤖 Generated with Claude Code |
New review runs bind workflow_sha at creation time, so the 13:40:58Z runs that failed executed the pre-#1939 sidecar catalog. This merge creates a fresh event so the current round-robin catalog is used, and clears mergeable_state=behind. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The previous head's noema-review failed with a gateway-side HTTP error (phase=response_error, duration=3576.0s, served_model=deepseek-ai/ deepseek-v4-flash), not with anything in this PR's tree. Sampling four other recent .github noema failures shows the same shape across different models and durations (324s validating, 542s, 575s, 999s response_error), so the cause is upstream of this branch. This merge is for the blocker that IS in scope: the head had fallen behind main again. A fresh review attempt comes with it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
| run | phase | duration | served_model |
|---|---|---|---|
33995259290 |
validating |
324.2s | dots-studio/dots-3-note-preview:free |
33994984541 |
response_error |
575.5s | deepseek-ai/deepseek-v4-flash-0731 |
33993637015 |
response_error |
542.2s | deepseek-ai/deepseek-v4-flash-0731 |
33993624878 |
response_error |
998.9s | deepseek-ai/deepseek-v4-pro-0813 |
모델도 소요시간도 제각각인데 phase=response_error(게이트웨이 HTTP 오류)로 수렴합니다. 최근 100건 분포는 success 11 / failure 36 / cancelled 34 / queued 13 / in_progress 6입니다.
같은 로그에 사이드카 기동 경고도 있습니다(치명적이진 않음): provider_discovery_failed provider=bytez code=http_status_50x.
이번에 한 것
문제의 run은 created_at 21:32:39Z로 #1939 머지(17:25:33Z) 이후 생성이라 이미 현행 라운드로빈 카탈로그로 돌았습니다. 즉 카탈로그 구성 문제가 아닙니다.
그래서 범위 안에서 실제로 유효한 것만 했습니다 — 이 헤드가 다시 behind가 되어 있었으므로 현재 main(fe827e13)을 병합했습니다. 새 리뷰 시도는 그에 딸려옵니다. 게이트: uvx ruff check --select F821 All checks passed, 전체 스위트 2904 passed / 0 failed. fast-forward, force push 없음.
noema-review를 "고쳤다"고 주장하지 않습니다. 그 체크는 게이트웨이가 5xx를 그만 반환할 때 초록이 됩니다. 이 PR 브랜치에서 할 수 있는 일이 아닙니다.
🤖 Generated with Claude Code
세 번째
|
| provider | http_status | model |
|---|---|---|
| nvidia_nim | 404 | google/gemma-3-12b-it |
| nvidia_nim | 404 | google/gemma-3-4b-it |
| nvidia_nim | 429 | deepseek-ai/deepseek-v4-flash-0731 |
| nvidia_nim | TimeoutError | deepseek-ai/deepseek-v4-pro-0813 |
| nvidia_nim_sub | 404 | google/gemma-3-12b-it |
| nvidia_nim_sub | 404 | google/gemma-3-4b-it |
| nvidia_nim_sub | 429 | deepseek-ai/deepseek-v4-flash-0731 |
| nvidia_nim_sub | TimeoutError | deepseek-ai/deepseek-v4-pro-0813 |
| openrouter | 429 | cohere/north-mini-code:free |
| openrouter | 429 | dots-studio/dots-3-note-preview:free |
| openrouter | 429 | google/gemma-4-26b-a4b-it:free |
| openrouter | 429 | google/gemma-4-31b-it:free |
좋은 소식 — #1939의 4+4+4가 프로덕션에서 확인됩니다
nvidia_nim 4 / nvidia_nim_sub 4 / openrouter 4. 라운드로빈 카탈로그 채우기는 의도대로 동작합니다. 병목이 "카탈로그 구성"에서 **"경로 건강성"**으로 옮겨갔습니다.
나쁜 소식 — 12슬롯 중 4개가 구조적으로 낭비됩니다
두 NVIDIA 계정이 완전히 같은 4개 모델을 중복 탐침합니다. 계정만 다르고 모델 다양성은 0입니다. 그중 gemma-3-12b-it과 gemma-3-4b-it은 양쪽 계정 모두 404(상장 폐지로 보임)라, 12개 슬롯 중 4개가 매 실행마다 확정적으로 죽습니다. 남은 8개는 429 6건 + 타임아웃 2건입니다.
그리고 escalation_budget=4인데 escalations_used=0입니다 — 12/12 전멸 상황에서 에스컬레이션 예산 4를 하나도 쓰지 않았습니다.
이 두 가지는 이미 추적 중인 항목과 겹칩니다(#1947 transient-rejected 경로 처리, #1949 preflight served set, #1458 escalation budget 순서 편향). 429는 로그에서 transient=True로 분류됩니다. 중복 제기 대신 이 실행의 1차 증거만 남깁니다.
왜 이번엔 푸시하지 않았는가
앞선 두 번은 각각 명분이 있었습니다 — 1차는 구 사이드카 바인딩 해소, 2차는 behind 해소. 지금은 헤드가 최신이고 병합 차단 요인이 없습니다. 남은 유일한 실패는 12/12 경로가 404·429·timeout으로 거부되는 상류 상태이고, 여기에 푸시를 더하면 포화된 대기열(noema queued 11, opencode queued 9)에 리뷰 run을 하나 더 얹어 429를 악화시킬 뿐 성공 확률을 올리지 못합니다.
noema-review는 경로 건강성이 회복되면 초록이 됩니다. 이 PR 브랜치에서 할 수 있는 일이 아니며, 같은 이벤트가 또 오면 그것도 같은 상류 상태의 재보고일 것입니다.
🤖 Generated with Claude Code
|
| 체크 | 어디서 죽나 | 근거 |
|---|---|---|
noema-review |
스텝 12 Provision contextual-orchestrator review sidecar |
probed=12 ready=0 rejected=12 |
strix |
스텝 16 Provision contextual-orchestrator Strix sidecar (run 34004185698) |
probed=12 ready=0 rejected=12 |
opencode-review |
스텝 3 Fail closed without a current-head OpenCode verdict (5초) |
아래 참조 |
두 사이드카 preflight는 동일한 서명입니다: probed=12 ready=0 rejected=12 escalation_budget=4 escalations_used=0. strix 로그에서 복원 가능한 경로도 noema와 정확히 일치합니다 — deepseek-v4-flash-0731 429(양쪽 NVIDIA 계정), openrouter free 모델 429, gemma-3-12b-it 404(양쪽 계정).
opencode-review의 실패는 설계된 fail-closed입니다. 로그 원문: No APPROVED or CHANGES_REQUESTED from opencode-agent on the current head. The dispatch workflow will rerun this failed job after publishing an .... 즉 dispatch가 판정을 게시하면 재실행되는 구조인데, dispatch 워크플로 자신이 같은 사이드카 문제로 실패하고 있습니다(최근 opencode-review-dispatch run 중 02:03·02:05·02:06 생성분이 failure).
부수 발견 — strix 쪽에는 증거 아티팩트가 없습니다
#1944가 추가한 noema-sidecar-evidence(preflight JSON + 사이드카 stderr) 덕분에 noema는 12개 경로 전체를 정확히 읽을 수 있습니다. strix run은 strix-reports만 업로드하고, 로그의 preflight 라인은 문자 2333에서 잘립니다. 그래서 strix 쪽은 헤더 숫자와 앞부분 6개 경로까지만 복원 가능하고 나머지는 소실됩니다. #1944와 같은 아티팩트를 strix 경로에도 붙이면 이런 진단이 대칭이 됩니다.
왜 또 푸시하지 않았는가
세 체크 모두 이 PR 트리와 무관한 단일 상류 원인입니다. 헤드는 최신이고 병합 차단 요인이 없습니다. 푸시는 포화 대기열에 run을 더할 뿐 12/12 경로 거부를 바꾸지 못합니다. 이 표면은 이미 #1947(transient-rejected 경로) · #1949(preflight served set) · #1458(escalation budget 편향)로 추적 중이라 중복 제기도 하지 않았습니다.
🤖 Generated with Claude Code
The PR was 35 commits behind with zero current-head checks queued or running, which is the repository's own condition for a pre-review-dispatch branch update (CLAUDE.md, #1935). Only a new head clears BEHIND, so this is the one available repair; the two reported check failures name no content defect to fix ("Fail closed without a current-head OpenCode verdict", "Default-branch repository_dispatch Strix evidence failed"). This does NOT claim to fix the three failing checks, and the evidence says it probably will not clear them this cycle: opencode-review has produced zero conclusions from 40 runs created since 2026-09-07T03:52Z, and every review verdict published repository-wide since 00:14Z reads REQUEST_CHANGES with "Model pool: exhausted". A head that is current is a precondition for a verdict, not a cause of one. Merge properties, verified on the merged tree: - merge only, no rebase and no force-push; second parent is main 78a4937, which git ls-remote still reports as origin/main, so the merge is exact - no path differs from both parents, so git synthesized no file - this PR's delta against main is unchanged: the same two documents and the same 106 insertions / 1 deletion, with an identical file-name set - main touched neither document in the merged range, so no prose or fenced block was recombined - local gate on the merged tree: 2985 collected, 2984 passed / 1 skipped, coverage 100% (0 missing, 0 partial branches), interrogate 100% Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
헤드를 갱신했습니다 (
|
There was a problem hiding this comment.
Noema LLM review
This PR syncs the standing directive with the user's current loop text and adds a doctoring record. However, it introduces a confirmed internal contradiction: the new line 77 in docs/product-goal-directive.md asserts that p95≤20ms is a 'binding target... not aspirational' and a requirement, while the accompanying doctoring record (docs/doctoring/product-goal-directive-sync-20260903.md line 42) describes the exact same change as 'not an unconditional merge-blocking gate'. Both statements ship in the same commit, so an agent reading the directive and its sync record cannot determine whether missing the latency target blocks a merge. Additionally, line 77 adds an editorial reinterpretation ('binding... not aspirational') that conflicts with the file's own header rule that sections be recorded verbatim without paraphrase, and the new prose is not a synced verbatim passage. These two confirmed probes require changes before merge.
Reviewed changed lines
docs/product-goal-directive.md:77 (RIGHT): New paragraph asserts p95≤20ms is an 'aggressive, binding target... not aspirational' and that the directive 'states it as a requirement'. This contradicts the doctoring record in the same PR, which frames the same §7 change as 'not an unconditional merge-blocking gate'. Also, this sentence paraphrase-interprets the user's verbatim quote rather than recording it, contrary to the file header's verbatim/no-paraphrase rule.
Adversarial validation
docs/product-goal-directive.md:77 (RIGHT)confirmed: Line 77's claim that p95≤20ms is a 'binding target... not aspirational' and that the directive 'states it as a requirement' directly contradicts the doctoring record's description of the same §7 change as 'not an unconditional merge-blocking gate'. — Line 77 (RIGHT) says: 'p95≤20ms is an aggressive, binding target (competitive with p50 for many stacks), not aspirational — the directive states it as a requirement (docs/product-goal-directive.md:77 (RIGHT)confirmed: Line 77 reinterprets the user's verbatim directive text instead of recording it verbatim, violating the file's own header rule and the sync record's stated method. — The sync record at docs/doctoring/product-goal-directive-sync-20260903.md line 42 (RIGHT) frames the target as 'not an unconditional merge-blocking gate' while line 77 asserts it is binding — a paraphrased reinterpretation that conflicts with the verbatim mandate and with the record's own framing.- Residual risk: Only the p95≤20ms section was cross-checked against the doctoring record because the quoted user text for the other five new sections (i18n, Close-vs-repair, decision-record bar, timeout semantics, ownership map) was not independently available for verification; those addenda could contain similar framing/interpretation drift that this review could not confirm or falsify.
Findings
- [high] docs/product-goal-directive.md:77 (RIGHT): Internal contradiction in the same PR: line 77 asserts p95≤20ms is a 'binding target... not aspirational' and a stated requirement, while the doctoring record (docs/doctoring/product-goal-directive-sync-20260903.md line 42) describes the identical §7 change as 'not an unconditional merge-blocking gate'. Agents reading both documents cannot tell whether missing the target blocks a merge. Align the two statements.
- [medium] docs/product-goal-directive.md:77 (RIGHT): Line 77 adds an editorial reinterpretation ('binding... not aspirational', 'does not soften that') that paraphrases and reinterprets the user's quoted directive rather than recording it verbatim, contrary to the file header's 'recorded verbatim... do not paraphrase' rule and the sync record's claim of verbatim reconciliation. Either quote the directive without interpretive commentary or update the header/sync record via the file's own conflict-resolution mechanism.
- Result: REQUEST_CHANGES
- Head SHA:
9e72f810710809306af37001c58d4c627900b101 - Reviewer credential:
noema-review-github-app-refresh - Actor:
cwl-noema-review[bot]
Summary
/looptext (pasted directly into this session) and diffed it againstdocs/product-goal-directive.mdsection by section.docs/doctoring/product-goal-directive-sync-20260903.mdrecords the full diff table and resolves the open question: the "i18n list" and "core-foundation ownership map" content a peer had briefly mis-cited as being in the wrong section of the file was real content — it just wasn't in the file at all yet.Test plan
docs/product-goal-directive.md(tests/test_noema_orchestrator_workflow_contract.py,tests/test_pr_review_autofix_writer_security_contract.py) — both pass, confirming the pinned substrings survived the edit.python3 -m pytest tests/test_noema_orchestrator_workflow_contract.py tests/test_pr_review_autofix_writer_security_contract.py -q→ 16 passed.🤖 Generated with Claude Code