Skip to content

feat(operations): separate liveness and readiness probes - #265

Draft
seonghobae wants to merge 2 commits into
fix/pii-logging-16240128950440010639from
feat/liveness-readiness-probes
Draft

feat(operations): separate liveness and readiness probes#265
seonghobae wants to merge 2 commits into
fix/pii-logging-16240128950440010639from
feat/liveness-readiness-probes

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Buyer-visible operational gap

Separate process liveness from traffic readiness so an orchestrator does not route requests to a live-but-unready instance.

Exact current stack

The branch is not yet based on the declared parent. PR #286 restores the full parent, including the corrected standard-library-discoverable stacked-PR CI regression, while retaining this bounded availability slice. No predecessor-head result transfers.

Availability contract

  • GET /healthz maps Spring Boot liveness to controlled 200 {"status":"ok"} or 503 {"status":"broken"} responses.
  • GET /readyz returns 200 {"status":"ready"} only while accepting traffic, otherwise 503 {"status":"not_ready"}.
  • Both routes use Cache-Control: no-store, expose no tenant or dependency detail, and keep liveness independent of shared external services.
  • Deterministic tests and the accepted operations decision record cover failure, recovery, Kubernetes probe intent, and terminology.

Evidence boundary

CI run 31105439528 and fuzz run 31105439127 succeeded for predecessor head d67947e3d405a47c155ea5078aeddb7e110f76de, but do not establish compatibility with current parent ed3863209109cd24a3cf1f1d6bdcd51db16fbef1. Merge order remains #286 reconciliation, reinspection of the resulting exact head, then every required exact-head/base-sensitive CI, fuzz, security, review, approval, and repository-policy gate. Keep this PR Draft and do not infer approval from predecessor or status-only evidence.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

HealthController가 liveness와 readiness 프로브를 분리합니다. Maven 검증에 JaCoCo와 Javadoc 게이트를 추가합니다. 문서 계약과 보안·저장소·파일명 경계 테스트를 확장하고 공개 API 문서와 기본 생성자를 보강합니다.

Changes

가용성 프로브 계약과 구현

Layer / File(s) Summary
프로브 엔드포인트와 운영 계약
src/main/java/.../controller/HealthController.java, src/test/java/.../controller/HealthControllerTest.java, docs/operations/*, README.md, docs/architecture.md, ARCHITECTURE.md, CHANGELOG.md, docs/security/*, scripts/test_documentation_contracts.py
/healthzLivenessState를 사용하고 /readyzReadinessState를 사용합니다. 각 상태에 따라 200 또는 503과 제한된 JSON 응답을 반환합니다. 두 응답에 Cache-Control: no-store를 적용합니다.

Maven verify 품질 게이트

Layer / File(s) Summary
커버리지·Javadoc 검증
.github/workflows/ci.yml, pom.xml, docs/engineering/acceptance-criteria.md, CLAUDE.md
CI가 mvn verify를 실행합니다. JaCoCo 라인·분기 누락과 Javadoc 오류를 빌드 실패로 처리합니다. 실패 시 JaCoCo 보고서에서 누락 위치를 출력합니다.

경계 조건 회귀 테스트

Layer / File(s) Summary
보안·저장소·파일명 경계 테스트
src/test/java/.../artifact/*, src/test/java/.../config/*, src/test/java/.../controller/*, src/test/java/.../repository/*, src/test/java/.../service/*, src/main/java/.../controller/ConversionController.java
파일명 정제, null byte 거부, SHA-256 제공자 부재, 로그 구분자, 정책 시크릿 정규화, 아티팩트 삭제, 테넌트 범위 삭제를 검증합니다.

공개 API 문서와 기본 생성자

Layer / File(s) Summary
Javadoc 및 명시적 생성자
src/main/java/com/clearfolio/viewer/{api,artifact,auth,config,controller,exception,model,repository,service}/*, src/main/java/com/clearfolio/viewer/ClearfolioViewerApplication.java
공개 응답·예외·설정·서비스 구성 요소의 Javadoc을 확장합니다. 여러 Spring 구성 요소와 저장소에 동작 없는 public 기본 생성자를 추가합니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ProbeClient
  participant HealthController
  participant ApplicationAvailability
  ProbeClient->>HealthController: GET /healthz 또는 /readyz
  HealthController->>ApplicationAvailability: 가용성 상태 조회
  ApplicationAvailability-->>HealthController: LivenessState 또는 ReadinessState
  HealthController-->>ProbeClient: 200/503 응답과 no-store 캐시 정책
Loading

Possibly related PRs

  • ContextualWisdomLab/clearfolio#165: ConversionProperties와 정책·보안 검증 테스트를 공유하지만, 이 변경은 주로 커버리지와 생성자를 추가합니다.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 38.46% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 /healthz/readyz 프로브를 분리하는 변경의 핵심 내용을 정확하고 간결하게 설명합니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/liveness-readiness-probes

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

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Please independently inspect exact current head 787d8a250cc8b2bbb55242f166a0d7f5bdc804c3 while the final fuzz matrix completes. Verify the liveness/readiness semantic split against the Spring Boot 3.5 ApplicationAvailability contract and Kubernetes startup/liveness/readiness guidance; check that unauthenticated probe responses expose only controlled labels and are non-cacheable; validate the red-green test evidence, public Javadocs, Markdown/APA 7 documentation, 100% production line and branch coverage, and repository-policy compliance. Do not approve or recommend merge unless every exact-head required check, including all fuzz matrix jobs, is successful. Any review is advisory unless the reviewer identity has repository write permission.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Review exact current head 787d8a250cc8b2bbb55242f166a0d7f5bdc804c3. Verify the executable availability semantics, controlled unauthenticated response surface, no-store policy, startup/liveness/readiness deployment guidance, Spring Boot 3.5.16 alignment, APA 7 documentation, public Javadocs, and test completeness. Treat all three exact-head fuzz jobs, CI, Security Scan, and SAST as required evidence. Report any unresolved blocker; do not treat this request as independent write-permission approval.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

@seonghobae I will review exact head 787d8a250cc8b2bbb55242f166a0d7f5bdc804c3.

I will treat CI, Security Scan, SAST, and all three fuzz jobs as required evidence. I will report unresolved blockers. I will not approve or recommend merge unless every required exact-head check succeeds.

⚠️ 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
Collaborator Author

@opencode-agent Implement the remaining warning-free public Javadoc slice on exact current head 311a98b560041da15c5cdf66c355be10eb468c54 without weakening doclint, failOnWarnings, compiler warnings, tests, JaCoCo, security, or repository policy. CI run 30980557877, Maven job 92223865983, already proves 451 tests and zero missed production lines/branches, then fails only on 58 Javadoc warnings. Several record-component, enum, and field warnings have now been addressed on the current branch. Re-run mvn -B --no-transfer-progress verify, fix every remaining warning with beginner-readable production Javadoc. Where an implicit public default constructor causes a warning, add an explicit documented constructor and add/adjust tests so exact-head production line and branch missed counts remain zero. In particular inspect ArtifactLinkService (artifactLinkLedger parameter), DefaultConversionWorker (artifactStore, pdfArtifactGenerator), both public DefaultDocumentConversionService constructors, ViewerSecurityHeadersWebFilter, and public classes with undocumented implicit constructors. Do not suppress missing, exclude public types, lower gates, or rewrite unrelated inherited privacy/security behavior. Commit only after local verify is clean; report the exact new head and command evidence.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Exact current head is c398f7c8abb5d7f75f397c2839e6505e71c16084. CI run 30981952249, Maven job 92228078208, proves 451 tests pass and JaCoCo reports zero missed production lines and branches. The build now fails only on exactly two Javadoc warnings: (1) add the missing @param artifactLinkLedger description to the public ArtifactLinkService constructor; (2) add a beginner-readable documented explicit public no-arg constructor to ViewerUiController. Do not suppress doclint, lower gates, alter visibility, or touch unrelated behavior. Run mvn -B --no-transfer-progress verify; commit only when all 451+ tests, zero missed lines/branches, and warning-free public Javadoc pass. Report the exact new head and command evidence.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Exact head advanced to a10867a8574957e5165ac6d5314eb1f59eb9efba, but comparison with c398f7c8abb5d7f75f397c2839e6505e71c16084 shows only the ArtifactLinkService @param addition. Complete the second requested fix now: add a beginner-readable documented explicit public no-arg constructor to ViewerUiController, then run mvn -B --no-transfer-progress verify. Do not stop or report success unless warning-free Javadoc, all tests, and zero missed production lines and branches pass on the new exact head.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Review exact current head e35092718af8e5ae7c8657ea037683b87b379315. Verify the liveness/readiness semantics, controlled unauthenticated probe surface, Cache-Control: no-store, Kubernetes startup/liveness/readiness guidance, Spring Boot 3.5.16 alignment, APA 7 references, warning-free public Javadocs, and the fail-closed mvn verify gates for zero missed production lines and branches. Treat exact-head CI, Security Scan, SAST Semgrep, and every fuzz matrix job as required; queued, pending, cancelled, stale-head, or skipped-required results are not passing. Report actionable blockers only and do not treat this request as independent write-authorized approval.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Independently review exact current head e35092718af8e5ae7c8657ea037683b87b379315. Verify only current code and evidence: semantic separation of liveness/readiness, controlled and non-cacheable unauthenticated responses, startup/liveness/readiness operator guidance, Spring Boot 3.5.16 and Kubernetes source alignment, APA 7 documentation, warning-free public Javadocs, zero missed production lines and branches, security/static-analysis/fuzz outcomes, and branch-policy compliance. Distinguish valid current findings from stale or superseded heads. Do not approve or recommend merge while any exact-head required check is queued or pending, and note that automated review is not independent write-authorized approval.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='e35092718af8e5ae7c8657ea037683b87b379315'
echo '== Checked-out commit =='
git rev-parse HEAD
echo "Expected: $expected"
git status --short
echo '== PR metadata and exact-head checks =='
gh pr view 265 --repo ContextualWisdomLab/clearfolio --json number,headRefOid,isDraft,reviewDecision,statusCheckRollup,comments,reviews \
  --jq '{number,isDraft,headRefOid,reviewDecision,statusCheckRollup:[.statusCheckRollup[]|{name,conclusion,status,detailsUrl}],reviews:[.reviews[]|{author:.author.login,state,commit:.commit.oid}],comments:[.comments[]|{author:.author.login,body,url}]}'
echo '== Files likely to implement or document the contract =='
fd -t f . | rg '(^|/)(HealthController|.*Availability.*|.*Health.*Test|.*Read.*Test|pom\.xml|README\.md|CHANGELOG\.md|.*ADR.*|.*adr.*|.*architecture.*)\.(java|md|xml)$|(^|/)pom\.xml$' || true
echo '== Java outlines =='
fd -t f -e java . | xargs -r ast-grep outline --items all --type class,interface,enum,method --match 'Health|Readiness|Liveness|Availability' || true
echo '== Availability implementation and test references =='
rg -n -C 4 --glob '*.java' '(ApplicationAvailability|LivenessState|ReadinessState|healthz|readyz|Cache-Control|no-store)' .
echo '== Maven verification and Javadoc/JaCoCo configuration =='
rg -n -C 5 --glob 'pom.xml' '(jacoco|javadoc|doclint|failOnWarnings|verify|check)' .
echo '== Documentation references =='
rg -n -C 3 --glob '*.md' '(healthz|readyz|startupProbe|livenessProbe|readinessProbe|ApplicationAvailability|Spring Boot 3\.5\.16|APA|Kubernetes)' .

Length of output: 80230


🤖 web_search executed:

Official Spring Boot 3.5.16 documentation ApplicationAvailability LivenessState ReadinessState API contract

Length of output: 5937


🤖 web_search executed:

Official Kubernetes documentation startup liveness readiness probes traffic routing guidance

Length of output: 15219


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '== Probe controller, tests, and authorization rules =='
sed -n '1,130p' src/main/java/com/clearfolio/viewer/controller/HealthController.java
sed -n '1,125p' src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java
rg -n -C 6 --glob '*.java' '(pathMatchers|authorizeExchange|healthz|readyz|SecurityWebFilterChain|permitAll|authenticated)' src/main/java src/test/java

echo '== Complete JaCoCo and Javadoc verification configuration =='
sed -n '190,270p' pom.xml
rg -n -C 5 --glob '*.{yml,yaml}' '(mvn .*verify|Maven verify|jacoco|javadoc|fuzz|Semgrep|Security|CodeQL|strix)' .github . 2>/dev/null || true

echo '== ADR decision, Kubernetes configuration, and references =='
sed -n '1,155p' docs/operations/2026-08-05-availability-probes.md
echo '== Stale security documentation context =='
sed -n '24,42p' docs/security/2026-07-02-threat-model-data-handling.md
echo '== Changed files relative to main =='
git diff --name-status origin/main...HEAD
echo '== Exact-head check refresh =='
gh pr view 265 --repo ContextualWisdomLab/clearfolio --json headRefOid,statusCheckRollup,reviews \
  --jq '{headRefOid, reviews:[.reviews[]|{author:.author.login,state,commit:.commit.oid}], checks:[.statusCheckRollup[]|select(.name != null)|{name,status,conclusion,detailsUrl}]}'
echo '== Required branch protection rules =='
gh api repos/ContextualWisdomLab/clearfolio/branches/main/protection --jq '{required_status_checks,required_pull_request_reviews,required_conversation_resolution}' 2>&1 || true

Length of output: 46287


@seonghobae Review of exact head e35092718af8e5ae7c8657ea037683b87b379315 found these blockers:

  1. docs/security/2026-07-02-threat-model-data-handling.md Line 36 still describes GET /healthz as a readiness probe. This contradicts the implemented contract, where /healthz uses LivenessState and /readyz uses ReadinessState. Update this entry to describe both routes and their distinct roles.

  2. Required exact-head evidence is incomplete. At the final status refresh, Maven verify, all three fuzz jobs, Analyze (java-kotlin), and strix were IN_PROGRESS. Therefore, warning-free public Javadocs and zero missed production lines and branches are not yet verified for this exact head. Do not approve or merge until every required exact-head check completes successfully.

The controller implementation, executable state coverage, controlled response labels, Cache-Control: no-store, and the Kubernetes/Spring Boot ADR align with the stated contract. Repository branch-protection settings could not be inspected because the GitHub API returned HTTP 403.

You are interacting with an AI system.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@opencode-agent @cwl-noema-review Please independently review exact current head e35092718af8e5ae7c8657ea037683b87b379315. Exact-head CI run 30982476710, Security Scan 30982476694, SAST Semgrep 30982476674, and fuzz run 30982476741 are successful. The Maven verify job executed 451 tests with zero failures, errors, or skips; JaCoCo reported zero missed production lines and branches; Java 21 public Javadocs completed without warnings; buyer-readiness script checks passed. Verify the liveness/readiness semantic split, non-cacheable controlled probe surface, startup/liveness/readiness deployment contract, TDD evidence, permanent exact-head quality gates, and absence of unrelated regressions. Submit a blocking finding only when it applies to this exact head. Any automated review remains advisory unless GitHub recognizes the reviewer identity as satisfying the protected branch's independent write-permission approval rule.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
expected="e35092718af8e5ae7c8657ea037683b87b379315"

echo "== Revision identity =="
printf 'checked_out='; git rev-parse HEAD
printf 'expected='; printf '%s\n' "$expected"
git status --short
echo

echo "== Pull request exact-head metadata and check results =="
gh pr view 265 --repo "$repo" \
  --json number,headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{
    number, isDraft, headRefOid, reviewDecision,
    checks: [.statusCheckRollup[] | {name, status, conclusion, detailsUrl}],
    reviews: [.reviews[] | {author: .author.login, state, commit: .commit.oid}]
  }'
echo

echo "== Availability controller and executable tests =="
controller=$(fd -t f -e java 'HealthController.java' src | head -n1)
testfile=$(fd -t f -e java 'HealthControllerTest.java' src | head -n1)
printf 'controller=%s\ntest=%s\n' "$controller" "$testfile"
sed -n '1,220p' "$controller"
sed -n '1,280p' "$testfile"
echo

echo "== Authorization rule context =="
rg -n -C 6 --glob '*.java' '(healthz|readyz|pathMatchers|authorizeExchange|permitAll)' src/main/java
echo

echo "== Maven quality-gate configuration =="
rg -n -C 6 --glob 'pom.xml' '(jacoco|javadoc|doclint|failOnWarnings|maven-javadoc-plugin|maven-checkstyle|verify)' pom.xml
echo

echo "== Operational documentation and potential stale healthz statement =="
adr=$(fd -t f -e md . docs | rg 'availability-probes\.md$' | head -n1)
threat=$(fd -t f -e md . docs | rg 'threat-model-data-handling\.md$' | head -n1)
printf 'adr=%s\nthreat_model=%s\n' "$adr" "$threat"
sed -n '1,260p' "$adr"
sed -n '1,120p' "$threat"
echo

echo "== Changed files relative to main =="
git diff --name-status origin/main...HEAD

Length of output: 40696


@seonghobae Review of exact head e35092718af8e5ae7c8657ea037683b87b379315 found two current blockers.

  1. docs/security/2026-07-02-threat-model-data-handling.md Line 36 still defines GET /healthz as a readiness probe. This conflicts with HealthController, where /healthz maps LivenessState and /readyz maps ReadinessState. Update the threat model to describe both routes and their separate roles.

  2. The exact-head strix check is still IN_PROGRESS. The Maven verify job, buyer-readiness checks, three fuzz jobs, SAST, and listed security checks are successful. However, the required exact-head evidence is incomplete until strix completes successfully. Do not approve or merge before that result is successful.

The executable probe contract is correct. /healthz returns only ok or broken from LivenessState. /readyz returns only ready or not_ready from ReadinessState. Both routes use Cache-Control: no-store. The test suite covers each availability state and the fail-fast constructor case. The ADR gives a consistent Kubernetes startup, liveness, and readiness configuration. The Javadoc and JaCoCo gates are permanently bound to Maven verify.

This automated review is advisory. It is not an independent write-authorized approval.

You are interacting with an AI system.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Fix the exact current head 958aec59989db645492180167b4afe8334cf9544 using the new failing documentation contract test. CI run 30982831869, buyer-readiness script job 92230813200, is red because docs/security/2026-07-02-threat-model-data-handling.md still labels GET /healthz as readiness. In the primary runtime surfaces, replace that stale entry with two distinct entries: GET /healthz: liveness probe, and GET /readyz: readiness probe. Preserve the rest of the threat model and all unrelated code. Run python -m pytest -q scripts and mvn -B --no-transfer-progress verify; commit only after the documentation contract test, 451 production tests, zero missed production lines/branches, and warning-free public Javadocs all pass. Report the exact new head and command evidence.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Re-review exact current head 1c34120e6320c932565aacbdb3878e5d039f7095. The prior valid threat-model finding is addressed: the security threat model now distinguishes process liveness at /healthz from traffic readiness at /readyz, and scripts/test_documentation_contracts.py prevents that terminology from regressing without relying on brittle exact prose. Red evidence is CI run 30982831869, buyer-readiness job 92230813200; the replacement exact-head script job 92231770447 is green. Verify the current code, documentation, 451-test Maven acceptance gate, zero missed production lines/branches, warning-free public Javadocs, Security Scan, SAST, and all three fuzz matrix jobs. Treat queued or pending checks as not passing and report only current actionable blockers. This automated review is not independent write-authorized approval.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Independently review exact current head 1c34120e6320c932565aacbdb3878e5d039f7095. Validate the corrected security threat-model terminology and its regression test, executable liveness/readiness semantics, non-cacheable controlled probe responses, Kubernetes startup/liveness/readiness guidance, Spring Boot 3.5.16 and APA 7 source alignment, zero missed production lines/branches, warning-free public Javadocs, and exact-head CI/Security/SAST/fuzz evidence. Distinguish current findings from stale superseded heads. Do not approve or recommend merge while any exact-head check is pending, and note that automated review does not satisfy independent write-authorized approval.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
expected="1c34120e6320c932565aacbdb3878e5d039f7095"

echo "== Revision identity =="
printf 'checked_out='; git rev-parse HEAD
printf 'expected='; printf '%s\n' "$expected"
git status --short

echo "== Exact-head pull request checks and reviews =="
gh pr view 265 --repo "$repo" \
  --json number,headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{
    number, headRefOid, isDraft, reviewDecision,
    checks: [.statusCheckRollup[] | {name,status,conclusion,detailsUrl}],
    reviews: [.reviews[] | {author:.author.login,state,commit:.commit.oid}]
  }'

echo "== Candidate files =="
fd -t f . | rg '(^|/)(HealthController|HealthControllerTest|SecurityConfig|.*Security.*Config|test_documentation_contracts|pom|README|CHANGELOG|.*availability-probes|.*threat-model.*)\.(java|py|xml|md)$|(^|/)pom\.xml$' || true

echo "== Availability controller and tests =="
controller="$(fd -t f -e java 'HealthController.java' src | head -n1)"
testfile="$(fd -t f -e java 'HealthControllerTest.java' src | head -n1)"
printf 'controller=%s\ntest=%s\n' "$controller" "$testfile"
test -n "$controller" && sed -n '1,260p' "$controller"
test -n "$testfile" && sed -n '1,360p' "$testfile"

echo "== Probe authorization rules =="
rg -n -C 5 --glob '*.java' '(pathMatchers|authorizeExchange|permitAll|healthz|readyz)' src/main/java

echo "== Maven acceptance gates =="
sed -n '1,360p' pom.xml | rg -n -C 5 '(jacoco|javadoc|doclint|failOnWarnings|verify|check)'

echo "== Operations and security documentation =="
for file in \
  "$(fd -t f -e md . docs | rg 'availability-probes\.md$' | head -n1)" \
  "$(fd -t f -e md . docs | rg 'threat-model-data-handling\.md$' | head -n1)" \
  "$(fd -t f -e py 'test_documentation_contracts.py' scripts | head -n1)"
do
  if test -n "$file"; then
    echo "--- $file ---"
    sed -n '1,340p' "$file"
  fi
done

echo "== PR change scope =="
git diff --name-status origin/main...HEAD

Length of output: 53437


@seonghobae Review of exact head 1c34120e6320c932565aacbdb3878e5d039f7095 found two current blockers.

  1. src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java checks only $.status. It does not verify that the response body contains no additional properties. The implementation currently returns only {"status": ...}, but the test suite does not protect the controlled unauthenticated response surface from later expansion. Assert the complete JSON body for all four state cases.

  2. Required exact-head checks remain incomplete. The following checks are IN_PROGRESS:

    • fuzz (ArtifactTokenParserFuzzTest)
    • fuzz (DocumentValidationFuzzTest)
    • fuzz (TenantClaimsFuzzTest)
    • Analyze (java-kotlin)
    • strix

Maven verify and the buyer-readiness script tests succeeded on the exact head. The current code separates LivenessState at /healthz from ReadinessState at /readyz. Both probe responses use Cache-Control: no-store. The threat model now has the correct liveness and readiness terms. The documentation contract test protects this distinction.

Do not approve or merge until the response-body regression coverage is complete and every required exact-head check succeeds. This automated review is advisory and is not an independent write-authorized approval.

⚠️ 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.

@seonghobae
seonghobae marked this pull request as ready for review August 5, 2026 07:00
@seonghobae
seonghobae enabled auto-merge (squash) August 5, 2026 07:00

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review @coderabbitai Please review exact current head 1c34120e6320c932565aacbdb3878e5d039f7095. Verify the /healthz liveness and /readyz traffic-readiness separation, Spring Boot availability-state mapping, Cache-Control: no-store, controlled unauthenticated response surface, fail-fast dependency construction, zero missed production lines/branches, warning-free public Javadocs, Kubernetes/ADR/threat-model consistency, successful exact-head CI/Security/SAST/fuzz, and zero unresolved findings.

@seonghobae
seonghobae marked this pull request as draft August 5, 2026 07:01
auto-merge was automatically disabled August 5, 2026 07:01

Pull request was converted to draft

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
expected="1c34120e6320c932565aacbdb3878e5d039f7095"

echo "== Revision identity =="
printf 'checked_out='; git rev-parse HEAD
printf 'expected='; printf '%s\n' "$expected"
git status --short

echo "== Exact-head PR checks and unresolved review state =="
gh pr view 265 --repo "$repo" \
  --json headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{
    headRefOid, isDraft, reviewDecision,
    checks: [.statusCheckRollup[] | {name,status,conclusion,detailsUrl}],
    reviews: [.reviews[] | {author:.author.login,state,commit:.commit.oid}]
  }'

echo "== Target source/test/documentation files =="
fd -t f -e java 'HealthController.java' src
fd -t f -e java 'HealthControllerTest.java' src
fd -t f -e java . src/main | xargs -r ast-grep outline --items all --type class,method --match 'HealthController|Security|Availability' || true
fd -t f -e md . docs | rg '(availability-probes|threat-model-data-handling)\.md$'
fd -t f -e py 'test_documentation_contracts.py' scripts

echo "== Probe implementation and tests =="
for f in \
  "$(fd -t f -e java 'HealthController.java' src | head -n1)" \
  "$(fd -t f -e java 'HealthControllerTest.java' src | head -n1)"
do
  test -z "$f" || { echo "--- $f ---"; sed -n '1,340p' "$f"; }
done

echo "== Probe authorization configuration =="
rg -n -C 5 --glob '*.java' '(pathMatchers|authorizeExchange|permitAll|healthz|readyz)' src/main/java

echo "== Verify, JaCoCo, and Javadoc gates =="
rg -n -C 8 --glob 'pom.xml' '(jacoco|javadoc|doclint|failOnWarnings|<phase>verify</phase>|<goal>check</goal>)' pom.xml

echo "== Operations, threat-model, and documentation contract =="
for f in \
  "$(fd -t f -e md . docs | rg 'availability-probes\.md$' | head -n1)" \
  "$(fd -t f -e md . docs | rg 'threat-model-data-handling\.md$' | head -n1)" \
  "$(fd -t f -e py 'test_documentation_contracts.py' scripts | head -n1)"
do
  test -z "$f" || { echo "--- $f ---"; sed -n '1,360p' "$f"; }
done

echo "== Availability terminology in changed Markdown =="
git diff --name-only origin/main...HEAD -- '*.md' | while IFS= read -r f; do
  rg -n -i -C 2 '(healthz|readyz|liveness|readiness|startupProbe|Spring Boot 3\.5\.16|APA)' "$f" || true
done

Length of output: 72140


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
requested="1c34120e6320c932565aacbdb3878e5d039f7095"
current="1645ba381dfa41f5793e0af8d97923f805662bd7"

echo "== Requested commit identity =="
git show -s --format='commit=%H%nparents=%P%nsubject=%s%ncommitter=%cI' "$requested"

echo "== Requested-commit check runs =="
gh api "repos/$repo/commits/$requested/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,details_url,started_at,completed_at}]'

echo "== Requested-commit combined status =="
gh api "repos/$repo/commits/$requested/status" \
  --jq '{state, statuses:[.statuses[] | {context,state,target_url,updated_at}]}'

echo "== Relevant files at requested commit =="
for path in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  scripts/test_documentation_contracts.py \
  pom.xml
do
  echo "--- $path @ $requested ---"
  git show "$requested:$path" | sed -n '1,360p'
done

echo "== Change from requested commit to current PR head =="
git diff --stat "$requested..$current"
git diff --name-status "$requested..$current"
git diff -- "$requested..$current" \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  scripts/test_documentation_contracts.py \
  pom.xml || true

Length of output: 54014


@seonghobae Review of requested commit 1c34120e6320c932565aacbdb3878e5d039f7095 found two blockers.

  1. src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java verifies only $.status for each probe response. It does not verify that the unauthenticated body has no additional fields. The implementation currently returns only the controlled status label, but the test does not prevent a later addition of tenant, dependency, exception, or other detail. Assert the complete JSON body for all four state cases.

  2. The required strix check for the requested commit was cancelled. Do not treat this as successful exact-head evidence. Do not approve or merge this commit until strix completes successfully.

The remaining requested contract is correct at this commit:

  • /healthz uses LivenessState and returns ok or broken.
  • /readyz uses ReadinessState and returns ready or not_ready.
  • Both routes set Cache-Control: no-store.
  • The constructor fails fast when ApplicationAvailability is absent.
  • The ADR, Kubernetes example, threat model, and documentation contract test use consistent liveness and readiness roles.
  • Maven verify, all three fuzz jobs, SAST, and the listed security jobs succeeded.
  • pom.xml binds zero missed JaCoCo production lines and branches, plus warning-failing public Javadoc generation, to verify.

The PR has since advanced to 1645ba381dfa41f5793e0af8d97923f805662bd7. That later commit changes the response tests to assert complete JSON strings, but its required checks were still in progress at inspection time. This review is advisory and is not an independent write-authorized approval.

You are interacting with an AI system.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Re-review exact current head 1645ba381dfa41f5793e0af8d97923f805662bd7. The valid prior blocker is addressed: all four availability scenarios now assert the complete JSON payload by exact response-body equality, so no additional fields can be introduced without failing tests. The prior exact-head check-latency warning is superseded. Current exact-head evidence is CI 30983390425 (Maven job 92232587801, buyer-readiness job 92232587740), Security Scan 30983390474, SAST Semgrep 30983390391, and fuzz 30983390457; all completed successfully. Maven verified 451 tests with zero failures/errors/skips, 57 production classes with zero missed lines/branches, warning-free public Javadocs, and BUILD SUCCESS. Review only current code and report actionable blockers; this automated review is not independent write-authorized approval.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Independently review exact current head 1645ba381dfa41f5793e0af8d97923f805662bd7. Verify that every liveness/readiness status now has an exact complete-payload assertion, the threat model and regression contract distinguish /healthz liveness from /readyz readiness, probe responses remain controlled and non-cacheable, Kubernetes and Spring Boot 3.5.16 guidance remains accurate, and exact-head CI 30983390425, Security 30983390474, SAST 30983390391, and fuzz 30983390457 are successful. Distinguish current findings from stale/superseded heads. Do not treat automated review as independent write-authorized approval; this draft must remain blocked until critical parent/security ordering and protected-branch approval requirements are satisfied.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
expected="1645ba381dfa41f5793e0af8d97923f805662bd7"

echo "== Commit identity =="
printf 'checked_out='; git rev-parse HEAD
printf 'expected='; printf '%s\n' "$expected"
git show -s --format='subject=%s%ncommitted=%cI' "$expected"
git status --short

echo "== Exact-commit checks and combined statuses =="
gh api "repos/$repo/commits/$expected/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,details_url,completed_at}]'
gh api "repos/$repo/commits/$expected/status" \
  --jq '{state,statuses:[.statuses[] | {context,state,target_url,updated_at}]}'

echo "== Pull request head and unresolved review threads =="
gh pr view 265 --repo "$repo" \
  --json headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{headRefOid,isDraft,reviewDecision,checks:[.statusCheckRollup[] | {name,status,conclusion}],reviews:[.reviews[] | {author:.author.login,state,commit:.commit.oid}]}'
gh api graphql -F owner="ContextualWisdomLab" -F name="clearfolio" -F number=265 -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes { isResolved comments(first: 1) { nodes { author { login } body path line } } }
      }
    }
  }
}' --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)]'

echo "== Implementation, tests, and access control at exact commit =="
for path in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  pom.xml \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  scripts/test_documentation_contracts.py
do
  echo "--- $path ---"
  git show "$expected:$path" | sed -n '1,380p'
done

echo "== Authorization rules =="
git grep -n -C 5 -E '(healthz|readyz|pathMatchers|authorizeExchange|permitAll)' "$expected" -- 'src/main/java/**/*.java' || true

echo "== Changed paths at exact commit =="
git diff-tree --no-commit-id --name-status -r "$expected"

Length of output: 62612


@seonghobae Review of exact head 1645ba381dfa41f5793e0af8d97923f805662bd7 found one current blocker.

  • The required exact-head strix check is still IN_PROGRESS. Both the commit check-runs API and the PR status rollup report this state. Do not approve or merge until strix completes with success.

The prior test-coverage blocker is addressed. HealthControllerTest now asserts the complete JSON body for all four availability cases.

The current implementation is otherwise consistent with the requested contract:

  • /healthz maps LivenessState.CORRECT to 200 {"status":"ok"} and other liveness states to 503 {"status":"broken"}.
  • /readyz maps ReadinessState.ACCEPTING_TRAFFIC to 200 {"status":"ready"} and other readiness states to 503 {"status":"not_ready"}.
  • Both probes set Cache-Control: no-store.
  • The controller rejects a missing ApplicationAvailability provider.
  • The ADR, threat model, and documentation contract test use the correct liveness and readiness roles.
  • mvn verify permanently enforces zero missed production lines and branches, plus warning-free public Javadocs.
  • Maven verify, buyer-readiness, Security Scan, SAST, CodeQL, and all three fuzz jobs succeeded for this commit.
  • GitHub reports no unresolved review threads.

This review is advisory. It is not an independent write-authorized approval.

⚠️ 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.

@seonghobae
seonghobae marked this pull request as ready for review August 5, 2026 07:04
@seonghobae
seonghobae enabled auto-merge (squash) August 5, 2026 07:04
@seonghobae
seonghobae marked this pull request as draft August 5, 2026 07:04
auto-merge was automatically disabled August 5, 2026 07:04

Pull request was converted to draft

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ARCHITECTURE.md (1)

67-72: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

운영 게이트를 verify 계약과 일치시키십시오.

이 목록은 mvn test와 독립 Javadoc 명령을 게이트로 제시합니다. 그러나 현재 수용 기준은 mvn -B --no-transfer-progress verify만 완전한 병합 증거로 허용합니다. 이 목록을 verify 명령과 그 안의 JaCoCo 및 Javadoc 게이트로 변경하십시오.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ARCHITECTURE.md` around lines 67 - 72, Update the build and test gates
section in ARCHITECTURE.md to identify `mvn -B --no-transfer-progress verify` as
the single complete merge-evidence command, and describe the JaCoCo and JavaDoc
gates as checks executed within that verify lifecycle. Remove the standalone
`mvn test` and independent Javadoc command entries while retaining the Markdown
lint requirement for changed documentation.
🧹 Nitpick comments (1)
src/test/java/com/clearfolio/viewer/controller/ApiExceptionHandlerCoverageTest.java (1)

14-23: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

차단 범위 안쪽 문자에 대한 검증도 추가하십시오.

현재 테스트는 U+202F가 보존되는 것만 확인합니다. 이 단방향 경계 검증은 sanitizeForLog가 전혀 치환하지 않도록 회귀해도 통과합니다. 보안 정제 경로에는 차단 범위 안쪽 문자가 실제로 치환되는지도 확인해야 합니다. DefaultDocumentValidationCoverageTest의 line 86과 동일한 양방향 검증 방식을 적용하십시오.

♻️ 제안 변경
-        String sanitized = (String) method.invoke(handler, "\u202F");
-
-        assertEquals("\u202F", sanitized);
+        assertEquals("\u202F", (String) method.invoke(handler, "\u202F"));
+        assertEquals("_", (String) method.invoke(handler, "\u202E"));
+        assertEquals("__", (String) method.invoke(handler, "\r\n"));

위 기대값은 ApiExceptionHandler.sanitizeForLog의 치환 문자에 맞추어 조정하십시오.

As per coding guidelines: "Tests must exercise real behavior, including failure, security, concurrency, and recovery paths; coverage-only assertions must represent a valid contract."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/test/java/com/clearfolio/viewer/controller/ApiExceptionHandlerCoverageTest.java`
around lines 14 - 23, Extend
logSanitizationPreservesTheCodePointImmediatelyAfterTheBlockedRange to also pass
a code point inside sanitizeForLog’s blocked range and assert that it is
replaced with the sanitizer’s configured replacement character, while retaining
the existing U+202F preservation assertion. Mirror the two-sided validation used
by DefaultDocumentValidationCoverageTest.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/main/java/com/clearfolio/viewer/api/ApiErrorResponse.java`:
- Around line 10-14: Update ApiExceptionHandler.handleTypeMismatch so failed
UUID and Boolean conversion inputs are not copied directly into
details["value"]; redact them or include them only through an appropriate
allowlist, preserving ApiErrorResponse’s contract that details contain no secret
values.

In
`@src/main/java/com/clearfolio/viewer/exception/UnsupportedDocumentFormatException.java`:
- Line 10: Update the Javadoc for the extension field in
UnsupportedDocumentFormatException to describe it as the blocked extension
supplied to the constructor, replacing the inaccurate “Normalized extension”
wording. Keep the constructor’s behavior of storing the input unchanged.

In
`@src/test/java/com/clearfolio/viewer/service/DefaultDocumentValidationCoverageTest.java`:
- Around line 89-118: Replace the class-private SECURITY_PROVIDERS_LOCK in
src/test/java/com/clearfolio/viewer/service/DefaultDocumentValidationCoverageTest.java:89-118
with the shared test lock, and add
`@ResourceLock`("java.security.Security.providers") to serialize access. Apply the
same shared lock and resource annotation in
src/test/java/com/clearfolio/viewer/controller/ConversionControllerCoverageTest.java:57-92,
extracting the duplicated sha256ProviderPositions and ProviderPosition helpers
into the shared test utility.
- Around line 33-38: Update
rejectsANullPolicySecretSuppliedByAnExternalConfigurationSource and its
JavaDoc/name to reflect the actual ConversionProperties contract, since
getPolicyOverrideSecret() normalizes null to "". Remove the mock-based null
getter scenario or change the test to verify the supported default/normalization
behavior; only add a production configuration path if null is genuinely valid
there.

---

Outside diff comments:
In `@ARCHITECTURE.md`:
- Around line 67-72: Update the build and test gates section in ARCHITECTURE.md
to identify `mvn -B --no-transfer-progress verify` as the single complete
merge-evidence command, and describe the JaCoCo and JavaDoc gates as checks
executed within that verify lifecycle. Remove the standalone `mvn test` and
independent Javadoc command entries while retaining the Markdown lint
requirement for changed documentation.

---

Nitpick comments:
In
`@src/test/java/com/clearfolio/viewer/controller/ApiExceptionHandlerCoverageTest.java`:
- Around line 14-23: Extend
logSanitizationPreservesTheCodePointImmediatelyAfterTheBlockedRange to also pass
a code point inside sanitizeForLog’s blocked range and assert that it is
replaced with the sanitizer’s configured replacement character, while retaining
the existing U+202F preservation assertion. Mirror the two-sided validation used
by DefaultDocumentValidationCoverageTest.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bcc1d0d4-ad1c-497c-8840-34cc9759a24a

📥 Commits

Reviewing files that changed from the base of the PR and between f3cc09a and 1645ba3.

📒 Files selected for processing (44)
  • .github/workflows/ci.yml
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • README.md
  • docs/architecture.md
  • docs/engineering/acceptance-criteria.md
  • docs/operations/2026-08-05-availability-probes.md
  • docs/security/2026-07-02-threat-model-data-handling.md
  • pom.xml
  • scripts/test_documentation_contracts.py
  • src/main/java/com/clearfolio/viewer/ClearfolioViewerApplication.java
  • src/main/java/com/clearfolio/viewer/api/AdminJobListResponse.java
  • src/main/java/com/clearfolio/viewer/api/ApiErrorResponse.java
  • src/main/java/com/clearfolio/viewer/api/ConversionJobStatusResponse.java
  • src/main/java/com/clearfolio/viewer/api/SubmitConversionResponse.java
  • src/main/java/com/clearfolio/viewer/api/ViewerBootstrapResponse.java
  • src/main/java/com/clearfolio/viewer/artifact/ArtifactLinkService.java
  • src/main/java/com/clearfolio/viewer/artifact/ArtifactTokenException.java
  • src/main/java/com/clearfolio/viewer/artifact/InMemoryArtifactStore.java
  • src/main/java/com/clearfolio/viewer/auth/TenantContext.java
  • src/main/java/com/clearfolio/viewer/config/ArtifactStoreConfig.java
  • src/main/java/com/clearfolio/viewer/config/ArtifactStoreProperties.java
  • src/main/java/com/clearfolio/viewer/config/ConversionExecutorConfig.java
  • src/main/java/com/clearfolio/viewer/config/ConversionProperties.java
  • src/main/java/com/clearfolio/viewer/config/ViewerSecurityHeadersWebFilter.java
  • src/main/java/com/clearfolio/viewer/controller/ApiExceptionHandler.java
  • src/main/java/com/clearfolio/viewer/controller/ConversionController.java
  • src/main/java/com/clearfolio/viewer/controller/HealthController.java
  • src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java
  • src/main/java/com/clearfolio/viewer/exception/UnsupportedDocumentFormatException.java
  • src/main/java/com/clearfolio/viewer/model/ConversionJobStatus.java
  • src/main/java/com/clearfolio/viewer/repository/InMemoryConversionJobRepository.java
  • src/main/java/com/clearfolio/viewer/service/DefaultConversionWorker.java
  • src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java
  • src/test/java/com/clearfolio/viewer/artifact/FileSystemArtifactStoreCoverageTest.java
  • src/test/java/com/clearfolio/viewer/config/ConversionPropertiesCoverageTest.java
  • src/test/java/com/clearfolio/viewer/controller/ApiExceptionHandlerCoverageTest.java
  • src/test/java/com/clearfolio/viewer/controller/ConversionControllerCoverageTest.java
  • src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java
  • src/test/java/com/clearfolio/viewer/repository/InMemoryConversionJobRepositoryCoverageTest.java
  • src/test/java/com/clearfolio/viewer/service/DefaultDocumentConversionServiceCoverageTest.java
  • src/test/java/com/clearfolio/viewer/service/DefaultDocumentValidationCoverageTest.java
  • src/test/java/com/clearfolio/viewer/service/DocumentConversionServiceCoverageTest.java

Comment thread src/main/java/com/clearfolio/viewer/api/ApiErrorResponse.java Outdated

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Rebuild this bounded availability slice cleanly on authoritative parent #270 exact head 91091ddc212dac328ff36696f56c0a15c21407f4 instead of carrying the pre-parent main history. Preserve only the liveness/readiness contracts, cache-control behavior, redacted mismatch details, shared security-provider test serialization, executable documentation contracts, and their realistic tests. Reconcile shared pom.xml, CI, CHANGELOG.md, AGENTS.md, architecture/acceptance documents, public Javadocs, and security test utilities without dropping #270's audit-key, Netty/SBOM, filesystem TOCTOU, zero-coverage, or warning-free-Javadoc contracts. Do not add temporary/write-scoped workflows or import predecessor evidence. Keep the PR draft, run mvn -B --no-transfer-progress verify, and report the exact rebuilt head for fresh stack verification.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@opencode-agent @cwl-noema-review Please review exact head 592fa1799fd1d83ab80b6532fb7ba49ba4d61f9d relative to parent #270 exact 26563218ae42eaa876c784fcf56b27f8cb810080. The branch is 4 commits ahead, 0 behind, and changes the bounded availability-probe implementation, tests, and documentation only. Exact-head CI 31067654426, Security Scan 31067654410, SAST 31067654440, and fuzz 31067654402 are successful. Treat predecessor results as stale and report only current-head findings. Parent integration and independent approval remain separate gates.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="592fa1799fd1d83ab80b6532fb7ba49ba4d61f9d"
parent="26563218ae42eaa876c784fcf56b27f8cb810080"

echo "== Revision identity and ancestry =="
printf 'checked_out='; git rev-parse HEAD
printf 'requested_head=%s\nparent=%s\n' "$head" "$parent"
git merge-base --is-ancestor "$parent" "$head" && echo "parent_is_ancestor=true"
printf 'commits_ahead='; git rev-list --count "$parent..$head"
printf 'commits_behind='; git rev-list --count "$head..$parent"
git log --format='%H %s' "$parent..$head"
echo

echo "== Exact-head check runs =="
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,details_url,completed_at}]'
echo "== Exact-head legacy statuses =="
gh api "repos/$repo/commits/$head/status" \
  --jq '{state,statuses:[.statuses[] | {context,state,target_url,updated_at}]}'
echo

echo "== Pull request state and unresolved threads =="
gh pr view 265 --repo "$repo" --json headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{headRefOid,isDraft,reviewDecision,checks:[.statusCheckRollup[]|{name,status,conclusion}],reviews:[.reviews[]|{author:.author.login,state,commit:.commit.oid}]}'
gh api graphql -F owner="ContextualWisdomLab" -F name="clearfolio" -F number=265 -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          comments(first: 1) { nodes { author { login } body path line } }
        }
      }
    }
  }
}' --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)]'
echo

echo "== Exact change scope =="
git diff --name-status "$parent..$head"
git diff --stat "$parent..$head"
echo

echo "== Changed Java outlines =="
git diff --name-only "$parent..$head" -- '*.java' | while IFS= read -r file; do
  echo "--- $file ---"
  ast-grep outline "$file" --items all --type class,interface,enum,method || true
done
echo

echo "== Availability implementation, tests, and security rules at head =="
for file in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  pom.xml \
  scripts/test_documentation_contracts.py \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  README.md \
  CHANGELOG.md \
  .github/workflows/ci.yml
do
  if git cat-file -e "$head:$file" 2>/dev/null; then
    echo "--- $file @ $head ---"
    git show "$head:$file" | sed -n '1,380p'
  fi
done

echo "== Probe authorization references at head =="
git grep -n -C 5 -E '(healthz|readyz|pathMatchers|authorizeExchange|permitAll)' "$head" -- 'src/main/java/**/*.java' || true

Length of output: 86438


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="592fa1799fd1d83ab80b6532fb7ba49ba4d61f9d"
parent="26563218ae42eaa876c784fcf56b27f8cb810080"

echo "== Full bounded patch, parent to exact head =="
git diff --find-renames --unified=40 "$parent..$head" -- \
  ARCHITECTURE.md \
  CHANGELOG.md \
  CLAUDE.md \
  README.md \
  docs/architecture.md \
  docs/engineering/acceptance-criteria.md \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  scripts/test_documentation_contracts.py \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java
echo

echo "== Refresh exact-head strix result =="
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '[.check_runs[] | select(.name == "strix") | {name,status,conclusion,details_url,started_at,completed_at}]'
echo

echo "== Required branch protection =="
gh api "repos/$repo/branches/main/protection" \
  --jq '{required_status_checks:.required_status_checks.contexts,strict:.required_status_checks.strict,required_approvals:.required_pull_request_reviews.required_approving_review_count,require_code_owner:.required_pull_request_reviews.require_code_owner_reviews,require_last_push_approval:.required_pull_request_reviews.require_last_push_approval,require_conversation_resolution:.required_conversation_resolution.enabled}' \
  2>&1 || true
echo

echo "== Probe routes and security-chain definitions at exact head =="
git grep -n -E 'SecurityWebFilterChain|ServerHttpSecurity|`@EnableWebFluxSecurity`|authorizeExchange|pathMatchers|`@GetMapping`\("/(healthz|readyz)"\)' \
  "$head" -- 'src/main/java/**/*.java' || true

Length of output: 79466


@seonghobae Review of exact head 592fa1799fd1d83ab80b6532fb7ba49ba4d61f9d found one current blocker.

  • The exact-head strix check is still in_progress. Do not treat the required check set as complete until strix finishes with success.

I found no actionable defect in the availability-probe change.

  • /healthz uses LivenessState and returns only ok or broken.
  • /readyz uses ReadinessState and returns only ready or not_ready.
  • Each of the four state outcomes has an exact JSON-body assertion.
  • Both responses set Cache-Control: no-store.
  • HealthController fails fast when ApplicationAvailability is absent.
  • The application has no WebFlux security chain. The probe routes are unauthenticated.
  • The ADR, architecture documents, README, acceptance criteria, and threat model consistently distinguish liveness from readiness.
  • scripts/test_documentation_contracts.py protects the threat-model terminology.
  • mvn verify permanently enforces zero missed production lines and branches, plus warning-free public Javadocs.
  • Exact-head CI, Maven merge compatibility, Security Scan, SAST, CodeQL, and all three fuzz jobs succeeded.

GitHub denied access to the branch-protection API with HTTP 403. I could not verify the protected-branch rule configuration. Parent integration and independent approval remain separate merge gates. This automated review is advisory and is not an independent write-authorized approval.

⚠️ 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.

@seonghobae
seonghobae changed the base branch from main to fix/pii-logging-16240128950440010639 August 6, 2026 03:32

Copy link
Copy Markdown
Collaborator Author

Exact stack refresh: authoritative parent #270 is now 2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17. This PR remains at 592fa1799fd1d83ab80b6532fb7ba49ba4d61f9d and is currently diverged: 4 slice commits ahead and 11 parent commits behind, with merge base 26563218ae42eaa876c784fcf56b27f8cb810080. Historical checks remain evidence for this child head only; every parent-sensitive merge-compatibility or review conclusion is stale. Keep draft, do not merge, and reconcile only after #270 integrates or its exact head is deliberately imported and all resulting exact-head gates are rerun.

@seonghobae
seonghobae force-pushed the feat/liveness-readiness-probes branch from 592fa17 to 6937386 Compare August 6, 2026 08:52

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@opencode-agent @cwl-noema-review Please independently review exact current head 69373862a646598a73a5ce1992342d78419aa171 relative to parent #270 exact 2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17. Treat predecessor-head results as stale.

Check the bounded availability implementation and evidence: ApplicationAvailability construction; liveness/readiness state mapping; exact controlled 200/503 payloads; Cache-Control: no-store; absence of sensitive operational detail; liveness independence from shared services; deterministic failure/recovery tests; documentation terminology contract; APA 7th references; and preservation of the parent download authorization, privacy, dependency, SBOM, Maven-report, coverage, and Javadoc gates.

Report exact-head findings or a no-blocker advisory conclusion after independent inspection. Keep Draft and do not infer counted independent approval.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="69373862a646598a73a5ce1992342d78419aa171"
parent="2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17"

echo "== Revision and ancestry =="
printf 'checked_out='; git rev-parse HEAD
printf 'requested_head=%s\nparent_head=%s\n' "$head" "$parent"
git merge-base --is-ancestor "$parent" "$head" && echo "parent_is_ancestor=true" || echo "parent_is_ancestor=false"
printf 'merge_base='; git merge-base "$parent" "$head"
printf 'ahead='; git rev-list --count "$parent..$head"
printf 'behind='; git rev-list --count "$head..$parent"
git log --format='%H %s' "$parent..$head"

echo "== Exact-head checks =="
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,details_url,started_at,completed_at}]'
gh api "repos/$repo/commits/$head/status" \
  --jq '{state,statuses:[.statuses[]|{context,state,target_url,updated_at}]}'

echo "== PR state and unresolved threads =="
gh pr view 265 --repo "$repo" --json headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{headRefOid,isDraft,reviewDecision,checks:[.statusCheckRollup[]|{name,status,conclusion}],reviews:[.reviews[]|{author:.author.login,state,commit:.commit.oid}]}'
gh api graphql -F owner="ContextualWisdomLab" -F name="clearfolio" -F number=265 -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          comments(first: 1) { nodes { author { login } body path line } }
        }
      }
    }
  }
}' --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)]'

echo "== Parent-to-head file scope =="
git diff --name-status "$parent..$head"
git diff --stat "$parent..$head"

echo "== Candidate source and test outlines =="
for file in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java
do
  if git cat-file -e "$head:$file" 2>/dev/null; then
    echo "--- $file ---"
    git show "$head:$file" > "/tmp/$(basename "$file")"
    ast-grep outline "/tmp/$(basename "$file")" --items all --type class,method,constructor || true
  fi
done

echo "== Probe implementation, tests, security references, and gates =="
for file in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  pom.xml \
  scripts/test_documentation_contracts.py \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  README.md \
  ARCHITECTURE.md \
  docs/architecture.md \
  docs/engineering/acceptance-criteria.md \
  CHANGELOG.md \
  .github/workflows/ci.yml
do
  if git cat-file -e "$head:$file" 2>/dev/null; then
    echo "--- $file @ head ---"
    git show "$head:$file" | sed -n '1,420p'
  fi
done

echo "== Route authorization and shared-service coupling references at head =="
git grep -n -C 5 -E '(healthz|readyz|ApplicationAvailability|LivenessState|ReadinessState|SecurityWebFilterChain|ServerHttpSecurity|authorizeExchange|pathMatchers|permitAll|WebClient|Repository|ArtifactStore)' \
  "$head" -- 'src/main/java/**/*.java' || true

Length of output: 204381


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="69373862a646598a73a5ce1992342d78419aa171"
parent="2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17"

echo "== Workflow runs for exact head =="
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
  --jq '[.workflow_runs[] | {name,event,status,conclusion,head_sha,html_url,created_at,updated_at}]'

echo "== Check suites and all associated check runs for exact head =="
gh api "repos/$repo/commits/$head/check-suites?per_page=100" \
  --jq '[.check_suites[] | {id,status,conclusion,app:.app.slug,head_sha,url}]'
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,app:.app.slug,details_url}]'

echo "== Exact-head commit statuses without projection =="
gh api "repos/$repo/commits/$head/status" \
  --jq '.statuses | map({context,state,description,target_url,creator:.creator.login})'

echo "== Parent-sensitive paths changed by availability slice =="
git diff --name-status "$parent..$head" -- \
  pom.xml \
  .github \
  scripts/verify_maven_test_reports.py \
  scripts \
  docs/security \
  docs/qa \
  src/main/java/com/clearfolio/viewer/auth \
  src/main/java/com/clearfolio/viewer/controller/ArtifactController.java \
  src/main/java/com/clearfolio/viewer/controller/ConversionController.java \
  src/test \
  AGENTS.md \
  CLAUDE.md

echo "== Full bounded patch for code, test, build, workflow, and documentation contract =="
git diff --find-renames --unified=25 "$parent..$head" -- \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  scripts/test_documentation_contracts.py \
  pom.xml \
  .github/workflows/ci.yml \
  .github \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  docs/engineering/acceptance-criteria.md \
  ARCHITECTURE.md \
  docs/architecture.md \
  README.md \
  CHANGELOG.md \
  CLAUDE.md

echo "== Parent security/dependency/SBOM/reporting file identity =="
for file in \
  pom.xml \
  .github/workflows/ci.yml \
  scripts/verify_maven_test_reports.py \
  src/main/java/com/clearfolio/viewer/controller/ArtifactController.java \
  src/main/java/com/clearfolio/viewer/controller/ConversionController.java
do
  if git cat-file -e "$parent:$file" 2>/dev/null && git cat-file -e "$head:$file" 2>/dev/null; then
    printf '%s parent=' "$file"
    git rev-parse "$parent:$file"
    printf '%s head=' "$file"
    git rev-parse "$head:$file"
  fi
done

echo "== Availability tests and docs: recovery terminology =="
git grep -n -i -C 3 -E '(recovery|recover|BROKEN|REFUSING_TRAFFIC|ACCEPTING_TRAFFIC|CORRECT)' \
  "$head" -- \
  'src/test/**/*.java' \
  'docs/**/*.md' \
  'scripts/*.py' || true

Length of output: 218190


@seonghobae I found one current merge blocker for exact head 69373862a646598a73a5ce1992342d78419aa171.

  • Exact-head required evidence is incomplete. The three fuzz jobs succeeded. However, the Codecov, Claude, and CodeRabbit check suites are still queued. The inspected commit data does not contain exact-head CI, Security Scan, SAST, CodeQL, or strix results. Do not treat absent or queued evidence as passing. Keep the pull request in Draft until every required exact-head check completes successfully.

I found no actionable implementation defect in the bounded availability slice.

  • The head is directly based on parent 2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17, with one commit ahead and zero commits behind.
  • HealthController fails fast when ApplicationAvailability is absent.
  • /healthz maps LivenessState.CORRECT to 200 {"status":"ok"}. Other liveness states map to 503 {"status":"broken"}.
  • /readyz maps ReadinessState.ACCEPTING_TRAFFIC to 200 {"status":"ready"}. Other readiness states map to 503 {"status":"not_ready"}.
  • All four outcomes assert the exact response body and Cache-Control: no-store.
  • The controller has no repository, artifact-store, gateway, database, or other shared-service dependency. The liveness path remains independent of shared services.
  • The Kubernetes guidance, Spring Boot 3.5.16 reference, APA-style references, architecture documents, and threat model use consistent liveness and readiness terminology.
  • scripts/test_documentation_contracts.py prevents the threat-model terminology from regressing.
  • Parent download authorization, privacy, dependency, SBOM, Maven-report, JaCoCo, and Javadoc gates are preserved. The inspected parent-sensitive files are byte-identical between the parent and this head.

This review is advisory. It is not a counted independent write-authorized approval.

⚠️ 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.

@seonghobae
seonghobae changed the base branch from fix/pii-logging-16240128950440010639 to snapshot/buyer-parent-2ff43fc August 6, 2026 13:09
@seonghobae
seonghobae changed the base branch from snapshot/buyer-parent-2ff43fc to fix/pii-logging-16240128950440010639 August 6, 2026 13:19

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@opencode-agent @cwl-noema-review Please independently review exact current head d67947e3d405a47c155ea5078aeddb7e110f76de relative to exact parent #270 head c1239e20b048a582b19cb9eeb90f2c29f7c8f814. The branch was fast-forward reconciled onto the current parent; all predecessor-head comments, checks, reviews, and approvals are stale and must not transfer.

Verify the bounded availability contract: /healthz reflects process liveness without shared-service coupling; /readyz gates traffic acceptance; controlled 200/503 JSON responses; Cache-Control: no-store; no tenant, secret, topology, or dependency leakage; deterministic failure/recovery behavior; Kubernetes probe semantics; public documentation; and exact-head/synthetic-merge compatibility.

Exact-head CI 31105439528 succeeded, including Maven exact head, synthetic merge, buyer-readiness scripts, 100% production line/branch coverage, and warning-free Javadocs. Exact-head fuzz 31105439127 succeeded. Unresolved actionable inline threads are zero. Security Scan, SAST Semgrep, Strix, formal exact-head reviews, and counted independent write-authorized approval remain absent and must not be inferred. Keep Draft; do not merge or publish.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="d67947e3d405a47c155ea5078aeddb7e110f76de"
parent="c1239e20b048a582b19cb9eeb90f2c29f7c8f814"

echo "== Exact revision identity and ancestry =="
printf 'checked_out='; git rev-parse HEAD
printf 'requested_head=%s\nparent=%s\n' "$head" "$parent"
git show -s --format='head_subject=%s%nhead_committed=%cI' "$head"
git show -s --format='parent_subject=%s%nparent_committed=%cI' "$parent"
git merge-base --is-ancestor "$parent" "$head" && echo "parent_is_ancestor=true" || echo "parent_is_ancestor=false"
printf 'merge_base='; git merge-base "$parent" "$head"
printf 'ahead='; git rev-list --count "$parent..$head"
printf 'behind='; git rev-list --count "$head..$parent"

echo "== Exact bounded change scope =="
git diff --name-status "$parent..$head"
git diff --stat "$parent..$head"

echo "== Exact-head check runs, workflow runs, and commit statuses =="
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '[.check_runs[] | {name,status,conclusion,app:.app.slug,details_url,started_at,completed_at}]'
gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
  --jq '[.workflow_runs[] | {name,status,conclusion,event,head_sha,html_url,created_at,updated_at}]'
gh api "repos/$repo/commits/$head/status" \
  --jq '{state,statuses:[.statuses[] | {context,state,description,target_url,updated_at}]}'

echo "== Pull request state, reviews, and unresolved threads =="
gh pr view 265 --repo "$repo" --json headRefOid,isDraft,reviewDecision,statusCheckRollup,reviews \
  --jq '{headRefOid,isDraft,reviewDecision,checks:[.statusCheckRollup[] | {name,status,conclusion}],reviews:[.reviews[] | {author:.author.login,state,commit:.commit.oid}]}'
gh api graphql -F owner="ContextualWisdomLab" -F name="clearfolio" -F number=265 -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          comments(first: 1) { nodes { author { login } body path line } }
        }
      }
    }
  }
}' --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)]'

echo "== Availability controller and executable coverage at exact head =="
for file in \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  scripts/test_documentation_contracts.py \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  README.md \
  ARCHITECTURE.md \
  docs/architecture.md \
  docs/engineering/acceptance-criteria.md \
  pom.xml \
  .github/workflows/ci.yml
do
  if git cat-file -e "$head:$file" 2>/dev/null; then
    echo "--- $file @ $head ---"
    git show "$head:$file" | sed -n '1,420p'
  fi
done

echo "== Availability dependencies and route authorization at exact head =="
git grep -n -C 5 -E '(ApplicationAvailability|LivenessState|ReadinessState|healthz|readyz|SecurityWebFilterChain|ServerHttpSecurity|authorizeExchange|pathMatchers|permitAll|Repository|ArtifactStore|WebClient)' \
  "$head" -- 'src/main/java/**/*.java' || true

echo "== Full bounded patch for availability-owned paths =="
git diff --find-renames --unified=30 "$parent..$head" -- \
  src/main/java/com/clearfolio/viewer/controller/HealthController.java \
  src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java \
  scripts/test_documentation_contracts.py \
  docs/operations/2026-08-05-availability-probes.md \
  docs/security/2026-07-02-threat-model-data-handling.md \
  README.md \
  ARCHITECTURE.md \
  docs/architecture.md \
  docs/engineering/acceptance-criteria.md \
  CHANGELOG.md

Length of output: 200382


🏁 Script executed:

#!/bin/bash
set -euo pipefail

log="/tmp/coderabbit-shell-logs/shell-output-OJXfw2"
head="d67947e3d405a47c155ea5078aeddb7e110f76de"
parent="c1239e20b048a582b19cb9eeb90f2c29f7c8f814"

echo "== Captured revision, scope, and GitHub evidence =="
for label in \
  "== Exact revision identity and ancestry ==" \
  "== Exact bounded change scope ==" \
  "== Exact-head check runs, workflow runs, and commit statuses ==" \
  "== Pull request state, reviews, and unresolved threads =="
do
  line=$(rg -nF "$label" "$log" | head -n1 | cut -d: -f1 || true)
  if [ -n "$line" ]; then
    printf '\n--- %s ---\n' "$label"
    sed -n "${line},$((line + 180))p" "$log"
  fi
done

echo "== Focused exact-head implementation and test =="
git show "$head:src/main/java/com/clearfolio/viewer/controller/HealthController.java" | cat -n
git show "$head:src/test/java/com/clearfolio/viewer/controller/HealthControllerTest.java" | cat -n

echo "== Probe-specific construction and request dependencies =="
git grep -n -C 3 -E 'class HealthController|ApplicationAvailability|new HealthController|healthz|readyz' \
  "$head" -- 'src/main/java/**/*.java' 'src/test/**/*.java'

echo "== Availability documentation and citations =="
git show "$head:docs/operations/2026-08-05-availability-probes.md" | cat -n
git show "$head:docs/security/2026-07-02-threat-model-data-handling.md" | sed -n '20,50p' | cat -n

echo "== Parent reconciliation: files that differ =="
git diff --name-only "$parent..$head"

Length of output: 77878


@seonghobae I found one current blocker.

The requested parent c1239e20b048a582b19cb9eeb90f2c29f7c8f814 is not an ancestor of exact head d67947e3d405a47c155ea5078aeddb7e110f76de.

  • The merge base is 2ff43fc1b280f6de2ca903695e5cbeef5c0b3c17.
  • The availability branch is 2 commits ahead and 2 commits behind the requested parent.
  • Therefore, the branch was not fast-forward reconciled onto the requested parent.
  • The successful Maven merge compatibility check validates the PR merge revision for its configured base. It does not validate a merge with c1239e20b048a582b19cb9eeb90f2c29f7c8f814.

Keep the PR in Draft. Reconcile or merge the availability slice onto the requested parent. Then rerun exact-head and synthetic-merge checks.

I found no code-level defect in the availability slice.

  • /healthz reads only ApplicationAvailability.getLivenessState() and has no shared-service dependency.
  • /readyz reads only ApplicationAvailability.getReadinessState().
  • The controller returns the required 200 or 503 status and exact controlled payloads.
  • Both routes set Cache-Control: no-store.
  • Tests assert all four complete JSON payloads, status codes, cache headers, and null-provider construction failure.
  • The ADR, threat model, README, and architecture documents distinguish liveness from readiness.
  • Exact-head CI and all three fuzz jobs succeeded.
  • No unresolved inline review threads exist.

Security Scan, SAST Semgrep, Strix, formal exact-head review, and counted independent write-authorized approval remain absent. I do not infer them from the successful checks.

You are interacting with an AI system.

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