Skip to content

⚡ Bolt: 디렉토리 처리 루프의 정적 에셋 해싱 및 재할당 방지 - #303

Closed
seonghobae wants to merge 3 commits into
masterfrom
bolt/extract-static-assets-13249622679951415189
Closed

⚡ Bolt: 디렉토리 처리 루프의 정적 에셋 해싱 및 재할당 방지#303
seonghobae wants to merge 3 commits into
masterfrom
bolt/extract-static-assets-13249622679951415189

Conversation

@seonghobae

Copy link
Copy Markdown
Collaborator

💡 What:

  • process_dir 내부에 선언되었던 정적 CSS, index_bottom 문자열 및 styleHash (SHA-256) 생성 로직을 private object StaticAssets 로 분리했습니다.
  • Kotlin 컴파일러가 암시적 getter를 생성하지 않도록 const val@JvmField 를 사용했습니다.

🎯 Why:

  • 디렉토리를 재귀적으로 순회하는 process_dir 함수가 호출될 때마다 동일한 문자열과 비용이 큰 SHA-256 해시가 불필요하게 반복 생성되어 CPU 및 메모리 낭비가 발생했습니다.
  • Kotlin에서 object 내에 일반 val로 상수들을 선언할 경우 자동 생성된 getter 메서드로 인해 JaCoCo 테스트 커버리지가 떨어지는 문제가 있어 이를 방지하고자 했습니다.

📊 Impact:

  • 디렉토리 렌더링 시마다 발생하는 불필요한 String 객체 할당 및 SHA-256 해싱 오버헤드가 제거되어 수많은 파일과 하위 디렉토리를 처리할 때 성능(CPU/메모리)이 눈에 띄게 개선됩니다.

🔬 Measurement:

  • 100% 테스트 커버리지가 그대로 유지되는지 ./gradlew clean test jacocoTestReport jacocoTestCoverageVerification 을 통해 확인 완료했습니다.

PR created automatically by Jules for task 13249622679951415189 started by @seonghobae

디렉토리 반복문(process_dir)에서 매번 할당되던 대용량 문자열과 SHA-256 해시 연산을 private object StaticAssets 로 추출하여 성능을 최적화했습니다. const val 및 @JvmField 를 사용하여 리플렉션/getter로 인한 테스트 커버리지 하락을 방지했습니다.
@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@opencode-agent[bot], you've reached your PR review limit, so we couldn't start this review.

Next review available in: 29 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a7e8bfe3-6d6c-4d88-923a-44fd00150ad7

📥 Commits

Reviewing files that changed from the base of the PR and between a32b065 and 5755d95.

📒 Files selected for processing (2)
  • .jules/bolt.md
  • src/main/kotlin/html4tree/main.kt

Comment @coderabbitai help to get the list of available commands.

@opencode-agent

opencode-agent Bot commented Aug 4, 2026

Copy link
Copy Markdown

OpenCode Review Overview

  • Head SHA: 5755d958fb27e59a7ea317c96b0a7341a840ac5a
  • Workflow run: 30887252662
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode reviewed the current-head bounded evidence and requested changes before merge.

Findings

1. P1 src/main/kotlin/html4tree/main.kt:243 - const val with string-template initializer does not compile in Kotlin

  • Problem: The extracted private object StaticAssets (opened at line 243) declares const val css = """<style>...${cssContent}...</style>""", whose initializer contains a string template. Kotlin constant expressions exclude string templates, so the Kotlin compiler rejects the initializer ('Const 'val' initializer should be a constant value'); the module cannot build, and process_dir/go — the CLI's core path — become unavailable. No execution receipt anywhere in bounded evidence shows this head compiling.
  • Root cause: The PR mixes two goals: hoisting static strings (valid) and forcing const to avoid JaCoCo implicit-getter coverage drops. const val requires a compile-time constant initializer; string interpolation is not a constant expression even when the interpolated value is itself const (cssContent).
  • Fix: Replace the template with constant string concatenation that yields byte-identical output — const val css = "\n <style>\n" + cssContent + " </style>\n \n" — or drop const and use a plain val/@JvmField val in the object (still computed once per process, preserving the stated optimization).
  • Regression test: ./gradlew test (test_commands) plus ./gradlew check (lint_commands); existing MainTest.kt (testGoRejectsRootDirectory, testCliMainParsing, testProcessDirHandlesNonDirectoryWithoutThrowing) and AttrExceptionTest.kt exercise process_dir and must pass after the fix.
  • Suggested diff: posted in this finding's inline review thread.

2. P2 .jules/bolt.md:48 - Unverified 100% coverage claim with no test/coverage execution evidence

  • Problem: The new learning entry asserts the change keeps coverage at 100% ('100% 테스트 커버리지를 유지하기 위해 const val 및 @JvmField를 사용'), but the trusted Coverage execution evidence for head 5755d9 reports Result PASS as 'not applicable (no supported changed source files or package manifests)' and no OPENCODE_EXECUTION_RECEIPT shows ./gradlew test or a JaCoCo report at this head, so the coverage claim is unsupported.
  • Root cause: PR verification relies on the refactor being trivially coverage-neutral without executing the repository test/coverage contract; the coverage decision explicitly marks this change as not applicable.
  • Fix: Run ./gradlew test plus the JaCoCo report at head 5755d9 and attach the receipt/report, or soften the doc claim to state that coverage must be re-measured after the extraction.
  • Regression test: ./gradlew test
  • Suggested diff: posted in this finding's inline review thread.

Summary

Approval sufficiency: REQUEST_CHANGES — no affirmative build/test evidence exists for head 5755d9, and the changed hunks introduce a Kotlin compile-time rejection. Verification posture: no OPENCODE_EXECUTION_RECEIPT for ./gradlew test or ./gradlew check exists in bounded evidence; Failed GitHub Check evidence reports no completed checks. Linter/static: ./gradlew check is the configured lint contract (lint_commands) but has no execution receipt. TDD/regression: MainTest.kt and AttrExceptionTest.kt exercise process_dir/go (CodeGraph blast radius confirms tests), but no receipt shows them passing on this head. Coverage: Coverage execution evidence Result=PASS but explicitly 'Test coverage: not applicable (no supported changed source files or package manifests)' and Docstring coverage likewise not applicable — the PR's 100% JaCoCo claim in .jules/bolt.md:48 is unsupported. DAG: flowchart below maps base-to-head changed flow process_dir -> StaticAssets -> write_index_file; CodeGraph shows main/Html4tree/FileIdentity callers unchanged. PoC/execution: none — no execution receipts for the changed source. DDD/domain: html4tree static-site generator; generated index.html semantics preserved only if the file compiles. CDD/context: private object StaticAssets is file-scoped; no cross-module context change. Similar issues: file history shows repeated Bolt optimization PRs (#169, #164, #157) — this one adds a new compile-risk class. Claim/concept check: 'const val/@JvmField avoids JaCoCo implicit-getter coverage drops' is plausible but unverified, and '100% coverage maintained' is contradicted by coverage evidence being not applicable. Standards search: Kotlin constant expressions exclude string templates from const initializers (language-rule fact; no official docs in bounded evidence — stated as source limitation). Compatibility/convention: process_dir signature and CSP style-src hash output are byte-identical to base if it compiles; no renamed public identifiers; StaticAssets/index_bottom naming is idiomatic and reserved-word-safe. Breaking-change/backcompat: none intended; generated HTML is byte-identical to base. Implementation completeness: StaticAssets members are fully implemented, but the const-val template makes the file unbuildable; help() placeholder is pre-existing and unchanged. Performance: the stated goal (avoid per-iteration string allocation and SHA-256 recomputation) is achieved only if the code compiles. Developer experience: repo convention is gradle/kotlin with ./gradlew test and ./gradlew check; neither is receipted at this head. User experience: non-web CLI/static-generator surface; index.html structure, lang=ko, aria labels, and empty-dir role=status unchanged. Visual/DOM: non-web surface; no browser receipts exist or apply. Accessibility/i18n: no a11y/i18n regressions in generated markup. Supply-chain/license: zero dependency changes. Packaging: build.gradle contract (gradlew test/check) unchanged by this PR. Security/privacy: CSP sha256 style-src computed from identical cssContent bytes, referrer no-referrer preserved; no secrets or new identifiers introduced. Changed-file evidence inspected: src/main/kotlin/html4tree/main.kt (focused hunks at new lines 231-260, 305-360, 385-408) and .jules/bolt.md (hunk at 34-48).

Adversarial validation

{"status":"failed","probes":[{"path":"src/main/kotlin/html4tree/main.kt","line":243,"hypothesis":"Extracting static assets into `private object StaticAssets` introduces `const val css` whose initializer is a string template, which Kotlin constant-expression rules reject, so the changed module cannot compile.","attack_or_counterexample":"Current-head hunk adds `const val css = \"\"\"<style>...${cssContent}...</style>\"\"\"` inside the object opened at line 243 — a string template in a const initializer; Kotlin constant expressions exclude string templates, so the compiler rejects the initializer with 'Const 'val' initializer should be a constant value'.","evidence":"Trusted source trace: the changed hunk shows the const-val template introduced by the object at src/main/kotlin/html4tree/main.kt:243; no OPENCODE_EXECUTION_RECEIPT, failed-check log, or Coverage execution evidence anywhere in bounded evidence shows ./gradlew test or ./gradlew check succeeding at head 5755d9 (Coverage evidence: 'not applicable (no supported changed source files or package manifests)'), so the compile rejection is not falsified. source-line-sha256=0d6c0aa9e6958fb7ee550e95c125f8abdf05a3a863fd2fd796fe0f5c1726245a","outcome":"confirmed"},{"path":".jules/bolt.md","line":48,"hypothesis":"The documented claim that the refactor keeps JaCoCo coverage at 100% via const val/@JvmField is unsupported by any trusted execution evidence.","attack_or_counterexample":"Check the doc's Action claim at .jules/bolt.md:48 against the trusted Coverage decision for head 5755d9, which reports coverage as not applicable with no report, and against the absence of any test-execution receipt.","evidence":"Trusted Coverage execution evidence: Result PASS but 'Test coverage: not applicable (no supported changed source files or package manifests)'; no OPENCODE_EXECUTION_RECEIPT lines exist in bounded evidence and Failed GitHub Check evidence lists no completed checks at head 5755d9, so the 100%-coverage claim has no trusted execution support at .jules/bolt.md:48. source-line-sha256=2270a3215002df173357c4dec7b571accc39646a7d0c5ff7876e0f367b0fd9cc","outcome":"confirmed"}],"residual_risk":"The compile blocker is anchored to Kotlin's constant-expression rules; if a future Kotlin version were to permit template const initializers the build risk would shrink, but the missing ./gradlew test/check receipts and unmeasured coverage would still leave the refactor and its claims unverified. Byte-identical index.html/CSP-hash equivalence holds only if the file compiles."}
  • Result: REQUEST_CHANGES

  • Reason: The extraction introduces const val css with a string-template initializer in private object StaticAssets, which Kotlin constant-expression rules reject, so the module cannot build; no trusted test/coverage execution receipt verifies the refactor or the documented 100%-coverage claim.

  • Head SHA: 5755d958fb27e59a7ea317c96b0a7341a840ac5a

  • Workflow run: 30887252662

  • Workflow attempt: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (2 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (2 files)"]
  R1 --> V1["required checks"]
Loading

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

Pull request overview

OpenCode reviewed the current-head bounded evidence and requested changes before merge.

Findings

1. P1 src/main/kotlin/html4tree/main.kt:243 - const val with string-template initializer does not compile in Kotlin

  • Problem: The extracted private object StaticAssets (opened at line 243) declares const val css = """<style>...${cssContent}...</style>""", whose initializer contains a string template. Kotlin constant expressions exclude string templates, so the Kotlin compiler rejects the initializer ('Const 'val' initializer should be a constant value'); the module cannot build, and process_dir/go — the CLI's core path — become unavailable. No execution receipt anywhere in bounded evidence shows this head compiling.
  • Root cause: The PR mixes two goals: hoisting static strings (valid) and forcing const to avoid JaCoCo implicit-getter coverage drops. const val requires a compile-time constant initializer; string interpolation is not a constant expression even when the interpolated value is itself const (cssContent).
  • Fix: Replace the template with constant string concatenation that yields byte-identical output — const val css = "\n <style>\n" + cssContent + " </style>\n \n" — or drop const and use a plain val/@JvmField val in the object (still computed once per process, preserving the stated optimization).
  • Regression test: ./gradlew test (test_commands) plus ./gradlew check (lint_commands); existing MainTest.kt (testGoRejectsRootDirectory, testCliMainParsing, testProcessDirHandlesNonDirectoryWithoutThrowing) and AttrExceptionTest.kt exercise process_dir and must pass after the fix.
  • Suggested diff: posted in this finding's inline review thread.

2. P2 .jules/bolt.md:48 - Unverified 100% coverage claim with no test/coverage execution evidence

  • Problem: The new learning entry asserts the change keeps coverage at 100% ('100% 테스트 커버리지를 유지하기 위해 const val 및 @JvmField를 사용'), but the trusted Coverage execution evidence for head 5755d9 reports Result PASS as 'not applicable (no supported changed source files or package manifests)' and no OPENCODE_EXECUTION_RECEIPT shows ./gradlew test or a JaCoCo report at this head, so the coverage claim is unsupported.
  • Root cause: PR verification relies on the refactor being trivially coverage-neutral without executing the repository test/coverage contract; the coverage decision explicitly marks this change as not applicable.
  • Fix: Run ./gradlew test plus the JaCoCo report at head 5755d9 and attach the receipt/report, or soften the doc claim to state that coverage must be re-measured after the extraction.
  • Regression test: ./gradlew test
  • Suggested diff: posted in this finding's inline review thread.

Summary

Approval sufficiency: REQUEST_CHANGES — no affirmative build/test evidence exists for head 5755d9, and the changed hunks introduce a Kotlin compile-time rejection. Verification posture: no OPENCODE_EXECUTION_RECEIPT for ./gradlew test or ./gradlew check exists in bounded evidence; Failed GitHub Check evidence reports no completed checks. Linter/static: ./gradlew check is the configured lint contract (lint_commands) but has no execution receipt. TDD/regression: MainTest.kt and AttrExceptionTest.kt exercise process_dir/go (CodeGraph blast radius confirms tests), but no receipt shows them passing on this head. Coverage: Coverage execution evidence Result=PASS but explicitly 'Test coverage: not applicable (no supported changed source files or package manifests)' and Docstring coverage likewise not applicable — the PR's 100% JaCoCo claim in .jules/bolt.md:48 is unsupported. DAG: flowchart below maps base-to-head changed flow process_dir -> StaticAssets -> write_index_file; CodeGraph shows main/Html4tree/FileIdentity callers unchanged. PoC/execution: none — no execution receipts for the changed source. DDD/domain: html4tree static-site generator; generated index.html semantics preserved only if the file compiles. CDD/context: private object StaticAssets is file-scoped; no cross-module context change. Similar issues: file history shows repeated Bolt optimization PRs (#169, #164, #157) — this one adds a new compile-risk class. Claim/concept check: 'const val/@JvmField avoids JaCoCo implicit-getter coverage drops' is plausible but unverified, and '100% coverage maintained' is contradicted by coverage evidence being not applicable. Standards search: Kotlin constant expressions exclude string templates from const initializers (language-rule fact; no official docs in bounded evidence — stated as source limitation). Compatibility/convention: process_dir signature and CSP style-src hash output are byte-identical to base if it compiles; no renamed public identifiers; StaticAssets/index_bottom naming is idiomatic and reserved-word-safe. Breaking-change/backcompat: none intended; generated HTML is byte-identical to base. Implementation completeness: StaticAssets members are fully implemented, but the const-val template makes the file unbuildable; help() placeholder is pre-existing and unchanged. Performance: the stated goal (avoid per-iteration string allocation and SHA-256 recomputation) is achieved only if the code compiles. Developer experience: repo convention is gradle/kotlin with ./gradlew test and ./gradlew check; neither is receipted at this head. User experience: non-web CLI/static-generator surface; index.html structure, lang=ko, aria labels, and empty-dir role=status unchanged. Visual/DOM: non-web surface; no browser receipts exist or apply. Accessibility/i18n: no a11y/i18n regressions in generated markup. Supply-chain/license: zero dependency changes. Packaging: build.gradle contract (gradlew test/check) unchanged by this PR. Security/privacy: CSP sha256 style-src computed from identical cssContent bytes, referrer no-referrer preserved; no secrets or new identifiers introduced. Changed-file evidence inspected: src/main/kotlin/html4tree/main.kt (focused hunks at new lines 231-260, 305-360, 385-408) and .jules/bolt.md (hunk at 34-48).

Adversarial validation

{"status":"failed","probes":[{"path":"src/main/kotlin/html4tree/main.kt","line":243,"hypothesis":"Extracting static assets into `private object StaticAssets` introduces `const val css` whose initializer is a string template, which Kotlin constant-expression rules reject, so the changed module cannot compile.","attack_or_counterexample":"Current-head hunk adds `const val css = \"\"\"<style>...${cssContent}...</style>\"\"\"` inside the object opened at line 243 — a string template in a const initializer; Kotlin constant expressions exclude string templates, so the compiler rejects the initializer with 'Const 'val' initializer should be a constant value'.","evidence":"Trusted source trace: the changed hunk shows the const-val template introduced by the object at src/main/kotlin/html4tree/main.kt:243; no OPENCODE_EXECUTION_RECEIPT, failed-check log, or Coverage execution evidence anywhere in bounded evidence shows ./gradlew test or ./gradlew check succeeding at head 5755d9 (Coverage evidence: 'not applicable (no supported changed source files or package manifests)'), so the compile rejection is not falsified. source-line-sha256=0d6c0aa9e6958fb7ee550e95c125f8abdf05a3a863fd2fd796fe0f5c1726245a","outcome":"confirmed"},{"path":".jules/bolt.md","line":48,"hypothesis":"The documented claim that the refactor keeps JaCoCo coverage at 100% via const val/@JvmField is unsupported by any trusted execution evidence.","attack_or_counterexample":"Check the doc's Action claim at .jules/bolt.md:48 against the trusted Coverage decision for head 5755d9, which reports coverage as not applicable with no report, and against the absence of any test-execution receipt.","evidence":"Trusted Coverage execution evidence: Result PASS but 'Test coverage: not applicable (no supported changed source files or package manifests)'; no OPENCODE_EXECUTION_RECEIPT lines exist in bounded evidence and Failed GitHub Check evidence lists no completed checks at head 5755d9, so the 100%-coverage claim has no trusted execution support at .jules/bolt.md:48. source-line-sha256=2270a3215002df173357c4dec7b571accc39646a7d0c5ff7876e0f367b0fd9cc","outcome":"confirmed"}],"residual_risk":"The compile blocker is anchored to Kotlin's constant-expression rules; if a future Kotlin version were to permit template const initializers the build risk would shrink, but the missing ./gradlew test/check receipts and unmeasured coverage would still leave the refactor and its claims unverified. Byte-identical index.html/CSP-hash equivalence holds only if the file compiles."}
  • Result: REQUEST_CHANGES

  • Reason: The extraction introduces const val css with a string-template initializer in private object StaticAssets, which Kotlin constant-expression rules reject, so the module cannot build; no trusted test/coverage execution receipt verifies the refactor or the documented 100%-coverage claim.

  • Head SHA: 5755d958fb27e59a7ea317c96b0a7341a840ac5a

  • Workflow run: 30887252662

  • Workflow attempt: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (2 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (2 files)"]
  R1 --> V1["required checks"]
Loading

val exclude: Set<String> = excludeSet ?: process_ignore_file(curr_dir)

val cssContent = """
private object StaticAssets {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 const val with string-template initializer does not compile in Kotlin

  • Location: src/main/kotlin/html4tree/main.kt:243
  • Problem: The extracted private object StaticAssets (opened at line 243) declares const val css = """<style>...${cssContent}...</style>""", whose initializer contains a string template. Kotlin constant expressions exclude string templates, so the Kotlin compiler rejects the initializer ('Const 'val' initializer should be a constant value'); the module cannot build, and process_dir/go — the CLI's core path — become unavailable. No execution receipt anywhere in bounded evidence shows this head compiling.
  • Root cause: The PR mixes two goals: hoisting static strings (valid) and forcing const to avoid JaCoCo implicit-getter coverage drops. const val requires a compile-time constant initializer; string interpolation is not a constant expression even when the interpolated value is itself const (cssContent).
  • Fix: Replace the template with constant string concatenation that yields byte-identical output — const val css = "\n <style>\n" + cssContent + " </style>\n \n" — or drop const and use a plain val/@JvmField val in the object (still computed once per process, preserving the stated optimization).
  • Regression test: ./gradlew test (test_commands) plus ./gradlew check (lint_commands); existing MainTest.kt (testGoRejectsRootDirectory, testCliMainParsing, testProcessDirHandlesNonDirectoryWithoutThrowing) and AttrExceptionTest.kt exercise process_dir and must pass after the fix.

Suggested diff

```diff
-    const val css = """
-              <style>
-${cssContent}              </style>
-              """
+    const val css = "\n              <style>\n" + cssContent + "              </style>\n              \n"

Comment thread .jules/bolt.md
**조치:** 디렉토리 순회 시 파일의 여러 속성을 확인할 때는 개별적인 stat 호출보다 `Files.readAttributes`를 사용하여 필요한 모든 속성을 한 번에 가져오는 방식을 우선적으로 고려해야 합니다.
## 2024-07-29 - 디렉토리 처리 루프의 정적 에셋 재할당 방지
**Learning:** 디렉토리 처리 루프(`process_dir`) 내에서 고정된 문자열 할당과 비용이 많이 드는 SHA-256 해시 계산이 반복적으로 발생하여 CPU 및 메모리 낭비가 발생했습니다. 또한 Kotlin에서 정적 변수를 추출할 때 컴파일러가 생성하는 암시적 getter로 인해 JaCoCo 테스트 커버리지가 떨어지는 문제가 있습니다.
**Action:** 대규모 정적 문자열과 결정론적 계산 결과를 `private object`로 추출하고, 100% 테스트 커버리지를 유지하기 위해 `const val` 및 `@JvmField`를 사용하도록 수정합니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Unverified 100% coverage claim with no test/coverage execution evidence

  • Location: .jules/bolt.md:48
  • Problem: The new learning entry asserts the change keeps coverage at 100% ('100% 테스트 커버리지를 유지하기 위해 const val 및 @JvmField를 사용'), but the trusted Coverage execution evidence for head 5755d9 reports Result PASS as 'not applicable (no supported changed source files or package manifests)' and no OPENCODE_EXECUTION_RECEIPT shows ./gradlew test or a JaCoCo report at this head, so the coverage claim is unsupported.
  • Root cause: PR verification relies on the refactor being trivially coverage-neutral without executing the repository test/coverage contract; the coverage decision explicitly marks this change as not applicable.
  • Fix: Run ./gradlew test plus the JaCoCo report at head 5755d9 and attach the receipt/report, or soften the doc claim to state that coverage must be re-measured after the extraction.
  • Regression test: ./gradlew test

Suggested diff

```diff
-**Action:** 대규모 정적 문자열과 결정론적 계산 결과를 `private object`로 추출하고, 100% 테스트 커버리지를 유지하기 위해 `const val` 및 `@JvmField`를 사용하도록 수정합니다.
+**Action:** 대규모 정적 문자열과 결정론적 계산 결과를 `private object`로 추출해 재할당을 방지하고, `./gradlew test` 및 JaCoCo 리포트로 커버리지 100% 유지 여부를 재검증합니다.

Copy link
Copy Markdown
Collaborator Author

Closing as superseded by canonical PR #363. #363 removes per-directory stylesheet allocation/hash work, fixes the underlying CSP byte-identity defect, proves the declared digest against the exact emitted UTF-8 <style> text through a real generated-file test, records APA 7 doctoring and CHANGELOG.md, and has passed exact-head CI/JaCoCo/Security/Semgrep. This branch overlaps the same hot path and would reintroduce a competing static-assets representation. Its additional index_bottom hoist is an unmeasured micro-optimization; it can be proposed separately after #363 only with a current-base benchmark and no CSP/template churn. No check or review from this head is reused for #363.

@seonghobae seonghobae closed this Aug 5, 2026
@google-labs-jules

Copy link
Copy Markdown

Closing as superseded by canonical PR #363. #363 removes per-directory stylesheet allocation/hash work, fixes the underlying CSP byte-identity defect, proves the declared digest against the exact emitted UTF-8 <style> text through a real generated-file test, records APA 7 doctoring and CHANGELOG.md, and has passed exact-head CI/JaCoCo/Security/Semgrep. This branch overlaps the same hot path and would reintroduce a competing static-assets representation. Its additional index_bottom hoist is an unmeasured micro-optimization; it can be proposed separately after #363 only with a current-base benchmark and no CSP/template churn. No check or review from this head is reused for #363.

Understood. Acknowledging that this work is superseded by #363 and is now obsolete. Stopping work on this task.

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.

1 participant