feat(integration): add versioned naruon rehearsal handoff - #737
feat(integration): add versioned naruon rehearsal handoff#737seonghobae wants to merge 59 commits into
Conversation
|
Warning Review limit reached
Next review available in: 48 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughBandScope에 naruon rehearsal handoff v1 계약을 추가했습니다. 공개 타입, 엄격한 검증, canonical JSON 직렬화·역직렬화 API, JSON Schema, 문서 및 경계 조건 테스트를 포함합니다. Changesnaruon rehearsal handoff
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant BandScope
participant SharedTypes
participant NaruonConnector
BandScope->>SharedTypes: createNaruonRehearsalHandoff(input)
SharedTypes-->>BandScope: canonical handoff
BandScope->>SharedTypes: serializeNaruonRehearsalHandoff(handoff)
SharedTypes-->>BandScope: JSON artifact
BandScope->>NaruonConnector: handoff 전달
NaruonConnector->>SharedTypes: deserializeNaruonRehearsalHandoff(JSON)
SharedTypes-->>NaruonConnector: 검증된 handoff
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
Maintainer hardening pass applied on the current branch:
Independent local verification on Node 22 / TypeScript strict ES2022: 73 contract tests passed; |
|
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (4)
docs/integrations/naruon.md (1)
104-110: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winTypeScript 파서가 권위를 가지는 항목에 공백 정규화(trim) 규칙을 추가하세요.
isDisplayText는value === value.trim()을 요구합니다. 공개 JSON Schema의displayText와opaqueIdentifier패턴은 이 규칙을 표현하지 않습니다. 따라서 스키마만 사용하는 커넥터는" Studio A "를 통과시키고, BandScope 파서는 같은 값을 거부합니다. 이 차이를 line 110 목록에 명시하세요.📝 제안 수정
-- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. +- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, leading/trailing whitespace, RFC 9557 offset/time-zone consistency, and IANA time-zone checks.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/integrations/naruon.md` around lines 104 - 110, Update the compatibility statement’s TypeScript-authoritative validation list to explicitly include whitespace normalization/trim rules enforced by isDisplayText, covering displayText and opaqueIdentifier values that must equal their trimmed form.packages/shared-types/test/naruon-schema.test.ts (1)
40-40: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win리터럴
64대신MAX_NARUON_EVIDENCE_RECEIPTS를 사용하세요.이 테스트의 목적은 스키마와 런타임 상수의 정합성 확인입니다.
artifactKind와artifactVersion은 상수와 비교하지만,maxItems만 리터럴과 비교합니다. 상수가 바뀌면 이 검사는 드리프트를 잡지 못합니다.♻️ 제안 수정
- expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64); + expect(schema.properties.provenance.properties.evidence.maxItems).toBe( + MAX_NARUON_EVIDENCE_RECEIPTS + );임포트도 함께 수정하세요.
import { + MAX_NARUON_EVIDENCE_RECEIPTS, NARUON_REHEARSAL_HANDOFF_KIND, NARUON_REHEARSAL_HANDOFF_VERSION } from "../src/naruon";🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/shared-types/test/naruon-schema.test.ts` at line 40, Update the maxItems assertion in the schema test to compare against MAX_NARUON_EVIDENCE_RECEIPTS instead of the literal 64, and add or adjust the import for that runtime constant. Preserve the test’s existing schema path and assertion behavior.packages/shared-types/src/naruon.ts (1)
160-162: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
isOneOf의typeof검사는 도달 불가능한 분기를 만듭니다.
values.includes(value as T)는 이미 엄격 비교를 수행합니다. 따라서typeof value === "string"검사는 결과를 바꾸지 않습니다. 현재 테스트는commitment.status와commitment.rsvpDirection에 문자열 값만 주입하므로, 이 검사의 false 경로는 실행되지 않습니다.packages/shared-types/vitest.config.ts는 이 파일에 branches 100% 임계값을 설정합니다. 같은 문제가 line 119의length < 0조건에도 있습니다. 배열 길이는 음수가 될 수 없고, proxy 테스트는Number.MAX_SAFE_INTEGER + 1만 위조합니다.중복 검사를 제거하거나, 비문자열 status와 음수 length에 대한 테스트를 추가하세요.
♻️ 제안 수정
function isOneOf<T extends string>(values: readonly T[], value: unknown): value is T { - return typeof value === "string" && values.includes(value as T); + return values.includes(value as T); }커버리지 게이트가 실제로 통과하는지 CI 로그에서 확인하세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/shared-types/src/naruon.ts` around lines 160 - 162, Update isOneOf to remove the redundant typeof value check and rely on values.includes for membership validation. Also address the unreachable length < 0 branch near line 119 by removing it or adding coverage for the intended behavior, then verify the shared-types coverage gate passes in CI.docs/integrations/naruon-rehearsal-handoff-v1.schema.json (1)
139-144: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win공개 스키마의 숫자 전용 ID 제약을 명확히 문서화하세요.
JSON Schema의
pattern은 정규식 플래그를 정의하지 않습니다. 따라서\p{Nd}를 지원하지 않거나u플래그 없이 컴파일하는 검증기는 이 패턴을 거부하거나 숫자 전용 값을 허용할 수 있습니다.docs/integrations/naruon.md에 유니코드 정규식 지원과 TypeScript parser 검증 의무를 명시하거나, 이 검사를 parser 전용 규칙으로 분리하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/integrations/naruon-rehearsal-handoff-v1.schema.json` around lines 139 - 144, 문서화된 공개 스키마의 opaqueIdentifier 숫자 전용 제한이 검증기별로 다르게 동작할 수 있으므로, docs/integrations/naruon.md에 \p{Nd} 지원 및 TypeScript parser 검증 의무를 명시하세요. 또는 schema의 pattern에서 해당 검사를 제거하고 parser 전용 규칙으로 분리하되, 숫자로만 구성된 유니코드 ID가 거부되는 동작은 유지하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/shared-types/src/naruon.ts`:
- Around line 384-412: Update canonicalizeSnapshot to construct source,
normGroup, event, commitment, provenance, and each evidence object with explicit
canonical field order instead of spreading caller-provided objects; preserve the
existing omission of event.venue when undefined. Ensure
serializeNaruonRehearsalHandoff produces identical JSON bytes for inputs whose
keys differ only in insertion order, and add a naruon.test.ts case covering
reversed key order.
---
Nitpick comments:
In `@docs/integrations/naruon-rehearsal-handoff-v1.schema.json`:
- Around line 139-144: 문서화된 공개 스키마의 opaqueIdentifier 숫자 전용 제한이 검증기별로 다르게 동작할 수
있으므로, docs/integrations/naruon.md에 \p{Nd} 지원 및 TypeScript parser 검증 의무를 명시하세요.
또는 schema의 pattern에서 해당 검사를 제거하고 parser 전용 규칙으로 분리하되, 숫자로만 구성된 유니코드 ID가 거부되는 동작은
유지하세요.
In `@docs/integrations/naruon.md`:
- Around line 104-110: Update the compatibility statement’s
TypeScript-authoritative validation list to explicitly include whitespace
normalization/trim rules enforced by isDisplayText, covering displayText and
opaqueIdentifier values that must equal their trimmed form.
In `@packages/shared-types/src/naruon.ts`:
- Around line 160-162: Update isOneOf to remove the redundant typeof value check
and rely on values.includes for membership validation. Also address the
unreachable length < 0 branch near line 119 by removing it or adding coverage
for the intended behavior, then verify the shared-types coverage gate passes in
CI.
In `@packages/shared-types/test/naruon-schema.test.ts`:
- Line 40: Update the maxItems assertion in the schema test to compare against
MAX_NARUON_EVIDENCE_RECEIPTS instead of the literal 64, and add or adjust the
import for that runtime constant. Preserve the test’s existing schema path and
assertion behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: f81bb23e-0f22-49a8-bb0d-b39ecd7b24af
📒 Files selected for processing (10)
CHANGELOG.mddocs/integrations/naruon-rehearsal-handoff-v1.schema.jsondocs/integrations/naruon.mdpackages/shared-types/package.jsonpackages/shared-types/src/naruon.tspackages/shared-types/test/naruon-calendar.test.tspackages/shared-types/test/naruon-hardening.test.tspackages/shared-types/test/naruon-schema.test.tspackages/shared-types/test/naruon.test.tspackages/shared-types/vitest.config.ts
|
@coderabbitai autofix |
|
Note Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it. Fixes Applied SuccessfullyFixed 2 file(s) based on 1 unresolved review comment. Files modified:
Commit: The changes have been pushed to the Time taken: |
Fixed 2 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head80147750f5d9c2a40c866f3f32ce5cb54b8b6472. -
Head SHA:
80147750f5d9c2a40c866f3f32ce5cb54b8b6472 -
Workflow run: 30841712934
-
Workflow attempt: 1
Coverage evidence
Coverage Decision
- Result: FAIL
- Test evidence: not proven passing
- Docstring evidence: not proven passing when configured
- Failure count: 3
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
OpenCode Review Overview
Pull request overviewOpenCode cannot approve yet because required coverage evidence did not pass. Review outcome1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
Coverage evidenceCoverage Decision
Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
|
Dismissed because the only blocker was the superseded central coverage environment. All repository-owned checks succeeded on this exact head and no review threads remain unresolved; a new independent exact-head approval is still required.
|
@cwl-noema-review @opencode-agent Please independently review exact head |
|
@coderabbitai review |
Rate Limit Exceeded
|
|
@opencode-agent @cwl-noema-review Please independently review exact current head @coderabbitai review |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='80147750f5d9c2a40c866f3f32ce5cb54b8b6472'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\n' "$actual" "$expected"
git status --short
git diff-tree --no-commit-id --name-status -r "$expected"
printf '\n== naruon source outline ==\n'
ast-grep outline packages/shared-types/src/naruon.ts --items all --view expanded
printf '\n== naruon source, 1-560 ==\n'
sed -n '1,560p' packages/shared-types/src/naruon.ts
printf '\n== package export and coverage configuration ==\n'
cat packages/shared-types/package.json
printf '\n-- vitest --\n'
cat packages/shared-types/vitest.config.ts
printf '\n== schema ==\n'
cat docs/integrations/naruon-rehearsal-handoff-v1.schema.json
printf '\n== integration documentation ==\n'
cat docs/integrations/naruon.md
printf '\n== test outlines ==\n'
ast-grep outline packages/shared-types/test/naruon.test.ts --items all --view expanded
ast-grep outline packages/shared-types/test/naruon-hardening.test.ts --items all --view expanded
ast-grep outline packages/shared-types/test/naruon-schema.test.ts --items all --view expanded
ast-grep outline packages/shared-types/test/naruon-calendar.test.ts --items all --view expanded
printf '\n== authority-bearing imports/usages in changed implementation/docs/scripts ==\n'
rg -n -i -C2 '\b(fetch|axios|http|https|net|tls|dns|child_process|spawn|exec|fs|node:fs|database|sqlite|postgres|openai|anthropic)\b' \
packages/shared-types/src/naruon.ts packages/shared-types/package.json docs/integrations/naruon.md \
scripts/ci/bootstrap_naruon_boundary_hardening.py || true
printf '\n== workflow and package scripts references ==\n'
rg -n -C2 'naruon|shared-types|coverage|vitest|typecheck' \
.github packages/shared-types/package.json package.json 2>/dev/null || trueLength of output: 39186 🏁 Script executed: #!/bin/bash
set -euo pipefail
commit='80147750f5d9c2a40c866f3f32ce5cb54b8b6472'
printf '%s\n' '== exact commit metadata and patch =='
git show --no-ext-diff --format=fuller --stat "$commit"
git diff --no-ext-diff "${commit}^" "$commit" -- \
packages/shared-types/src/naruon.ts \
packages/shared-types/test/naruon.test.ts \
packages/shared-types/test/naruon-hardening.test.ts \
packages/shared-types/test/naruon-schema.test.ts \
packages/shared-types/test/naruon-calendar.test.ts \
packages/shared-types/vitest.config.ts \
packages/shared-types/package.json \
docs/integrations/naruon-rehearsal-handoff-v1.schema.json \
docs/integrations/naruon.md
printf '%s\n' '== uncommitted documentation delta =='
git diff --no-ext-diff -- docs/integrations/naruon.md
printf '%s\n' '== complete contract tests =='
for f in \
packages/shared-types/test/naruon.test.ts \
packages/shared-types/test/naruon-hardening.test.ts \
packages/shared-types/test/naruon-schema.test.ts \
packages/shared-types/test/naruon-calendar.test.ts
do
printf '\n--- %s ---\n' "$f"
cat "$f"
done
printf '%s\n' '== test case inventory =='
rg -n -C1 '\b(it|test|describe)\s*\(' \
packages/shared-types/test/naruon.test.ts \
packages/shared-types/test/naruon-hardening.test.ts \
packages/shared-types/test/naruon-schema.test.ts \
packages/shared-types/test/naruon-calendar.test.ts
printf '%s\n' '== workflow files and relevant configuration =='
fd -t f .github 2>/dev/null | sort
rg -n -i -C2 'shared-types|vitest|coverage|typecheck|naruon' .github package.json \
--glob '*.yml' --glob '*.yaml' --glob '*.json' 2>/dev/null || true
printf '%s\n' '== implementation imports and direct authority APIs =='
ast-grep run --pattern 'import $$$ from $SOURCE' --lang typescript packages/shared-types/src/naruon.ts
rg -n -P '\b(?:fetch|WebSocket|XMLHttpRequest|Deno\.|Bun\.|process\.|require\s*\(|import\s*\(|readFile|writeFile|connect|listen|spawn|exec)\b' \
packages/shared-types/src/naruon.ts || trueLength of output: 43031 🏁 Script executed: #!/bin/bash
set -euo pipefail
head='80147750f5d9c2a40c866f3f32ce5cb54b8b6472'
base="$(git merge-base "$head" origin/main 2>/dev/null || git merge-base "$head" main 2>/dev/null || true)"
printf 'HEAD=%s\nMERGE_BASE=%s\n' "$head" "$base"
printf '\n== staged worktree delta ==\n'
git diff --cached --no-ext-diff -- docs/integrations/naruon.md
printf '\n== complete worktree status ==\n'
git status --short
if [ -n "$base" ]; then
printf '\n== cumulative PR changed files ==\n'
git diff --name-status "$base" "$head"
printf '\n== shared-types dependency changes ==\n'
git diff --no-ext-diff "$base" "$head" -- packages/shared-types/package.json
printf '\n== authority indicators across cumulative TypeScript implementation ==\n'
rg -n -i -C1 '\b(fetch|axios|http|https|websocket|net|tls|dns|node:fs|node:child_process|readfile|writefile|spawn|exec|sqlite|postgres|openai|anthropic)\b' \
packages/shared-types/src packages/shared-types/package.json || true
printf '\n== public package surface ==\n'
git diff --no-ext-diff "$base" "$head" -- packages/shared-types/package.json packages/shared-types/src/index.ts
fi
printf '\n== test configuration assertions ==\n'
rg -n -C2 '"src/naruon.ts"|thresholds|include' packages/shared-types/vitest.config.ts
printf '\n== documentation of parser-authoritative schema gaps ==\n'
rg -n -C2 'authoritative|payload-size|snapshot|cross-field|RFC 9557|IANA' docs/integrations/naruon.mdLength of output: 3982
I verified the requested
I could not execute repository workflows in this sandbox. The inspected test suite and coverage gate are consistent with the reported successful verification. [approve] You are interacting with an AI system. |
Pull request was converted to draft
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head80147750f5d9c2a40c866f3f32ce5cb54b8b6472. -
Head SHA:
80147750f5d9c2a40c866f3f32ce5cb54b8b6472 -
Workflow run: 30946269175
-
Workflow attempt: 1
Coverage evidence
Coverage Decision
- Result: FAIL
- Test evidence: not proven passing
- Docstring evidence: not proven passing when configured
- Failure count: 3
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
|
@coderabbitai review Please review exact current head @opencode-agent Please rerun exact-head review after the central npm-workspace coverage materializer is integrated; do not reuse prior incomplete coverage evidence. @cwl-noema-review Please independently review this exact head and the standalone/local-first versus naruon-module authority boundary. Merge remains subject to protected current-head checks and qualifying non-author approval. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='80147750f5d9c2a40c866f3f32ce5cb54b8b6472'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\n' "$actual" "$expected"
git status --short
git diff --check "${expected}^" "$expected"
printf '\n== cumulative changed files ==\n'
base="$(git merge-base "$expected" origin/main 2>/dev/null || git merge-base "$expected" main 2>/dev/null || true)"
if [ -n "$base" ]; then
git diff --name-status "$base" "$expected"
fi
printf '\n== source outline ==\n'
ast-grep outline packages/shared-types/src/naruon.ts --items all --view expanded
printf '\n== source ==\n'
cat -n packages/shared-types/src/naruon.ts
printf '\n== package and coverage configuration ==\n'
cat -n packages/shared-types/package.json
cat -n packages/shared-types/vitest.config.ts
printf '\n== schema and documentation ==\n'
cat -n docs/integrations/naruon-rehearsal-handoff-v1.schema.json
cat -n docs/integrations/naruon.md
printf '\n== Naruon test inventories ==\n'
for f in \
packages/shared-types/test/naruon.test.ts \
packages/shared-types/test/naruon-hardening.test.ts \
packages/shared-types/test/naruon-schema.test.ts \
packages/shared-types/test/naruon-calendar.test.ts
do
printf '\n--- %s ---\n' "$f"
rg -n -C2 '\b(?:describe|it|test)\s*\(' "$f" || true
done
printf '\n== temporary automation and authority indicators in cumulative change ==\n'
if [ -n "$base" ]; then
git diff --name-only "$base" "$expected" | rg -n '(bootstrap|repair|autofix|temporary|\.py$)' || true
fi
rg -n -i -C2 '\b(fetch|axios|http|https|websocket|node:fs|node:child_process|readFile|writeFile|spawn|exec|connect|listen|sqlite|postgres|openai|anthropic)\b' \
packages/shared-types/src/naruon.ts packages/shared-types/package.json docs/integrations/naruon.md || true
printf '\n== current PR checks and review state ==\n'
gh pr view 737 --repo ContextualWisdomLab/bandscope \
--json headRefOid,statusCheckRollup,reviews,reviewThreads \
--jq '{headRefOid, checks: [.statusCheckRollup[] | {name, conclusion, status}], reviews: [.reviews[] | {author: .author.login, state}], unresolvedThreads: ([.reviewThreads[] | select(.isResolved == false)] | length)}'Length of output: 48593 🏁 Script executed: #!/bin/bash
set -euo pipefail
head='80147750f5d9c2a40c866f3f32ce5cb54b8b6472'
repo='ContextualWisdomLab/bandscope'
printf '%s\n' '== commit parents and cumulative file list =='
git show --no-patch --format='commit=%H%nparents=%P%nsubject=%s' "$head"
base="$(git merge-base "$head" origin/main 2>/dev/null || git merge-base "$head" main 2>/dev/null || true)"
printf 'merge_base=%s\n' "$base"
if [ -n "$base" ]; then
git diff --name-status "$base" "$head"
else
git show --format='' --name-status "$head"
fi
printf '%s\n' '== temporary repair automation at exact head =='
git ls-tree -r --name-only "$head" | rg -i '(bootstrap.*naruon|naruon.*bootstrap|repair|autofix|temporary)' || true
git show --format='' --name-only "$head" | rg -i '\.py$|bootstrap|repair|autofix|temporary' || true
printf '%s\n' '== complete hardening tests =='
cat -n packages/shared-types/test/naruon-hardening.test.ts
printf '%s\n' '== serialization and parser tests =='
sed -n '60,150p' packages/shared-types/test/naruon.test.ts | cat -n
printf '%s\n' '== schema test loader and closure assertions =='
sed -n '1,130p' packages/shared-types/test/naruon-schema.test.ts | cat -n
printf '%s\n' '== GitHub checks and review decision =='
gh pr view 737 --repo "$repo" \
--json headRefOid,reviewDecision,reviews,statusCheckRollup \
--jq '{headRefOid, reviewDecision, checks: [.statusCheckRollup[] | {name, conclusion, status}], reviews: [.reviews[] | {author: .author.login, state}]}'
printf '%s\n' '== unresolved review threads =='
gh api graphql -F owner='ContextualWisdomLab' -F name='bandscope' -F number=737 -f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
comments(first: 1) { nodes { author { login } body path line } }
}
}
}
}
}' --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {isOutdated, comment: .comments.nodes[0]}]'Length of output: 25057
[approve] You are interacting with an AI system. |
|
@opencode-agent @cwl-noema-review Please independently re-review exact current head |
What
Add a dependency-free, fail-closed BandScope → naruon rehearsal handoff contract under
@bandscope/shared-types/naruon.The versioned artifact contributes:
confirmed | tentative | desiredcommitment strength;It includes canonical builders/parsers, deterministic JSON serialization, a public Draft 2020-12 JSON Schema, security/privacy integration guidance, and regression coverage.
Why
BandScope must remain a useful standalone local-first desktop app while also becoming a first-class vertical on naruon. A narrow, network-agnostic export contract closes the BandScope-owned producer side of #610 without granting naruon ambient filesystem, calendar, mail, database, model, or network authority.
Security notes
The parser rejects unknown keys, numeric-only IDs, malformed/invalid timestamps, invalid time zones, inconsistent band identities, unsupported commitment axes, non-finite confidence, sparse/oversized evidence, control characters, and oversized fields. It returns newly allocated nested values. Transport authentication, detached signatures, consent, context bridging, and writeback remain outside this data-only package.
Verification
Advances #610. The remaining naruon-side importer and connector authorization path stay explicitly tracked there.
Summary by CodeRabbit
새 기능
문서