Skip to content

fix(security): upgrade Hono and harden attachment status refresh - #432

Merged
opencode-agent[bot] merged 77 commits into
developfrom
fix/security-hono-attachment-refresh-final
Aug 14, 2026
Merged

fix(security): upgrade Hono and harden attachment status refresh#432
opencode-agent[bot] merged 77 commits into
developfrom
fix/security-hono-attachment-refresh-final

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request combines the Hono security update with buyer-visible attachment-list and Clearfolio boundary hardening:

  • upgrade hono from 4.12.32 to 4.13.0, remediating CVE-2026-69207;
  • remove the attachment-list N+1 SELECT job_id lookup;
  • reuse module-level prepared statements for project-wide and task-filtered attachment queries;
  • use a documented, configurable bounded status-refresh worker pool (default 8, cap 32);
  • apply both an AbortSignal-backed per-item timeout and a request-wide refresh budget;
  • persist only changed statuses and isolate timeout, downstream, malformed-response, and write failures;
  • count missing conversion identifiers as skipped data-quality cases while reserving deferred for valid work not started before the latency budget;
  • keep Clearfolio conversion identifiers internal by omitting jobId from both upload and list JSON responses;
  • expose attempted, changed, failed, skipped, and deferred counters plus fixed timeout, downstream-lookup, invalid-status, and persistence failure counters through JSON and Prometheus metrics;
  • make test:coverage itself produce exact Istanbul JSON and JSON-summary evidence so central current-head review cannot execute tests without coverage output;
  • sanitize Clearfolio submission, status, and artifact-link transport failures so internal network details and downstream response text cannot reach browser or diagnostic payloads;
  • validate submission, status, and artifact-link JSON shapes; accept only the exact PENDING, RUNNING, SUCCEEDED, and FAILED conversion states; reject whitespace-padded or unknown states, malformed links, non-HTTP(S) schemes, and HTTPS-to-HTTP downgrade links;
  • document concurrency, timeout, request budget, canary rollout, rollback, metrics, data-quality diagnosis, and horizontal-scaling controls for operators;
  • record the MSA boundary, verification contract, and APA 7th OWASP evidence under docs/doctoring/; and
  • preserve npm as the sole lock authority.

The refresh scheduler remains isolated in server/attachment_status.mjs, independent of Hono and SQLite, so it can be reused by a future standalone service adapter while the current product remains independently operable.

Regression and quality evidence

Focused coverage proves:

  1. 100 pending rows reach but never exceed configured concurrency;
  2. unchanged statuses are not written;
  3. task-filtered and unfiltered routes use the same refresh contract;
  4. downstream, timeout, invalid-status, diagnostic, and write failures are isolated;
  5. missing identifiers are counted as skipped while work beyond the request-wide deadline is counted as deferred;
  6. upload and list JSON expose only the public attachment identifier and status, never the internal Clearfolio jobId;
  7. aggregate failures reconcile to four fixed, sanitized operational categories;
  8. Clearfolio receives the caller AbortSignal and submission/status/artifact-link transport failures expose only fixed operation-level messages;
  9. rejected JSON, null, primitive, array, missing-field, non-string, empty, whitespace-padded, unknown-state, malformed-URL, unsupported-scheme, and HTTPS-downgrade responses fail closed;
  10. relative, absolute HTTPS, artifact-token viewer, and explicitly configured local HTTP flows remain supported;
  11. the coverage entry point instruments both the bounded refresh module and Clearfolio adapter without recursive npm scripts and requires exact json plus json-summary reporters; and
  12. server/attachment_status.mjs must retain 100% statement, branch, function, and line coverage, with current-head coverage and docstring gates required for every changed production path.

Verification

Predecessor exact-tree run 30902156688 completed successfully at commit 140bf95919ff77404d8ed4338667e32b4b973ea9, executing full unit/API/coverage, configured docstring evidence, nine cloud Playwright E2E tests, explicit 100% coverage checks for server/attachment_status.mjs, and git diff --check.

The exact current head additionally separates skipped/deferred semantics, adds low-cardinality failure-category metrics, strengthens the coverage reporter contract, simplifies validated Clearfolio submission parsing, removes the internal conversion identifier from the upload response, and updates focused API tests plus deployment, CHANGELOG, and doctoring evidence. Every repository and central required check must therefore succeed again on the exact current head, followed by independent current-head approval, before merge.

Standards traceability

docs/doctoring/attachment-status-refresh.md records the MSA boundary, verification contract, operational acceptance criteria, and APA 7th references to OWASP API4:2023 Unrestricted Resource Consumption and API10:2023 Unsafe Consumption of APIs. The implementation follows those risk-reduction controls without claiming formal OWASP certification.

Release note

CHANGELOG.md records bounded refresh, request budgeting, malformed-response isolation, exact conversion-state validation, partial-failure behavior, skipped/deferred separation, sanitized category metrics, upload/list identifier hiding, downstream error sanitization, and artifact-link downgrade prevention under Unreleased.

Closes #408. Supersedes #419, #420, and #431.

Summary by CodeRabbit

  • 개선 사항

    • 첨부파일 목록 조회 시 상태가 자동으로 최신화됩니다.
    • 동시성·항목별 시간 제한·전체 처리 예산을 적용해 안정성을 높였습니다.
    • 실패 시 기존 첨부 상태를 유지하고 내부 작업 식별자를 숨깁니다.
  • 보안

    • 세션 토큰 검증과 전체 로그아웃 처리가 강화되었습니다.
    • Clearfolio 상태·아티팩트 링크를 엄격히 검증하고 민감한 오류 정보를 차단합니다.
  • 문서 및 테스트

    • 운영 설정, 모니터링, 롤아웃 절차와 보안 동작을 문서화했습니다.
    • 첨부 상태·인증·외부 연동 테스트 범위를 확대했습니다.

seonghobae and others added 30 commits August 4, 2026 02:23
server/app.mjs에서 첨부파일(attachments)의 PENDING 상태를 동기화할 때,
기존 for...of 루프 내부에서 jobStatus를 순차적으로 await 하던 로직을
Promise.all(rows.map(...))을 사용하도록 변경했습니다.
이를 통해 첨부파일이 여러 개일 경우 발생하는 네트워크 호출 병목을
효과적으로 줄이고 응답 지연을 방지합니다.
server/app.mjs에서 첨부파일(attachments)의 PENDING 상태를 동기화할 때,
기존 for...of 루프 내부에서 jobStatus를 순차적으로 await 하던 로직을
Promise.all(rows.map(...))을 사용하도록 변경했습니다.
이를 통해 첨부파일이 여러 개일 경우 발생하는 네트워크 호출 병목을
효과적으로 줄이고 응답 지연을 방지합니다.

추가로 CI Trivy 스캔에서 발견된 hono 패키지의 취약점(CVE-2026-69207)을
해결하기 위해 버전을 4.12.32에서 4.13.0으로 업데이트했습니다.
Address CodeRabbit feedback: unbounded Promise.all over all pending
attachments could exceed Clearfolio connection/rate limits. Filter to
PENDING/RUNNING rows and process in chunks of 5, preserving best-effort
stale-status handling. Also revise the .jules/bolt.md guidance to require
bounded concurrency for external calls.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@seonghobae
seonghobae marked this pull request as draft August 4, 2026 22:49
auto-merge was automatically disabled August 4, 2026 22:49

Pull request was converted to draft

@seonghobae
seonghobae marked this pull request as ready for review August 4, 2026 22:49

@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 9746592143d4e87c03b7a95adf678e789d3d352a.
  • 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["Changed file (6 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (6 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"]
  Evidence --> S3["Test (6 files)"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test (6 files)"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 0055199096c39874a7d2b5dc086ac2d2750b17ec
  • Workflow run: 31770259928
  • Workflow attempt: 1
  • Gate result: APPROVE (exit 0)

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (7 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (7 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs (3 files)"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs (3 files)"]
  R2 --> V2["docs review"]
  Evidence --> S3["Test (7 files)"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test (7 files)"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 5, 2026 01:00
@seonghobae
seonghobae enabled auto-merge (squash) August 5, 2026 07:21

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Please independently review the exact current head after all current-head checks complete. Verify the Hono security remediation, bounded attachment-status refresh, per-item and request-wide budgets, Clearfolio response validation and sanitization, internal conversion-identifier redaction, low-cardinality failure metrics, real-world regressions, 100% changed-production coverage/docstrings, MSA boundary, CHANGELOG, and APA 7th doctoring. Submit APPROVE only if no blocker remains; do not bypass repository protections.

Copy link
Copy Markdown
Contributor Author

Current-head Strix blocker diagnosis for 9746592143d4e87c03b7a95adf678e789d3d352a: the Strix run completed its repository scan without publishing a vulnerability finding, then failed in provider selection. nvidia/nemotron-3-super-120b-a12b was unavailable; the configured fallback nvidia/llama-3.3-nemotron-super-49b-v1.5 is not a catalog model identifier (the provider response advertises an underscore-form identifier); the final OpenAI fallback then failed because no OpenAI token was configured. This is central review-model infrastructure, not evidence of a ScopeWeave source defect. Do not churn this PR or retry the same immutable configuration. Re-run exact-head Strix only after the central NVIDIA NIM model-catalog repair lands; keep every source CI/security result and independent approval requirement intact.

@opencode-agent
opencode-agent Bot disabled auto-merge August 5, 2026 09:21
@seonghobae
seonghobae marked this pull request as draft August 6, 2026 22:21
@seonghobae
seonghobae marked this pull request as ready for review August 6, 2026 22:21

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Re-evaluate exact unchanged head 9746592143d4e87c03b7a95adf678e789d3d352a against live current evidence. The prior CHANGES_REQUESTED was based solely on Strix job 92153149476 being failed. The live authoritative run 30957249613 has since completed successfully with current strix job 92715244218; Server Tests, Security Scan, SAST Semgrep, Dependency Review, OSV Scanner, Fuzz, and Strix are all now terminal-success on this same head, and all review threads are resolved. Do not reuse the predecessor failed-job snapshot. Recheck the current-head code/evidence and submit a fresh formal review that supersedes the stale check-only CHANGES_REQUESTED if no actionable finding remains. Do not mutate the branch, merge, or bypass review policy.

@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 11, 2026 14:05

Dismissed stale automated request: the cited Strix failure was rerun on the exact head and is now terminal-success; current-head Checks are clean.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Formal review-only request for exact current head 9746592143d4e87c03b7a95adf678e789d3d352a. The prior CHANGES_REQUESTED review was dismissed as stale because its cited Strix failure has a terminal-success rerun on this exact head; all current Checks are terminal-success or expected skip, and all inline review threads are resolved. Please issue an independent exact-head approval if no further change is required.

…ation-current-head

fix(security): enforce strict revocable sessions on every JWT transport

@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 reviewed the current-head bounded evidence and found no blocking issues.

Findings

No blocking findings.

Summary

Approval sufficiency: evidence affirmatively supports PR intent (Hono 4.12.32->4.13.0 CVE-2026-69207 remediation in package.json:13 / package-lock.json:387, N+1 removal and bounded refresh in server/attachment_status.mjs, Clearfolio sanitization in server/clearfolio.mjs, token_version revocation in server/auth.mjs, internal jobId redaction in server/app.mjs) with tests and docs updated on the same head; changed-file evidence inspected: server/attachment_status.mjs (CodeGraph current-head source excerpt) and tests/api/session-revocation.test.mjs (focused-hunk receipt line 208). Verification posture: trusted Coverage execution evidence records supported suites (npm run test:unit, npm run test:api, npm run coverage, npm run fuzz) as PASS and Failed GitHub Check evidence records no completed failed checks for this head. Linter/static: repo lint contract is hadolint Dockerfile; no lint findings in current-head evidence. TDD/regression: regression tests added per changed surface — tests/api/session-revocation.test.mjs, tests/api/attachment-status.test.mjs, tests/unit/attachment-status.test.mjs, tests/unit/clearfolio-status-signal.test.mjs, tests/unit/clearfolio-adapter-mock-hmac.test.mjs, tests/unit/coverage-script-contract.test.mjs. Coverage: PASS — supported repository test suites passed per Coverage execution evidence. Docstring coverage: configured repository docstring gates passed or docstring coverage advisory per Coverage execution evidence. DAG: head-flow Mermaid diagram below maps attachment-list request -> refreshAttachmentStatuses (server/attachment_status.mjs) -> clearfolio jobStatus/artifactUrl (server/clearfolio.mjs) -> sanitized fixed-category metrics, and verifyToken/token_version (server/auth.mjs) -> all four JWT transports; reflects base-to-head changed flow (per-row lookup and jobId exposure removed). PoC/execution: no OPENCODE_EXECUTION_RECEIPT browser/e2e tool receipts exist; source-level trace plus committed API/unit tests are cited instead. DDD/domain: refresh is project-scoped; per-tenant data isolation preserved. CDD/context: Clearfolio boundary treats downstream responses as untrusted — status allowlist and scheme/HTTPS-downgrade checks live at the adapter edge. Similar issues: prior bot review nits are resolved on this head; the earlier CHANGES_REQUESTED was dismissed as stale and current-head evidence shows no failed checks and no unresolved threads. Claim/concept check: CHANGELOG.md, docs/deploy.md, and docs/doctoring/* claims match code evidence; Hono remediation claim matches the dependency bump. Standards search: strict HS256/JWT header and token_version revocation follow OWASP session-management guidance documented in docs/doctoring/session-revocation.md; no external standard needed beyond repo doctoring evidence. Compatibility/convention: new names (SCOPEWEAVE_ATTACHMENT_STATUS_, attachmentStatusRefresh metrics, attachment_status.mjs) are multi-word and follow repo snake_case/camelCase conventions; no reserved-word conflicts; internal job_id stays non-exposed. Breaking-change/backcompat: schema unchanged and no migration required (docs/deploy.md rollback section); removal of internal jobId from responses is a documented security change in CHANGELOG.md; legacy sessions lacking the tv claim fail closed by design. Implementation completeness: no placeholder bodies (pass/.../NotImplementedError) found in inspected head source excerpts (attachment_status.mjs constants/normalizers/refresh, app.mjs import wiring and logout-all route). Performance: per-row DB lookup removed; worker pool bounded at 8 (max 32) with per-item abortable timeout and request-wide latency budget. Developer experience: operator controls and canary/rollback guidance documented in docs/deploy.md with metric-interpretation ratios. User experience: stale status preserved on downstream/timeout/malformed/persistence failures so the attachment list stays available; UX surface reviewed is the API list-response contract (non-web backend PR). Visual/DOM: non-web PR — reviewed API/JSON contract, metrics counters, and operator docs instead; no frontend/DOM file in this head's changed files. Accessibility/i18n: no frontend change; changelog keeps Korean entries alongside the new English entries. Supply-chain/license: hono bumped to 4.13.0 in package-lock.json; npm audit --audit-level=high and trivy fs . are the repo security commands; no failed Dependency Review/OSV evidence at head. Packaging: Node ^22.13.0 || >=23.4.0 engines with npm test/coverage/e2e/fuzz contracts present; the unpackaged python file flagged in evidence (tests/config/test_strix_static_repo_adaptations.py) is pre-existing and outside this PR's changed surface. Security/privacy: fail-closed JWT secret startup, strict tv-claim validation, Clearfolio error sanitization, HTTPS-downgrade rejection, and internal-id redaction are all corroborated by committed tests in the PASS coverage run.

Approval sufficiency: bounded evidence supplied affirmative approval evidence for changed files, coverage/docstring posture, risk surfaces, and current-head verification; approval is not based merely on the absence of known blockers.
Verification posture: CodeGraph evidence was initialized and bounded current-head evidence reviewed for changed-file evidence including CHANGELOG.md, docs/deploy.md, docs/doctoring/attachment-status-refresh.md, docs/doctoring/session-revocation.md, package-lock.json, and 12 more.
Linter/static: workflow/static review evidence is bounded by the current-head GitHub Checks gate and changed-file evidence.
TDD/regression: coverage execution evidence and focused changed hunks were reviewed from bounded-review-evidence.md.
Coverage: coverage execution evidence reports supported repository test suites passed.
Docstring coverage: coverage execution evidence reports configured repository docstring gates passed or docstring coverage was advisory.
DAG: CodeGraph/source-backed behavior map connects CHANGELOG.md to the affected review, runtime, or workflow path and required checks.
PoC/execution: coverage-evidence job executed on the current head and reported PASS.
DDD/domain: workflow and repository-governance invariants were reviewed against changed files in bounded evidence.
CDD/context: CodeGraph evidence, changed-file history, and focused hunks were reviewed from bounded-review-evidence.md.
Similar issues: changed-file history evidence was reviewed for comparable local precedents.
Claim/concept check: bounded evidence, repository source, current-head workflow evidence, and, where numeric, scientific, statistical, or literature-backed claims are affected, original-paper/formula evidence and parameter-recovery expectations were used for claims.
Standards search: standards and external-source claims require trusted bounded source evidence prepared outside the isolated model process; no evidence-backed standards blocker is present in bounded evidence.
Compatibility/convention: changed workflow/script conventions, object naming, and reserved-word safety for schema/API/config/code surfaces were checked in bounded evidence.
Breaking-change/backcompat: deployment evidence and changed-file history were checked for backward-compatibility risk.
Performance: changed surfaces were checked for performance risk in bounded evidence.
Developer experience: changed automation, review, test, setup, and maintenance surfaces were checked for helpful or obstructive DX impact in bounded evidence.
User experience: connected user, operator, API, CLI, documentation, review-comment, status-check, rendering, and workflow-reader behavior was checked for contradictions against code, docs, and tests in bounded evidence.
Visual/DOM: deterministic repair does not infer browser runtime execution; source-backed DOM/UI evidence and trusted workflow receipts were reviewed when present, and non-web surfaces used API/CLI/log/docs/workflow evidence instead.
Accessibility/i18n: accessibility, localization, and human-readable text surfaces were checked where UI, CLI, API message, docs, logs, or review text changed.
Supply-chain/license: dependency, package, model, container, and external-tool changes were checked in bounded evidence.
Packaging: package, build, test, lint, and security contracts were checked in bounded evidence.
Security/privacy: workflow-token, review-gate, and repository-automation security/privacy boundaries were checked in bounded evidence.

Adversarial validation

{"status":"passed","probes":[{"path":"server/auth.mjs","line":186,"hypothesis":"logout-all revocation can be bypassed on at least one JWT transport (bearer/calendar/SSE/attachment-view) because verification is not centralized, so a stale token holding the old token_version stays valid after token_version increments.","attack_or_counterexample":"Two devices hold signed tokens for the same user; call POST /api/auth/logout-all on device A, then replay device B's stale token on each of the four transports while presenting the replacement token on bearer.","evidence":"Trusted source trace at server/auth.mjs:186: tests/api/session-revocation.test.mjs (208 current-head lines) asserts stale tokens are rejected on bearer, calendar, SSE, and attachment-view transports and that the replacement token continues through the same boundary; Coverage execution evidence records supported suites as PASS for this head and Failed GitHub Check evidence lists no completed failed checks; source-line-sha256=b771f3c55d11dd3013dd957363d0ffdcd7b74688a68c9c1ea10819dd8a56329e","outcome":"falsified"},{"path":"server/clearfolio.mjs","line":229,"hypothesis":"Downstream Clearfolio error text or network details leak into browser/diagnostic payloads, or whitespace-padded/unknown conversion states are accepted and persisted.","attack_or_counterexample":"Clearfolio returns HTTP 500 with a body containing internal exception text and an artifact link over http://; conversion states 'SUCCEEDED ' (trailing space) and 'weird' are submitted.","evidence":"Trusted source trace at server/clearfolio.mjs:229: tests/unit/clearfolio-status-signal.test.mjs (251 current-head lines) covers rejection of untrusted status states, status-transport leak sanitization, network isolation, and HTTPS-downgrade prevention; the suite is recorded as PASS by Coverage execution evidence for this head; source-line-sha256=b0114d58839ee0c8a505f70e7eeb7ac75ef86f4c755b24f83d138c7e370ecade","outcome":"falsified"},{"path":"server/attachment_status.mjs","line":297,"hypothesis":"The refresh pass performs one database lookup per row (N+1), ignores the request-wide budget, refreshes non-PENDING/RUNNING rows, or mis-reconciles the failed aggregate against the fixed failure-category counters.","attack_or_counterexample":"An attachment list with 200 rows spanning PENDING/RUNNING/SUCCEEDED/FAILED, including rows with blank job_id, refreshed with a 1 ms budget and concurrency 32.","evidence":"Trusted source trace at server/attachment_status.mjs:297: tests/unit/attachment-status.test.mjs (315 current-head lines) covers the bounded engine, deadline enforcement, skipped/deferred separation, and failure-category reconciliation; CodeGraph records refreshAttachmentStatuses (server/attachment_status.mjs:204) with 2 callers in server/app.mjs and tests in tests/unit/attachment-status.test.mjs; Coverage execution evidence records the suites as PASS; source-line-sha256=d10b36aa74a59bcf4a88185837f658afaf3646eff2bb16c3928d0e9335e945d2","outcome":"falsified"},{"path":"tests/api/attachment-status.test.mjs","line":130,"hypothesis":"Internal Clearfolio job identifiers leak through the upload or list API responses.","attack_or_counterexample":"Upload an attachment through the API and list the project attachments, asserting the payload contains no jobId field on either surface.","evidence":"Trusted source trace at tests/api/attachment-status.test.mjs:130: the API test uses behavior-only list assertions and, together with tests/api/smoke.mjs:635-636, asserts identifier redaction; Coverage execution evidence records the API suite as PASS and Changed-files evidence confirms both files are current-head changes; source-line-sha256=29576b54e255e3c948eea5b5904fa38b81682fdd3cbd9ae841ff0e7bd80d394c","outcome":"falsified"}],"residual_risk":"Full hunks of server/app.mjs, server/auth.mjs, and server/clearfolio.mjs were truncated from the inlined evidence (12000-byte excerpt of a 114953-byte diff), so line-level verification of budget arithmetic, AbortSignal forwarding, and claim checks relies on the committed tests plus the trusted Coverage PASS rather than direct hunk reads; ship behind the documented canary and watch the fixed-category counters before raising concurrency or budget."}
  • Result: APPROVE
  • Reason: No active failed checks, no unresolved threads, Coverage execution evidence records supported suites as PASS, and committed tests corroborate the bounded attachment refresh, Clearfolio sanitization, internal-jobId redaction, and cross-transport session revocation claims at head 0055199.
  • Head SHA: 0055199096c39874a7d2b5dc086ac2d2750b17ec
  • Workflow run: 31770259928
  • Workflow attempt: 1

@opencode-agent
opencode-agent Bot merged commit b88e66e into develop Aug 14, 2026
38 checks passed
@opencode-agent
opencode-agent Bot deleted the fix/security-hono-attachment-refresh-final branch August 14, 2026 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf(attachments): bound concurrent status refresh and remove N+1 queries

2 participants