Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,7 @@
## 2026-08-29 - [λŒ€μš©λŸ‰ ν…μŠ€νŠΈ μŠ€μΊ” μ‹œ μ •κ·œν‘œν˜„μ‹ λŒ€μ‹  λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ ν™œμš©]
**Learning:** `scripts/ci/opencode_review_normalize_output.py`의 라벨 μŠ€μΊλ‹ λ£¨ν”„μ—μ„œ κΈ΄ LLM 리뷰 ν…μŠ€νŠΈλ₯Ό λŒ€μƒμœΌλ‘œ `pattern.finditer()`λ₯Ό ν˜ΈμΆœν•˜λŠ” νŒ¨ν„΄μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 마이크둜 벀치마크 κ²°κ³Ό, λ‹¨μˆœ λ¬Έμžμ—΄ λ§€μΉ­μ—μ„œλŠ” λ„€μ΄ν‹°λΈŒ `str.find()`와 `while` 루프λ₯Ό μ‘°ν•©ν•˜λŠ” 것이 μ •κ·œν‘œν˜„μ‹ μ‹€ν–‰ μ˜€λ²„ν—€λ“œ 없이 훨씬 λΉ λ₯΄λ‹€λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
**Action:** λ‚΄λΆ€ 탐색 λ£¨ν”„μ—μ„œ μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ” λ¦¬ν„°λŸ΄ λ¬Έμžμ—΄(라벨 접두사 λ“±)을 검색할 λ•ŒλŠ” `re.compile(re.escape(string)).finditer()` λŒ€μ‹  κ³ λ„λ‘œ μ΅œμ ν™”λœ Python λ„€μ΄ν‹°λΈŒ `text.find(candidate, index)` λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 단, λ¬΄ν•œ 루프λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ£¨ν”„μ˜ λͺ¨λ“  λΆ„κΈ°μ—μ„œ μΈλ±μŠ€κ°€ μ˜¬λ°”λ₯΄κ²Œ μ§„ν–‰λ˜λ„λ‘ 보μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

## 2026-09-01 - λŒ€μš©λŸ‰ ν…μŠ€νŠΈ μŠ€μΊ” μ‹œ O(N^2) νšŒν”Όλ₯Ό μœ„ν•œ end 인덱슀 ν™œμš©
**Learning:** `scripts/ci/opencode_review_normalize_output.py`의 `label_section` ν•¨μˆ˜λŠ” κΈ΄ 리뷰 ν…μŠ€νŠΈλ₯Ό νŒŒμ‹±ν•  λ•Œ `APPROVAL_VERIFICATION_LABELS` λ‚΄μ˜ λͺ¨λ“  라벨에 λŒ€ν•΄ 전체 ν…μŠ€νŠΈ 검색을 μˆ˜ν–‰ν•˜μ—¬ μœ„μΉ˜ λͺ©λ‘μ„ λ§Œλ“€κ³  μ΅œμ†Œ 인덱슀λ₯Ό κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 이미 이전 라벨을 μ°Ύμ•„ 탐색 λ²”μœ„λ₯Ό μ œν•œν•  수 μžˆμŒμ—λ„ 전체 ν…μŠ€νŠΈλ₯Ό λΆˆν•„μš”ν•˜κ²Œ 반볡적으둜 μŠ€μΊ”ν•˜λŠ” O(L*N) μ΄μƒμ˜ λΉ„νš¨μœ¨μ„ μ΄ˆλž˜ν–ˆμŠ΅λ‹ˆλ‹€.
**Action:** `text.find(candidate, start, end)`처럼, κ°€μž₯ κ°€κΉŒμš΄ 라벨을 찾을 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή 인덱슀λ₯Ό `end` κ²½κ³„κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜μ—¬ μ΄ν›„μ˜ `find()` 검색 λ²”μœ„λ₯Ό μ’νžˆλŠ” Fast-pathλ₯Ό μ μš©ν•˜μ‹­μ‹œμ˜€. 이λ₯Ό 톡해 λΆˆν•„μš”ν•œ 전체 ν…μŠ€νŠΈ μŠ€μΊ” 및 리슀트 ν• λ‹Ή μ˜€λ²„ν—€λ“œλ₯Ό 막을 수 μžˆμŠ΅λ‹ˆλ‹€.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -333,3 +333,4 @@ Semantic Versioning where the repository publishes a release.
- Added an organization-owned reusable exact-artifact SBOM attestation boundary that validates inert six-file wheel/sdist evidence, binds CycloneDX 1.7 predicates to exact SHA-256 subjects, signs through least-privilege GitHub artifact attestations, and exports online and offline verification bundles.
- Hardened exact-artifact SBOM verification with strict finite RFC 8259 JSON, integer CycloneDX document versions, deterministic UUIDv5 subject identities, exact filename properties and single SHA-256 root bindings, environment-only shell input transfer, pinned Ubuntu 24.04 quality runners, and checksum-sealed beginner-readable offline evidence. The decision record now cites Bray (2017) so NaN and Infinity cannot be treated as sealed SBOM numbers.
- Recorded the org control-plane architecture, including exact-artifact SBOM attestation, so agents reconstruct the signing trust boundary from the repo instead of private memory.
- O(N) μ„œλΈŒμŠ€νŠΈλ§ 검색 μ΅œμ ν™”: `scripts/ci/opencode_review_normalize_output.py`의 `label_section` ν•¨μˆ˜μ—μ„œ `APPROVAL_VERIFICATION_LABELS` 반볡 탐색 μ‹œ λ²”μœ„λ₯Ό μ œν•œν•˜μ—¬ O(N^2) 병λͺ© ν˜„μƒμ„ λ°©μ§€ν•˜κ³  νŒŒμ‹± μ„±λŠ₯을 κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
10 changes: 10 additions & 0 deletions dummy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[
{
"user": {
"login": "opencode-agent[bot]"
},
"commit_id": "7b5eb791a2b9111f55055f1ff2feb195b034d213",
"state": "APPROVED",
"body": "This is a deterministic fallback approval review."
}
]
Comment on lines +1 to +10

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.

πŸ” Unreferenced synthetic approval artifact

The synthetic approval record has no repository consumer and does not test the optimization. Keeping it obscures whether it is durable evidence or debris.

Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

25 changes: 17 additions & 8 deletions scripts/ci/opencode_review_normalize_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -974,14 +974,23 @@ def label_starts(candidate: str) -> list[int]:
if not starts:
return ""
start = starts[-1] + len(label)
next_starts = [
candidate_start
for candidate in APPROVAL_VERIFICATION_LABELS
if candidate != label
for candidate_start in label_starts(candidate)
if candidate_start >= start
]
end = min(next_starts) if next_starts else len(text)

end = len(text)
for candidate in APPROVAL_VERIFICATION_LABELS:
if candidate == label:
continue
index = text.find(candidate, start, end)
if index != -1:
if candidate == "coverage:":
while index != -1:
if text[max(0, index - 10):index] == "docstring ":
index = text.find(candidate, index + len(candidate), end)
else:
end = index
break
else:
end = index

return text[start:end]


Expand Down
Loading