Skip to content

fix(containers): publish explicit split runtime targets - #1365

Open
seonghobae wants to merge 14 commits into
developfrom
fix/publish-independent-runtime-targets
Open

fix(containers): publish explicit split runtime targets#1365
seonghobae wants to merge 14 commits into
developfrom
fix/publish-independent-runtime-targets

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Bounded deployment slice

Refs #1022. This PR owns one release-path boundary: backend, frontend, and compatibility images must build explicit runtime targets, and each independently published image must retain the OCI metadata and runtime command contract expected by release governance.

최신 검증 범위 — 9b137f2, 2026-09-07

  • 현재 head는 9b137f25f426743e18fc61125575ec7949d45db8다. PR validation에 outputs: type=cacheonly를 명시하고 게시 금지·두 플랫폼 계약을 검사했다. release 단계 변경은 없다.
  • 커밋 후 고정 검사 38개와 해당 workflow actionlint가 통과했다. RED/GREEN 및 범위.
  • 이미지 run 34079790641의 frontend 101612776305, combined 101612776463, backend 101612776465는 실제 실행 중이다. 기존 성공을 현재 head로 이전하지 않는다.
  • 구현08417의 실제 ARM64 frontend에서 PID1·PORT3107·익명 세션 계약·주 프로세스 종료143을 확인했다. 최초 assertion 오류, 다운로드 경고, 종료 중 healthcheck137은 기록에 보존했다. 전체 cleanup 또는 정상 로그인 제품 검증이 아니다.
  • 아래는 과거 관찰이다. 현재 head 승인·모든 required Checks·보호 병합·release는 아직 미완료다.

과거 검증 범위 — 597192, 2026-09-07

  • 현재 head: 597192f0a799db5710da76b04bd5df4a5533eed6, Ready/OPEN. 보호 병합은 미완료다.
  • 보호 기준: develop@042b0c70531b229af3acbd0421a2f23098d848b3; compare ahead 12 / behind 0, merge base는 같은 보호 커밋이다.
  • 실제 보호 기준 대비 delta는 7개 파일이다. 아래 5개 구현 경로에 .dockerignoredocs/doctoring/runtime-image-boundary-verification.md가 추가됐다. PR API의 10개 파일 중 보호 기준에서 상속한 3개는 새로 소유하지 않는다.
  • 후속 b533은 UID 범위 경고를 호출 단위로 수리했고, 08417은 로컬 .venv를 빌드에서 제외했다. 597192는 검증 문서만 추가했다.
  • 구현08417의 고정 검사 38개·Ruff 통과와 실제 ARM64 backend 이미지/가상환경 제외/UID 검증은 실제 빌드 기록에 있다. 이 결과가 문서 후속 head의 전체 hosted 검사를 대신하지 않는다.
  • 새 Application CI 34077981659, 이미지 검사 34077982014는 현재 head에서 queued다. 이전 head의 성공을 전용하지 않는다.
  • 문서597192 GitHub Preview의 데스크톱·모바일 시각 검수는 별도 기록에 있다. 제품 정상 인증 화면 검수가 아니다.

아래 ae002 시점의 근거는 보존된 이력이며 위 최신 관찰을 대체하지 않는다.

Historical authority — ae002, 2026-09-07

  • protected target: develop@042b0c70531b229af3acbd0421a2f23098d848b3
  • exact head: ae002ebed3cb396c92ee9f0116c3c6c8a3389204
  • branch: fix/publish-independent-runtime-targets
  • lifecycle: Ready for independent review / mergeable / not merge-ready
  • fresh compare against protected develop: ahead 9 / behind 0 / merge base = protected develop
  • effective protected-base delta: 5 files.github/workflows/docker-publish.yml, Dockerfile, frontend/Dockerfile, backend/tests/test_runtime_image_targets.py, backend/tests/test_release_governance.py

The PR API's broader eight-file listing includes .jules/sentinel.md and the attachment-parser repair inherited through the protected-base merge; those are not this PR's effective current delta and are not re-owned here.

TDD and causal repair lineage

The original runtime-target repair binds the release matrix to explicit backend-runtime, frontend-runtime, and combined-runtime targets for both PR validation and publication and names the Docker stages accordingly.

After ordinary protected-base adoption, three normal descendants were read and retained rather than treated as a race:

  1. 1bda1b5bc4e13f74f36133a7835ec0ad7ddb393e changes the frontend runtime CMD to Docker JSON exec form while preserving ${PORT:-3000} expansion and exec replacement of the shell process. The focused runtime-target regression records the command contract.
  2. 807eaa800e8835766545b0dffc46be26d8bdf299 aligns the existing release-governance assertion with that JSON exec-form command instead of weakening/removing the assertion.
  3. ae002ebed3cb396c92ee9f0116c3c6c8a3389204 repairs the independently built backend image's baked OCI metadata: common OCI ARG/LABEL declarations live in backend-runtime, combined-runtime inherits them and overrides only the combined title/description, and release-governance tests require every predefined image annotation key in the backend stage plus the target-specific titles/descriptions.

The previously open Devin analysis noting that backend-runtime did not bake OCI labels was answered with this exact-head source/test evidence and is now resolved/outdated. Current review-thread inventory is zero unresolved. Historical reviews belong to predecessor heads and do not transfer.

No action pin, permission, security gate, provenance/SBOM control, deployment condition, reviewer identity, or protected-branch rule is weakened. No force-push, destructive rebase, dummy/no-op requeue commit, or source copy from another canonical owner was used.

Historical hosted evidence — ae002

For unchanged head ae002ebed3cb396c92ee9f0116c3c6c8a3389204:

  • Application CI 34076831919success
  • Bandit Security Scan 34076831965success
  • Build and Publish Docker Images 34076832031in progress
  • Security Scan 34076831912queued
  • SAST Semgrep 34076831800queued
  • CodeQL PR 34076831810queued
  • current-head independent review — explicitly requested after Ready transition; verdict pending

Queued/in-progress/absent evidence is non-passing. Predecessor check results and dismissed/comment-only reviews are not current-head merge authority. Ready is review admission only; it does not authorize merge while required execution or post-last-push approval is incomplete.

Compatibility and release boundary

The combined naruon image remains a compatibility artifact while backend and frontend are independently addressable release targets. The acceptance criteria in #1022 remain incomplete after this slice; it does not prove deployment, per-image SBOM/provenance publication, rollback/recovery, runtime health, or end-to-end buyer acceptance.

Merge only when one unchanged exact head satisfies every then-live repository/organization required check, all valid findings/threads are resolved, and the live one-approval/post-last-push review requirement is satisfied. No self-approval, review fabrication/dismissal, admin/bypass merge, force-push, destructive rebase, dummy requeue commit, synthesized status, or gate weakening.

Summary by CodeRabbit

  • Bug Fixes

    • Improved attachment filename sanitization to better block encoded and Windows-style path traversal attempts while preserving safe filenames.
    • Fixed frontend container startup behavior so configured ports are expanded reliably.
  • Chores

    • Improved Docker image build validation, caching, runtime isolation, and metadata.
    • Excluded virtual-environment files from Docker build contexts.
  • Documentation

    • Added documentation covering runtime image boundary verification and security considerations.

@coderabbitai

coderabbitai Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: d439a348-9aea-4032-97ab-8a870fe87316

📥 Commits

Reviewing files that changed from the base of the PR and between 8c71263 and 9b137f2.

📒 Files selected for processing (7)
  • .dockerignore
  • .github/workflows/docker-publish.yml
  • Dockerfile
  • backend/tests/test_release_governance.py
  • backend/tests/test_runtime_image_targets.py
  • docs/doctoring/runtime-image-boundary-verification.md
  • frontend/Dockerfile

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The workflow now builds backend, frontend, and combined images from explicit Docker stages. The Dockerfiles update runtime commands, OCI metadata, user creation, and build exclusions. The attachment filename sanitizer now handles encoded traversal, residual percent escapes, and Windows-style separators.

Changes

Runtime image targets

Layer / File(s) Summary
Runtime stage contracts
Dockerfile, frontend/Dockerfile, .dockerignore
The Dockerfiles define named runtime stages, updated OCI metadata, runtime commands, and constrained user creation. Docker build contexts exclude nested .venv directories.
Targeted build validation
.github/workflows/docker-publish.yml, backend/tests/test_runtime_image_targets.py, backend/tests/test_release_governance.py
Validation and release matrices select explicit Docker targets. Tests verify cache-only validation, stage mappings, frontend startup, OCI annotations, and user configuration.
Runtime verification record
docs/doctoring/runtime-image-boundary-verification.md
The documentation records the runtime image fixes, verification results, container checks, remaining checks, and Docker references.

Attachment filename sanitization

Layer / File(s) Summary
Encoded filename sanitization
backend/services/attachment_parser.py, backend/tests/test_attachment_parser.py, .jules/sentinel.md
_safe_filename performs bounded percent-decoding, rejects remaining percent escapes, and extracts basenames across slash styles. Tests cover encoded traversal and unchanged benign names. The security log records the related path traversal case.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to 9b137

This change publishes backend, frontend, and compatibility images from explicit runtime stages and hardens attachment filename handling. The supplied evidence identifies no remaining concrete current-head risk that blocks merge.

Sequence Diagram(s)

sequenceDiagram
  participant BuildWorkflow
  participant DockerTarget
  participant RuntimeImage
  BuildWorkflow->>DockerTarget: select matrix target
  DockerTarget->>RuntimeImage: build backend, frontend, or combined stage
  RuntimeImage->>RuntimeImage: run configured runtime command
Loading
🚥 Pre-merge checks | ✅ 2 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The pull request implements explicit backend, frontend, and compatibility Docker targets and binds validation and publication to those targets [#1022]. However, the linked issue also requires protecte… Complete and verify the full protected release gate set on the exact head. Include independent image builds, per-image security scans, SBOM and provenance, health and connectivity checks, Compose compatibility, end-to-end acceptance, rollba…
Out of Scope Changes check ⚠️ Warning Most changes support the container runtime split. The attachment-parser sanitization changes in backend/services/attachment_parser.py and its tests, plus the .jules/sentinel.md security log entry,… Remove the attachment-parser changes and the related .jules/sentinel.md entry from this pull request, or link them to a separate issue with explicit scope.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: publishing explicit split container runtime targets.
Full details: Linked Issues check

Explanation

The pull request implements explicit backend, frontend, and compatibility Docker targets and binds validation and publication to those targets [#1022]. However, the linked issue also requires protected integrated-release validation, complete CI and security gates, provenance and SBOM evidence, per-runtime acceptance, and post-last-push approval. The provided context states that these requirements remain incomplete.

Resolution

Complete and verify the full protected release gate set on the exact head. Include independent image builds, per-image security scans, SBOM and provenance, health and connectivity checks, Compose compatibility, end-to-end acceptance, rollback guidance, resolved review threads, and qualifying post-last-push approval before closing the issue.

Full details: Out of Scope Changes check

Explanation

Most changes support the container runtime split. The attachment-parser sanitization changes in backend/services/attachment_parser.py and its tests, plus the .jules/sentinel.md security log entry, are unrelated to the linked issue's container-runtime objectives [#1022].

  • Fix all pre-merge checks with AI
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/publish-independent-runtime-targets

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 marked this pull request as ready for review August 15, 2026 21:20

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please perform a fresh formal review of unchanged exact head 4f881bcd657d2e6b6dbf35ee913e00f7478916e1. Application CI, container, dependency, Bandit, SAST, and security workflows are terminal-success; there are no current formal reviews or review threads. Verify the four-file explicit Docker-target publication repair.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected_head='4f881bcd657d2e6b6dbf35ee913e00f7478916e1'
repo='ContextualWisdomLab/naruon'
pr='1365'

echo '== Checked-out HEAD =='
git rev-parse HEAD
git status --short
git merge-base --is-ancestor "$expected_head" HEAD && echo "Expected head is reachable from checked-out HEAD"

echo '== PR metadata =='
gh pr view "$pr" --repo "$repo" \
  --json number,title,headRefOid,baseRefOid,mergeStateStatus,reviewDecision,reviews,statusCheckRollup \
  --jq '{number,title,headRefOid,baseRefOid,mergeStateStatus,reviewDecision,reviews:[.reviews[]|{author:.author.login,state,commit:.commit.oid}],checks:[.statusCheckRollup[]|{name:(.name // .context),status:(.status // .state),conclusion:.conclusion}]}'

echo '== Changed files and exact diff =='
git diff --name-status bc98789521d21271e84789888413c182aa111b4d "$expected_head"
git diff --find-renames --find-copies --unified=80 \
  bc98789521d21271e84789888413c182aa111b4d "$expected_head" -- \
  Dockerfile frontend/Dockerfile .github/workflows

echo '== Dockerfile outlines =='
ast-grep outline Dockerfile --items all || true
ast-grep outline frontend/Dockerfile --items all || true

echo '== Full target-related Dockerfile lines =='
rg -n -i -C 4 '^\s*FROM\b|backend-runtime|combined-runtime|frontend-runtime' \
  Dockerfile frontend/Dockerfile

echo '== Workflow build matrix and target bindings =='
fd -t f -e yml -e yaml .github/workflows -x sh -c \
  'echo "---- $1"; rg -n -C 8 -i "matrix:|target:|dockerfile:|file:|context:|docker/build-push-action|build-args" "$1"' sh {}

echo '== Current PR review threads =='
gh api graphql \
  -F owner='ContextualWisdomLab' \
  -F name='naruon' \
  -F number="$pr" \
  -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: 20) {
            nodes { author { login } body path line originalLine commit { oid } }
          }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads.nodes'

Length of output: 37901


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/naruon'
pr='1365'
head='4f881bcd657d2e6b6dbf35ee913e00f7478916e1'

echo '== Regression contract =='
nl -ba backend/tests/test_runtime_image_targets.py

echo '== Target definitions and build-action bindings in docker-publish workflow =='
rg -n -C 6 'component: (backend|naruon|frontend)|dockerfile:|target:|Build PR image without publishing|Build and publish Docker image|docker/build-push-action' \
  .github/workflows/docker-publish.yml

echo '== All Buildx target usages in repository workflows =='
fd -t f -e yml -e yaml . .github/workflows -x sh -c \
  'if rg -q "docker/build-push-action" "$1"; then echo "---- $1"; rg -n -C 4 "docker/build-push-action|^[[:space:]]*target:" "$1"; fi' sh {}

echo '== Current review threads =='
gh api graphql \
  -F owner='ContextualWisdomLab' \
  -F name='naruon' \
  -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        totalCount
        nodes {
          isResolved
          isOutdated
          comments(first: 20) {
            nodes {
              author { login }
              body
              path
              line
              originalLine
              commit { oid }
            }
          }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads'

echo '== Formal review records =='
gh pr view "$pr" --repo "$repo" --json reviews,reviewDecision,mergeStateStatus \
  --jq '{reviewDecision,mergeStateStatus,reviews:[.reviews[] | {author:.author.login,state,commit:.commit.oid,submittedAt}]}'

echo '== Commit identity =='
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"

Length of output: 2157


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/naruon'
pr='1365'
head='4f881bcd657d2e6b6dbf35ee913e00f7478916e1'

echo '== Regression contract =='
cat -n backend/tests/test_runtime_image_targets.py

echo '== docker-publish target definitions and build bindings =='
rg -n -C 8 'component: (backend|naruon|frontend)|dockerfile:|target:|Build PR image without publishing|Build and publish Docker image|docker/build-push-action' \
  .github/workflows/docker-publish.yml

echo '== Build action target binding counts =='
printf 'build actions: '
rg -n 'uses: docker/build-push-action@' .github/workflows/docker-publish.yml | wc -l
printf 'matrix target bindings: '
rg -n 'target: \$\{\{ matrix\.target \}\}' .github/workflows/docker-publish.yml | wc -l
printf 'matrix target entries: '
rg -n '^\s+target: (backend-runtime|combined-runtime|frontend-runtime)$' .github/workflows/docker-publish.yml | wc -l

echo '== Current review threads =='
gh api graphql \
  -F owner='ContextualWisdomLab' \
  -F name='naruon' \
  -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        totalCount
        nodes {
          isResolved
          isOutdated
          comments(first: 20) {
            nodes { author { login } path line originalLine commit { oid } }
          }
        }
      }
    }
  }
}' \
  --jq '.data.repository.pullRequest.reviewThreads'

echo '== Formal review records =='
gh pr view "$pr" --repo "$repo" --json reviews,reviewDecision,mergeStateStatus \
  --jq '{reviewDecision,mergeStateStatus,reviews:[.reviews[] | {author:.author.login,state,commit:.commit.oid,submittedAt}]}'

echo '== Commit identity =='
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"

Length of output: 10751


@seonghobae, I completed a fresh review of exact head 4f881bcd657d2e6b6dbf35ee913e00f7478916e1.

I found no actionable code issues.

Verified items:

  • The four-file change set matches the stated repair.
  • Dockerfile defines backend-runtime and combined-runtime.
  • frontend/Dockerfile defines frontend-runtime.
  • PR validation and tag publication both map:
    • backend → Dockerfile / backend-runtime
    • naruon → Dockerfile / combined-runtime
    • frontend → frontend/Dockerfile / frontend-runtime
  • Both docker/build-push-action steps use target: ${{ matrix.target }}.
  • The regression test asserts all six matrix mappings, both target bindings, and the required named stages.
  • The image validation checks are successful.
  • GitHub reports zero review threads and zero existing formal reviews for this head.

GitHub still reports REVIEW_REQUIRED and BLOCKED. A qualifying independent approval is required before merge.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review only. Re-evaluate unchanged exact head 4f881bcd657d2e6b6dbf35ee913e00f7478916e1 against current develop@bc98789521d21271e84789888413c182aa111b4d. Application CI, container, dependency, Bandit, SAST, and security workflows are terminal-success, with no review threads. Do not update branches, enable auto-merge, merge, or write source. Submit a formal current-head review of the explicit split runtime-target publication repair.

@cursor

cursor Bot commented Aug 17, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

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

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 success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before 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 head aaf0d80fe1671b0b16d9010b368f482d511d162c.

  • Head SHA: aaf0d80fe1671b0b16d9010b368f482d511d162c

  • Workflow run: 32123678070

  • Workflow attempt: 1

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: docker-publish.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: docker-publish.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: Dockerfile"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: Dockerfile"]
  R2 --> V2["required checks"]
  Evidence --> S3["Backend: test_runtime_image_targets.py"]
  S3 --> I3["API and service runtime"]
  I3 --> R3["Review risk: Backend: test_runtime_image_targets.py"]
  R3 --> V3["backend tests"]
  Evidence --> S4["Frontend: Dockerfile"]
  S4 --> I4["browser runtime and bundle"]
  I4 --> R4["Review risk: Frontend: Dockerfile"]
  R4 --> V4["frontend tests"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 8c712639f8f754fc59f7cc31976d9324058b4e0e:

  • Draft PR: merge automation is paused.
  • 1 unresolved current review thread(s) remain.
  • Required check coverage-source-tree is CANCELLED on the current head.

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

Note

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@seonghobae

Copy link
Copy Markdown
Contributor Author

The failed Strix run for head 3e7cc544982281d49b239fed8424a0479ccef9be was from the pre-ContextualWisdomLab/.github#1177 gate: it emitted repeated MODEL QUALITY WARNING signals, then a fallback report containing synthetic CVE identifiers and locations outside this PR’s changed surface. No source fix is justified from that untrusted report; the split-runtime checks themselves passed. Re-run current-head Strix and review after the central gate repair; auto-merge is enabled.

@seonghobae
seonghobae enabled auto-merge (squash) August 20, 2026 19:41
@seonghobae
seonghobae force-pushed the fix/publish-independent-runtime-targets branch from 3e7cc54 to 43666be Compare August 21, 2026 02:12
@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 22, 2026 07:42

Stale review: cited a coverage-evidence/required-check failure on an earlier commit; current head has been verified (gh pr checks) to pass coverage-evidence and all other non-metadata-gate required checks, with no current-head review from this reviewer. Dismissing as superseded per AGENTS.md stale-review guidance.

@opencode-agent opencode-agent Bot added priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: bug Defect or incorrect behavior labels Aug 22, 2026
@seonghobae

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review Please independently review the complete exact current head against protected develop@81c105645ca6e680f5f8c15ba9c33b67eb63c48b. Re-read the full diff, current Checks, security/supply-chain impact, and all prior findings; publish a current-head substantive verdict with no stale evidence.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Correction: the prior review request comment was malformed by the shell and did not include the SHA. Please independently review the complete exact current head against protected develop@81c105645ca6e680f5f8c15ba9c33b67eb63c48b. Re-read the full diff, current Checks, security/supply-chain impact, and all prior findings; publish a current-head substantive verdict with no stale evidence.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Final correction: exact current head is 43666be. Please independently review the complete current diff against protected develop at 81c1056, re-check all current Checks and prior findings, and publish a current-head substantive verdict.

Normalize backslashes to slashes and reject residual URL-encoded traversal sequences in _safe_filename before taking Path(...).name, closing a Windows-style and percent-encoded path-traversal vector in the attachment parser.
@opencode-agent
opencode-agent Bot disabled auto-merge August 31, 2026 06:42
auto-merge was automatically disabled September 3, 2026 10:41

Pull request was converted to draft

@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 new potential issues.

⚠️ 1 issue in files not directly in the diff

⚠️ Literal percent filenames are decoded

Valid attachment names containing literal percent escapes are rewritten by unquote, although MIME filenames are already decoded. Displayed names and extension-based parser selection can both change.

Devin Review

Comment thread Dockerfile Outdated
coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 3, 2026
@seonghobae
seonghobae dismissed coderabbitai[bot]’s stale review September 3, 2026 10:45

The merge-base changed after approval.

@seonghobae seonghobae added the bug Something isn't working label Sep 7, 2026 — with ChatGPT Codex Connector
JSONArgsRecommended 경고를 exec-form CMD로 수리한다. runtime PORT 확장과 기본값, Next 프로세스로의 exec는 보존한다. 기존 runtime-target delta와 보호 develop 병합은 그대로 유지하며 파일 삭제는 없다.

회귀 계약 RED 1 failed/1 passed 후 GREEN 2 passed. Docker buildx --check는 no warnings found. 실제 이미지 종료 동작과 전체 이미지 재빌드는 별도 검증 대상이다.

근거: https://docs.docker.com/reference/build-checks/json-args-recommended/

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

seonghobae commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

프런트엔드 시작 명령 경고 수리

현재 head: 1bda1b5bc4e13f74f36133a7835ec0ad7ddb393e. 이전 8c712639f8f754fc59f7cc31976d9324058b4e0e에서 일반 fast-forward push했으며 기존 runtime-target 변경은 모두 보존했습니다.

#1352 run34074272529/frontend job101597257071은 SUCCESS지만 frontend/Dockerfile:77에 실제 JSONArgsRecommended annotation이 남았습니다. 같은 명령이 이 PR에도 존재했습니다. shell-form CMD가 만드는 외부 shell을 JSON exec-form으로 제거했고, 내부 shell의 runtime PORT 기본값·인용·Next로의 exec는 유지했습니다. 경고 억제용 SHELL 설정이나 별도 wrapper는 추가하지 않았습니다.

기존 backend/tests/test_runtime_image_targets.py에 회귀 계약 하나를 추가했습니다. RED: 1 failed/1 passed, JSONDecodeError, exit1. 수정 후 고정 head의 uv run --frozen --offline python -m pytest --noconftest tests/test_runtime_image_targets.py -q -W error는 2 passed/0.04초/exit0입니다. Ruff와 diff 검사도 통과했습니다. 동일 수정 트리의 docker buildx build --check --file frontend/Dockerfile --target frontend-runtime .는 exit0, Check complete, no warnings found를 출력했습니다.

이는 명령 구조와 Docker build check 근거입니다. 실제 Linux PID 1 종료·신호 전달, 새 전체 이미지 build, 배포·rollback·독립 리뷰·보호 병합을 입증하지 않습니다. Draft를 유지하며 새 head의 hosted 검사가 필요합니다. 원시 출력은 이 작업의 도구 실행 기록에 있고 별도 로그 파일이나 제품 스크린샷을 만들었다고 주장하지 않습니다.

근거(APA 7): Docker, Inc. (n.d.). JSONArgsRecommended. Docker Docs. Retrieved September 7, 2026, from https://docs.docker.com/reference/build-checks/json-args-recommended/

기존 릴리스 계약 누락 보완

후속 head 807eaa800e8835766545b0dffc46be26d8bdf299를 같은 PR에 일반 push했다. 초기 2개 검사는 기존 test_release_governance.py:765의 shell-form 기대값을 포함하지 못했다. 해당 테스트를 실제 실행해 1 failed/0.37초/exit1을 확인한 후 JSON exec-form 기대값으로 한 줄 수정했다. runtime 변경이나 기존 assertion 삭제는 없다.

고정 후속 head에서 uv run --frozen --offline python -m pytest --noconftest tests/test_release_governance.py tests/test_runtime_image_targets.py -q -W error는 37 passed/0.24초/exit0이다. 두 파일 Ruff와 diff 검사도 통과했다. 앞선 2-test 결과는 당시 좁은 범위의 증거로만 보존한다. 새 hosted 결과와 실제 컨테이너 종료 검증은 여전히 별도이며, 로컬에는 해당 Naruon 이미지가 없어서 다른 제품 이미지를 대체 증거로 사용하지 않았다.

앞선 runtime-target 검사에서 누락한 기존 release-governance의 shell-form 기대값을 JSON exec-form으로 맞춘다. runtime 변경이나 assertion 삭제는 없으며 단일 계약 RED 뒤 관련 두 파일 37개 검사와 Ruff가 통과했다.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
공통 OCI ARG와 LABEL을 backend-runtime으로 이동해 combined-runtime이 상속하게 한다. 통합 이미지 제목과 설명만 기존 값으로 재지정하며 workflow의 배포 metadata와 build-arg 계약은 그대로 둔다. 중복 라벨 블록의 재배치이며 기존 실행 단계나 delta 삭제는 없다.

backend 단계 라벨 누락 RED1 후 관련37검사와 Ruff가 통과했다. Docker backend --check도 경고 없이 통과했다. 기본 라벨은 release provenance 증명이 아니며 실제 image inspect와 hosted 검증은 별도다.

근거: Docker, Inc. (n.d.). Build variables. https://docs.docker.com/build/building/variables/

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

독립 백엔드 기본 OCI 라벨 수리

현재 head ae002ebed3cb396c92ee9f0116c3c6c8a3389204는 807eaa80의 일반 후속 커밋입니다. 정보 리뷰 discussion_r3923675983의 범위를 확인한 결과, publish workflow의 metadata-action 라벨은 원래 존재했습니다. 배포 이미지 라벨 누락으로 주장하지 않습니다. 실제 공백은 독립 backend-runtime을 로컬 빌드할 때 combined-runtime 안의 ARG/LABEL이 포함되지 않는 점이었습니다.

공통 블록을 backend-runtime으로 이동하고 combined-runtime은 상속하도록 바꿨습니다. 두 이미지의 제목과 설명만 각 단계에서 구분하며, workflow·실행 명령·의존성·보호 게이트는 바꾸지 않았습니다. 기본 라벨이 source revision이나 release provenance 전체를 증명한다는 과장도 주석에서 제거했습니다.

기존 전체 OCI 키 검사에 backend 단계 범위를 추가해 RED 1 failed/0.28초/exit1을 확인했습니다. 실제 FROM 경계와 backend/combined 이름·설명 재지정까지 포함한 고정 head 검증은 release-governance + runtime-targets 37 passed/0.30초/exit0입니다. Ruff와 diff 검사도 통과했습니다. 수정 트리의 Docker buildx backend --check는 exit0, no warnings found였습니다.

명령: backend에서 uv run --frozen --offline python -m pytest --noconftest tests/test_release_governance.py tests/test_runtime_image_targets.py -q -W error.

실제 최종 이미지 inspect, 플랫폼별 전체 build, 종료 동작, 배포·독립 승인·보호 병합은 아직 별도 검증 대상입니다. 정보 리뷰를 자동 resolve하거나 Draft를 해제하지 않았습니다.

근거(APA 7): Docker, Inc. (n.d.). Build variables. Docker Docs. Retrieved September 7, 2026, from https://docs.docker.com/build/building/variables/ . 부모 단계에서 선언한 build argument의 자식 단계 상속을 따릅니다.

@seonghobae

Copy link
Copy Markdown
Contributor Author

실제 backend 이미지 라벨 검증

고정 ae002ebed3cb396c92ee9f0116c3c6c8a3389204의 git archive를 별도 context로 사용해 backend-runtime을 한 번 실제 빌드했습니다. 로컬 가상환경과 미추적 파일은 포함하지 않았습니다. build handle44366은 최종 exit0입니다.

naruon-pr1365-backend:ae002ebe의 image ID는 sha256:edafcfa753f05c90f2a8a9c20f2eaf98164c5c65324dbd668a3f15ce2a729522, 플랫폼은 linux/arm64입니다. 실제 image inspect에서 14개 OCI label 키, title=naruon backend, description=Naruon FastAPI backend runtime image, Python pinned base digest를 확인했고 assertion 명령은 exit0입니다. User=appuser와 scripts/start_backend.py 기본 CMD도 유지됩니다.

기본 created/revision/ref.name 값은 비어 있습니다. 이번 증거는 로컬 backend target의 라벨 포함 여부이며, complete release provenance나 배포·amd64·통합 이미지·실제 앱 종료 동작을 증명하지 않습니다.

실제 build step11에 useradd warning: appuser uid 10001 is greater than SYS_UID_MAX 999가 남았습니다. 빌드 exit0을 warning-free로 기록하지 않습니다. UID/GID10001과 비루트 실행 계약을 보존하는 계정 생성 수리가 후속 대상입니다. 기존 서비스나 이미지는 교체하지 않았습니다.

@seonghobae
seonghobae marked this pull request as ready for review September 7, 2026 02:46

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review the unchanged current head ae002ebed3cb396c92ee9f0116c3c6c8a3389204 against protected develop@042b0c70531b229af3acbd0421a2f23098d848b3. Focus on the five-file effective protected-base delta and the three post-restack repairs: frontend exec-form runtime command, synchronized release-governance contract, and baked OCI metadata for the independent backend target. Do not transfer predecessor-head approvals or findings as current-head verdict evidence.

useradd 호출 한 번에 SYS_UID_MAX=10001을 지정해 --system과 고정 UID의 범위 충돌을 해결한다. 전역 login.defs, UID/GID10001, nologin, 비루트 실행은 변경하지 않는다. 파일 삭제와 경고 필터링은 없다.

RED1/34pass 후 관련37pass와 Ruff 통과. 고정 Python 기반 이미지의 network-none 임시 컨테이너에서 Dockerfile의 실제 계정 생성 명령을 실행해 경고 부재, UID/GID10001, nologin을 검증했다. 이전 전체 이미지의 경고를 소급 통과시키지 않는다.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

고정 UID 경고 수리

후속 head b533aa64b19f44daca1367c2048d7d99bf3fde24를 정상 push했습니다. ae002 실제 빌드의 useradd SYS_UID_MAX 경고는 --system과 UID10001의 기본 범위 충돌입니다. useradd 호출에만 --key SYS_UID_MAX=10001을 지정했습니다. 시스템 계정 종류, UID/GID10001, nologin, 비루트 실행, 전역 login.defs는 그대로입니다. 경고 필터는 추가하지 않았습니다.

회귀 RED 1 failed/34 passed/7.41초/exit1 뒤, 고정 후속 head에서 관련 37 passed/0.81초/exit0, Ruff와 diff 검사가 통과했습니다. Dockerfile에서 실제 계정 생성 RUN을 읽어 고정 Python 기반 이미지의 network-none 임시 컨테이너에서 실행했습니다. useradd 경고 없이 끝났으며 UID/GID10001과 nologin을 직접 assertion했습니다. 임시 컨테이너는 --rm으로 실행 종료 때 제거됐습니다.

이것은 계정 생성 명령의 실제 Linux 검증입니다. b533의 전체 이미지를 다시 빌드했다는 뜻은 아니며 ae002 전체 빌드의 경고는 당시 실패 관찰로 남습니다. 후속 hosted build와 보호 병합은 별도입니다. push 후 API는 Ready/OPEN을 반환했지만 이 작업이 Draft를 해제한 것은 아닙니다.

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/naruon'
pr='1365'
head='ae002ebed3cb396c92ee9f0116c3c6c8a3389204'
base='042b0c70531b229af3acbd0421a2f23098d848b3'

echo '== Commit and checkout identity =='
printf 'checkout='; git rev-parse HEAD
git show -s --format='requested=%H%nparents=%P%nsubject=%s' "$head"
git merge-base --is-ancestor "$base" "$head" && echo 'protected base is an ancestor of requested head'

echo '== PR identity and current check state =='
gh pr view "$pr" --repo "$repo" \
  --json number,headRefOid,baseRefOid,reviewDecision,mergeStateStatus,isDraft,statusCheckRollup,reviews \
  --jq '{number,headRefOid,baseRefOid,reviewDecision,mergeStateStatus,isDraft,checks:[.statusCheckRollup[] | {name:(.name // .context),status:(.status // .state),conclusion:.conclusion,detailsUrl}],reviews:[.reviews[] | {author:.author.login,state,commit:.commit.oid,submittedAt}]}'

echo '== Complete protected-base changed-file list =='
git diff --name-status "$base" "$head"
echo '== Complete protected-base diff =='
git diff --find-renames --find-copies --unified=60 "$base" "$head"

echo '== Relevant file outlines =='
ast-grep outline Dockerfile --items all || true
ast-grep outline frontend/Dockerfile --items all || true
ast-grep outline backend/services/attachment_parser.py --items all || true
ast-grep outline backend/tests/test_runtime_image_targets.py --items all || true
ast-grep outline backend/tests/test_release_governance.py --items all || true

echo '== Dockerfiles: stages, labels, entrypoint, and command =='
rg -n -C 12 '^\s*(FROM|ARG|LABEL|ENTRYPOINT|CMD)\b|backend-runtime|combined-runtime|frontend-runtime|appuser' \
  Dockerfile frontend/Dockerfile

echo '== Publication workflow: matrices and Buildx inputs =='
rg -n -C 12 'pull_request_image_validation|publish_images|matrix:|component:|dockerfile:|target:|docker/build-push-action|file:|context:' \
  .github/workflows/docker-publish.yml

echo '== Changed regression-test regions =='
rg -n -C 10 '_safe_filename|frontend-runtime|backend-runtime|combined-runtime|JSONArgsRecommended|CMD|LABEL|org\.opencontainers' \
  backend/tests/test_attachment_parser.py \
  backend/tests/test_runtime_image_targets.py \
  backend/tests/test_release_governance.py \
  backend/services/attachment_parser.py \
  .jules/sentinel.md || true

echo '== Current review threads =='
gh api graphql \
  -F owner='ContextualWisdomLab' -F name='naruon' -F number="$pr" \
  -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        totalCount
        nodes {
          isResolved
          isOutdated
          comments(first: 20) {
            nodes { author { login } path line originalLine commit { oid } }
          }
        }
      }
    }
  }
}' --jq '.data.repository.pullRequest.reviewThreads'

Length of output: 115465


@seonghobae, I cannot complete a current-head formal review for ae002ebed3cb396c92ee9f0116c3c6c8a3389204.

GitHub now reports PR #1365 head b533aa64b19f44daca1367c2048d7d99bf3fde24. The requested SHA is no longer the current head.

The five-file delta from 042b0c70531b229af3acbd0421a2f23098d848b3 supports the requested repairs:

  • The workflow selects explicit backend, combined, and frontend targets in both image matrices.
  • The frontend command uses JSON exec form and preserves runtime PORT expansion.
  • The release-governance contract checks the frontend command and the backend-stage OCI metadata.
  • backend-runtime contains the complete OCI label set.
  • combined-runtime overrides its title and description labels.

However, the current checks are queued for b533aa64b19f44daca1367c2048d7d99bf3fde24. GitHub also reports REVIEW_REQUIRED and BLOCKED.

Please request a fresh review for the current SHA after the required checks reach terminal status.

You are interacting with an AI system.

일반 backend COPY가 호스트 .venv 패키지를 가져오지 않도록 모든 깊이의 .venv를 제외한다. 기존 잠금 의존성 설치와 사용자 파일은 유지하고 삭제하지 않는다. tracked archive만 쓰던 검증 절차의 전제를 일반 빌드 설정으로 보완한다.

누락 규칙 RED1/2pass 후 관련38검사와 Ruff 통과. 이번 증거는 설정 계약이며 새 전체 이미지 빌드 증거가 아니다.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

일반 로컬 빌드의 가상환경 제외

후속 head 08417ad4b5b05a8d45abed67d5849228e5c21c31를 정상 push했습니다. 실제 이미지 검증 준비 중 발견한 backend/.venv 유입 가능성을 .dockerignore**/.venv 한 규칙으로 막았습니다. 이전에는 tracked archive로 검증만 격리했지만, 일반 개발자의 COPY backend에도 같은 경계가 필요했습니다. 호스트 파일을 삭제하거나 잠금 파일 의존성 설치를 변경하지 않았습니다.

누락 규칙 RED 1 failed/2 passed/3.23초/exit1 뒤, 고정 후속 head에서 관련 release/runtime 검사 38 passed/0.28초/exit0, Ruff와 diff 검사 통과입니다. 이는 설정 회귀 검증이고 실제 Docker context 필터 동작이나 최신 전체 이미지 빌드 증거로 확대하지 않습니다. ae002 실제 이미지·b533 실제 계정 생성 결과는 각 커밋의 범위로 보존합니다. 현재 Ready/OPEN이며 새 exact-head Checks와 독립 승인·보호 병합은 미완료입니다.

@seonghobae

Copy link
Copy Markdown
Contributor Author

최신 실제 빌드와 가상환경 제외 검증

고정 head 08417ad4b5b05a8d45abed67d5849228e5c21c31의 git archive context에 backend/.venv/context_probe.txt라는 빌드 입력 검사용 표식 하나만 추가했습니다. 앱·고객·provider 자료가 아닌 빌드 필터 단위 표식입니다. 이 context에서 실제 backend-runtime 이미지 빌드가 exit0으로 끝났습니다. 변경되지 않은 의존성 설치 단계는 정상 BuildKit cache를 재사용했습니다.

이미지: naruon-pr1365-backend:08417ad4, ID sha256:d2ea778c9f7f6a0c4c0dd479a3b20e049f71c94bab5d79872ab4ac6210160068, linux/arm64, title=naruon backend.

원시 빌드 로그에서 warning/fatal/denied/timeout 단어 검사를 수행해 0건을 확인했습니다. 실제 이미지에서 network-none/read-only/cap-drop ALL/no-new-privileges 임시 컨테이너를 실행해 /app/.venv 부재, UID/GID10001, nologin을 assertion했고 exit0입니다. 컨테이너는 --rm으로 정상 제거됐습니다. 이전 ae002의 useradd 경고를 소급 통과 처리하지 않습니다.

원시 로그 /private/tmp/naruon-pr1365-final-build.log, SHA-256 709dd7388d500aa666b7e1ac42f316d7f69fb536c17137159fdc0fba1e7bc21d.

이 검증은 로컬 ARM64 backend 빌드와 파일 제외·계정 계약입니다. 실제 backend 앱 기동, frontend SIGTERM, amd64/통합 이미지, release provenance, 제품 Visual Inspection, hosted Checks와 보호 병합을 대신하지 않습니다.

기존 PR의 CMD·OCI·UID·빌드 context 수리와 RED/검증 근거를 연결한다. 구현08417의 실제 이미지 증거와 문서 후속 커밋을 구분하고 미검증 범위를 유지한다. runtime 변경이나 삭제는 없다.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

검증 문서를 docs/doctoring/runtime-image-boundary-verification.md에 추가했습니다. 문서 후속 head는 597192f0a799db5710da76b04bd5df4a5533eed6이며 구현08417 이후 runtime 변경은 없습니다. 구현 커밋의 시험 결과를 문서 커밋의 전체 hosted 검사로 전용하지 않습니다.

실제 Edge에서 GitHub exact-SHA Preview를 직접 시각 검수했습니다. 데스크톱의 문제/선택 문단과 모바일390×844의 실패·명령·이미지 식별자·남은 위험·참고 문헌을 확인했습니다. 관찰한 문단 겹침은 없고 긴 해시는 줄바꿈됩니다. 명령 블록은 좁은 화면에서 GitHub의 가로 스크롤을 사용합니다. viewport는 원래 크기로 복원했습니다. 원본 스크린샷은 작업 도구 출력에 있으며 별도 PNG 파일은 만들지 않았습니다. 이는 문서 렌더 검수이지 로그인한 제품 UI의 정상 상태 검수가 아닙니다.

@seonghobae

Copy link
Copy Markdown
Contributor Author

추가 실제 이미지 검증: 구현 08417ad(현재597192는 문서만 추가)의 linux/arm64 프런트엔드 이미지 sha256:e9245f30a8e9dcd6bf0378b32c55f7a5112a0c992df10b2d7ecc275ac10436fe를 로컬에 생성했습니다. 빌드 프로세스 종료와 최종 DONE을 확인했습니다. 외부 네트워크·고객 자료·인증 비밀 없이 실제 컨테이너에서 Next.js16.2.12가 PID1이고 PORT3107로 시작됨을 확인했습니다. 최초 HTTP assertion은 401을 잘못 기대해 실패했습니다. GET/sessionJson 실제 소스를 확인한 뒤 200, Cache-Control:no-store, authenticated:false 계약을 다시 검증해 통과했습니다. 정상 로그인 제품 VI의 증거는 아닙니다.

두 차례 normal docker stop 뒤 주 프로세스 ExitCode143, OOMKilled:false, Error빈값을 확인했습니다. 첫 종료에서는 실행 중 healthcheck가137로 끝났으므로 모든 cleanup이 경고 없이 성공했다고 주장하지 않습니다. 중지된 검증 컨테이너와 이미지는 근거 보존을 위해 남겼습니다.

로컬 빌드에는 npm 다운로드 지연 WARN5건이 남았습니다. GitHub image run34077982014의 세 validation job도 terminalSUCCESS이나 frontend job101607722107 rawlog에 다운로드 지연 WARN과 No output specified 경고가 있습니다. JSONArgsRecommended 재발은 해당 로그에서 찾지 못했습니다. 출력 방식 명시 수리를 기존 owner에서 검토하며, 이번 결과를 warning-free gate나 release/배포 증거로 확대하지 않습니다.

출력 미지정 경고의 원인을 PR build 입력에서 수정한다. 게시 금지와 amd64/arm64 검증은 유지한다. 회귀 RED 1실패/2통과, 후속 38통과 및 Ruff/diff 검사 통과. 기존 delta 삭제나 병합은 없다.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

현재 head 9b137f25f426743e18fc61125575ec7949d45db8에서 PR validation의 출력 방식을 type=cacheonly로 명시했습니다. Docker 공식 문서의 test-build 계약을 적용했으며 기존 게시 금지와 linux/amd64,linux/arm64는 그대로입니다: https://docs.docker.com/build/exporters/#cache-only-export

누락 회귀검사는 수정 전 1실패/2통과(4.08초), 수정 후 두 파일 38통과(3.88초), 커밋 동결 후 38통과(3.50초)입니다. Ruff와 diff 검사를 통과했고 해당 workflow actionlint도 exit0/무출력입니다. 새 hosted Checks는 아직 대기·실행 중이므로 과거 성공을 현재 head의 통과로 사용하지 않습니다. registry 다운로드 지연 경고는 별도 미해결이며 숨기는 설정은 추가하지 않았습니다.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 7, 2026
@seonghobae
seonghobae dismissed coderabbitai[bot]’s stale review September 7, 2026 03:35

The merge-base changed after approval.

@seonghobae

Copy link
Copy Markdown
Contributor Author

現 head 9b137f25f426743e18fc61125575ec7949d45db8의 image run34079790641에서 backend job101612776465가 terminalSUCCESS입니다. 원시 job 로그를 직접 읽어 --output type=cacheonly 명령 적용, No output specified 0건, JSONArgsRecommended 0건, WARN/WARNING 단어가 있는 로그 줄 0건을 확인했습니다. 출력 미지정 경고 수리는 이 backend hosted 실행 범위에서 확인됐습니다. frontend101612776305와 combined101612776463은 아직 실행 중이며 이 결과를 두 job이나 전체 release 증거로 확대하지 않습니다.

@seonghobae

Copy link
Copy Markdown
Contributor Author

현재 9b137f25f426743e18fc61125575ec7949d45db8의 image run34079790641이 세 validation job 모두 terminalSUCCESS로 끝났습니다. raw job 로그별 검사 결과: backend101612776465 WARN/WARNING0줄, combined101612776463 4줄, frontend101612776305 7줄입니다. 세 로그 모두 --output type=cacheonly 적용을 확인했고 No output specified와 JSONArgsRecommended는 각각0건입니다.

출력 미지정 경고 수리는 세 hosted 이미지 검증에서 확인됐습니다. 남은 11개 경고 줄은 npm registry 요청지연이며 이 결과를 warning-free 통과나 release/배포 증거로 확대하지 않습니다. 같은 head를 이유 없이 재실행하거나 경고 임계값을 높이지 않습니다. 기존 경고 로그를 보존하며 요청지연의 원인은 별도 분석 대상입니다.

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

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 9b137f25f426743e18fc61125575ec7949d45db8.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: .dockerignore"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: .dockerignore"]
  R1 --> V1["required checks"]
  Evidence --> S2["Workflow: docker-publish.yml"]
  S2 --> I2["GitHub Actions review job"]
  I2 --> R2["Review risk: Workflow: docker-publish.yml"]
  R2 --> V2["actionlint plus required checks"]
  Evidence --> S3["Repository file: sentinel.md"]
  S3 --> I3["repository behavior"]
  I3 --> R3["Review risk: Repository file: sentinel.md"]
  R3 --> V3["required checks"]
  Evidence --> S4["Repository file: Dockerfile"]
  S4 --> I4["repository behavior"]
  I4 --> R4["Review risk: Repository file: Dockerfile"]
  R4 --> V4["required checks"]
  Evidence --> S5["Backend: attachment_parser.py"]
  S5 --> I5["API and service runtime"]
  I5 --> R5["Review risk: Backend: attachment_parser.py"]
  R5 --> V5["backend tests"]
  Evidence --> S6["Test: test_attachment_parser.py (3 files)"]
  S6 --> I6["regression suite"]
  I6 --> R6["Review risk: Test: test_attachment_parser.py (3 files)"]
  R6 --> V6["targeted test run"]
  Evidence --> S7["Docs: runtime-image-boundary-verification.md"]
  S7 --> I7["operator or user guidance"]
  I7 --> R7["Review risk: Docs: runtime-image-boundary-verification.md"]
  R7 --> V7["docs review"]
  Evidence --> S8["Frontend: Dockerfile"]
  S8 --> I8["browser runtime and bundle"]
  I8 --> R8["Review risk: Frontend: Dockerfile"]
  R8 --> V8["frontend tests"]
Loading

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: medium Normal-priority or P2 work status: blocked Blocked by conflict, dependency, or required prerequisite type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant