Skip to content

docs: establish canonical commercial architecture baseline - #149

Draft
seonghobae wants to merge 56 commits into
developfrom
docs/canonical-architecture-baseline-622e5e6
Draft

docs: establish canonical commercial architecture baseline#149
seonghobae wants to merge 56 commits into
developfrom
docs/canonical-architecture-baseline-622e5e6

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Purpose

Establish one buyer-usable, code-current acquisition-diligence documentation graph for mightyETL while keeping protected behavior, active work, evidence, release authority, and third-party obligations distinct.

Protected-develop reconciliation completed — 2026-09-02

The prior branch state was 31 protected commits behind and explicitly required reconciliation. That actionable blocker is resolved non-destructively and the current branch still contains the protected develop base.

  • live protected base: develop@ba8911f50ed20a39927a0d51c0cf20f9b7c91820;
  • exact current branch head: a1dfca16a260e6f605d099499a064d7ddb330042;
  • reconciliation anchor merge commit 074d7cf... preserved the prior documentation head and then-protected develop as parents; later forward commits remain descendants of that non-force reconciliation;
  • fresh comparison for the current head reports ahead_by=56, behind_by=0, with protected develop as the merge base;
  • the current protected-base delta is 38 documentation/license/documentation-contract paths owned by this lane;
  • the protected CDC/config/security/test/runtime changes inherited during reconciliation remain supplied by the protected parent rather than reconstructed or overwritten.

Every predecessor-head check/review is historical after later head movement and does not transfer.

Repository-facing product documentation

The canonical line contains PRD/TRD, Architecture, ADRs, UML, ERD/logical model, API Contract, Threat Model, Test Strategy, Operability, Traceability, Documentation Assessment, AGENTS/CLAUDE/README/CHANGELOG alignment, and machine-checkable documentation contracts.

The README is product-first and:

  • provides the exact-cased Ask DeepWiki entry for ContextualWisdomLab/mightyETL;
  • distinguishes protected develop behavior from active PRs and known gaps;
  • preserves standalone ETL/CDC versus composed MSA deployment boundaries;
  • keeps PostgreSQL as the current production ETL target and warehouse/BI connectors as non-production scaffolds where applicable;
  • exposes current authentication/CDC-delivery/release limitations instead of marketing active work as shipped;
  • links buyers/operators to canonical architecture, security, operability, traceability, test and release evidence.

Current protected-source reinspection after reconciliation confirms the README remains conservative: CDC Kafka acknowledgement work #139 is still Draft/unmerged, the stop-completion defect remains a separate gap, and the README does not claim those candidate repairs as protected behavior.

Licensing decision and due diligence

Owner policy is explicit in issue #151: ContextualWisdomLab-owned source uses a commercially usable license, normally Apache-2.0 or MIT, while noncommercial restrictions and GPL/LGPL/AGPL inbound software are not accepted by default. This branch implements the first-party decision with Apache License 2.0 for mightyETL original source/documentation.

  • root LICENSE is the canonical Apache-2.0 text;
  • README and CHANGELOG state the same first-party grant;
  • docs/DOCUMENTATION_ASSESSMENT.md keeps third-party/imported-material provenance, attribution/NOTICE obligations, distributable-license enforcement, SBOM/package evidence and release provenance as separate diligence rather than pretending the source grant relicenses them;
  • existing OpenZipkin material identified by the repository is treated as separate Apache-2.0 upstream material, not as proof that every inbound dependency is cleared;
  • no GPL/LGPL/AGPL or noncommercial dependency is normalized as acceptable by the README.

Issue #151 therefore remains open for the remaining third-party/imported provenance and distributable NOTICE/license enforcement. Issue #165 remains the release/provenance owner; no release is claimed from this documentation branch.

Documentation fitness

  • Architecture / ADR / UML / ERD-logical model / Test Strategy / Traceability: present on this branch;
  • first-party source/documentation licensing: Apache-2.0 on this branch;
  • PRD/TRD/README: source-ancestry-current with protected develop and still subject to exact-head semantic review;
  • Security / Threat Model and Operability/recovery: present but release/readiness evidence remains separate;
  • machine-readable API/event contracts and release provenance remain independently owned gaps.

Current integration state

This PR remains Draft while fresh exact-head verification and residual acquisition diligence execute. For current head a1dfca16a260e6f605d099499a064d7ddb330042, SAST Semgrep run 33602552511 is pending and CI 33602552448, SBOM 33602552811, Dependency Review 33602552388, and Security Scan 33602552440 are queued. These are non-passing waiting states, not merge evidence. Do not infer readiness from predecessor results.

Do not merge merely because ancestry is current or source licensing is explicit. Integration still requires terminal applicable CI/security/dependency/SBOM/coverage evidence, zero valid unresolved review findings, then-live governance, and no genuine commercial-license/provenance blocker affecting the distributable surface. No protection weakening, stale-evidence transfer, release claim, certification claim, or third-party relicensing is authorized.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

mightyETL의 저장소 운영 정책과 제품 문서를 보호된 develop 기준으로 전면 갱신했습니다. ETL·CDC·Gateway 계약, 상태 분류, 보안 경계, 자동화 권한, ADR, canonical 문서 및 문서 계약 테스트를 추가하거나 재작성했습니다.

Changes

운영 정책과 자동화 권한

Layer / File(s) Summary
운영 정책과 검증 게이트
AGENTS.md, CLAUDE.md, SECURITY.md
writer lease, exact-head 검증, RCA, TDD, PII 보호, 권한 분리, 보안 및 릴리스 게이트를 정의했습니다.

제품 상태와 아키텍처

Layer / File(s) Summary
제품 상태와 서비스 구조
ARCHITECTURE.md, PRD.md, README.md, SUMMARY_KR.md
보호된 develop의 구현 상태를 기준으로 ETL 원자성·멱등성, durable job, Debezium CDC, connector 범위, 배포 구조 및 known gap을 문서화했습니다.

기술·API 계약

Layer / File(s) Summary
기술 및 API 계약
TRD.md, docs/API_CONTRACT.md
HTTP·이벤트 호환성, 오류 형식, 영속성 상태, 인증 경계, CDC 전달, durable job 및 검증 증거 요구사항을 정의했습니다.

Canonical 문서와 검증

Layer / File(s) Summary
Canonical 문서 체계
CHANGELOG.md, docs/DOCUMENTATION_ASSESSMENT.md, docs/ERD.md, docs/OPERABILITY.md, docs/TEST_STRATEGY.md, docs/THREAT_MODEL.md, docs/TRACEABILITY.md, docs/UML.md, docs/adr/*
문서 상태 taxonomy, 추적성, 운영 절차, 위협 모델, ERD·UML 및 8개 ADR을 추가했습니다.
문서 계약 테스트
etl-service/src/test/java/com/xtrmetl/etl/documentation/*
필수 문서, API·영속성 계약, 상태 분류, 내부 링크, 형식 및 문서 간 일관성을 검증하도록 테스트를 변경했습니다.

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

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% 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 제목은 핵심 변경 사항인 상용 아키텍처 문서의 기준선 수립을 정확하게 요약합니다. 문서 개편, canonical 문서 추가, ADR 도입 및 검증 기준 변경과 관련됩니다.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/canonical-architecture-baseline-622e5e6

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review exact current head 15c000a644796ef72e071dcd745dd4cf89feb38a against protected develop@622e5e6c3d534f230c390f10e3832efadfc01825. Focus on whether the canonical documentation and documentation-contract tests truthfully distinguish protected implementation from active PR/planned/superseded state, avoid inventing shipped APIs/security claims, and keep internal links/ADR/UML/ERD/API/threat/test/operability/traceability contracts consistent. Do not treat synthetic-merge workflow evidence as literal-head proof.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='15c000a644796ef72e071dcd745dd4cf89feb38a'

echo '== Repository HEAD and requested commits =='
git rev-parse HEAD
git cat-file -t "$base"
git cat-file -t "$head"
git show -s --format='BASE %H%n%P%n%s' "$base"
git show -s --format='HEAD %H%n%P%n%s' "$head"

echo '== Changed files, literal range =='
git diff --name-status "$base" "$head"

echo '== Documentation and test files in literal range =='
git diff --name-only "$base" "$head" | grep -E '(^|/)([^/]*\.(md|MD)|[^/]*(Test|Tests)\.(java|kt|ts|tsx|js|jsx|py|go|cs))$|(^|/)(docs|adr|api|threat|test|operability|traceability)(/|$)' || true

echo '== Root repository map =='
fd -HI -d 3 -t f -E .git | sed -n '1,300p'

echo '== Structural outline of changed source/test files =='
while IFS= read -r f; do
  case "$f" in
    *.java|*.kt|*.ts|*.tsx|*.js|*.jsx|*.py|*.go|*.cs)
      echo "--- $f"
      ast-grep outline "$f" --items all 2>/dev/null || true
      ;;
  esac
done < <(git diff --name-only "$base" "$head")

echo '== Diff: documentation and documentation-contract-related files =='
git diff --find-renames --find-copies --unified=80 "$base" "$head" -- \
  '*.md' '*.MD' '*Documentation*' '*documentation*' '*Contract*' '*contract*' \
  '*ADR*' '*adr*' '*UML*' '*uml*' '*ERD*' '*erd*' '*Threat*' '*threat*' \
  '*Traceability*' '*traceability*' '*Operability*' '*operability*' \
  '*Assessment*' '*assessment*' '*Api*' '*API*' || true

echo '== Protected-base implementation and API terminology =='
git grep -n -I -E \
  '(/auth/signin|/auth/signup|BCrypt|JWT|parallel.?batch|idempotenc|durable.?job|job.?status|atomic|transaction)' \
  "$base" -- ':!*.md' ':!*.MD' || true

Length of output: 6564


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='15c000a644796ef72e071dcd745dd4cf89feb38a'

echo '== Changed-file statistics =='
git diff --stat "$base" "$head"
echo

echo '== Changed Java test content at literal head =='
for f in \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java
do
  echo "--- $f"
  git show "$head:$f" | nl -ba
done

echo '== New canonical document headings, links, and status vocabulary =='
for f in $(git diff --name-only --diff-filter=A "$base" "$head" -- 'docs/**'); do
  echo "--- $f"
  git show "$head:$f" | nl -ba | grep -E \
    '^[[:space:]]*[0-9]+[[:space:]]+(#|.*\]\(|.*implemented_on_develop|.*active_pr|.*planned|.*superseded|.*out_of_scope|.*PR #|.*PR #[0-9]+|.*endpoint|.*authentication|.*JWT|.*BCrypt|.*idempotenc|.*durable|.*atomic|.*parallel)' \
    || true
done

echo '== Root-document changed hunks =='
git diff --unified=30 "$base" "$head" -- \
  ARCHITECTURE.md CHANGELOG.md PRD.md README.md SECURITY.md SUMMARY_KR.md TRD.md

echo '== Markdown links in added canonical documents and their target existence at literal head =='
python3 - <<'PY'
import subprocess, re, posixpath
base = '622e5e6c3d534f230c390f10e3832efadfc01825'
head = '15c000a644796ef72e071dcd745dd4cf89feb38a'
files = subprocess.check_output(
    ['git','diff','--name-only','--diff-filter=A',base,head,'--','docs/**'],
    text=True).splitlines()
all_files = set(subprocess.check_output(['git','ls-tree','-r','--name-only',head], text=True).splitlines())
pattern = re.compile(r'(?<!!)\[[^\]]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)')
for f in files:
    text = subprocess.check_output(['git','show',f'{head}:{f}'], text=True, errors='replace')
    for lineno, line in enumerate(text.splitlines(), 1):
        for raw in pattern.findall(line):
            target = raw.strip('<>')
            if target.startswith(('#','http://','https://','mailto:')): continue
            target = target.split('#',1)[0].split('?',1)[0]
            if not target: continue
            resolved = posixpath.normpath(posixpath.join(posixpath.dirname(f), target))
            print(f'{f}:{lineno}: {raw} => {resolved}: {"OK" if resolved in all_files else "MISSING"}')
PY

echo '== Protected-base endpoint mappings and security implementations =='
git grep -n -I -E \
  '@(RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)|RequestMethod\.' \
  "$base" -- ':(glob)**/*.java' || true
git grep -n -I -E \
  '(BCrypt|Jwt|JWT|PasswordEncoder|SecurityFilterChain|Authentication|authorizeHttpRequests|permitAll)' \
  "$base" -- ':(glob)**/*.java' || true

echo '== Protected-base durable job and idempotency implementation symbols =='
git grep -n -I -E \
  '(Idempoten|idempoten|Durable|durable|JobStatus|jobStatus|`@Transactional`|TransactionTemplate|atomic)' \
  "$base" -- ':(glob)**/*.java' || true

Length of output: 5356


🏁 Script executed:

#!/bin/bash
set -u

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='15c000a644796ef72e071dcd745dd4cf89feb38a'

echo '== Literal-head documentation contract tests =='
for f in \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java
do
  echo "--- $f"
  git show "$head:$f" | grep -n '^' || true
done

echo '== Complete new canonical documents at literal head =='
for f in \
  docs/API_CONTRACT.md \
  docs/DOCUMENTATION_ASSESSMENT.md \
  docs/ERD.md \
  docs/OPERABILITY.md \
  docs/TEST_STRATEGY.md \
  docs/THREAT_MODEL.md \
  docs/TRACEABILITY.md \
  docs/UML.md \
  docs/adr/README.md \
  docs/adr/0001-canonical-documentation-and-status.md \
  docs/adr/0002-atomic-etl-and-idempotency.md \
  docs/adr/0003-durable-job-database-authority.md \
  docs/adr/0004-cdc-delivery-and-lifecycle-truth.md \
  docs/adr/0005-gateway-identity-boundary.md \
  docs/adr/0006-exact-evidence-and-agent-authority.md \
  docs/adr/0007-standalone-msa-and-connector-truth.md \
  docs/adr/0008-purpose-bound-pii-controls.md
do
  echo "--- $f"
  git show "$head:$f" | grep -n '^' || true
done

echo '== Literal-head references to state labels and active PRs =='
git grep -n -I -E \
  '(implemented_on_develop|active_pr|planned|superseded|out_of_scope|PR #[0-9]+|`#142`|`#149`)' \
  "$head" -- '*.md' '*.MD' '*.java' || true

echo '== Markdown link target checks, added canonical documents =='
python3 - <<'PY'
import subprocess, re, posixpath
base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='15c000a644796ef72e071dcd745dd4cf89feb38a'
files=subprocess.check_output(
 ['git','diff','--name-only','--diff-filter=A',base,head,'--','docs/**'],text=True).splitlines()
tree=set(subprocess.check_output(['git','ls-tree','-r','--name-only',head],text=True).splitlines())
rx=re.compile(r'(?<!!)\[[^\]]+\]\(([^)\s]+)')
for f in files:
  content=subprocess.check_output(['git','show',head+':'+f],text=True,errors='replace')
  for i,line in enumerate(content.splitlines(),1):
    for target in rx.findall(line):
      target=target.strip('<>').split('#',1)[0].split('?',1)[0]
      if not target or target.startswith(('http://','https://','mailto:')): continue
      resolved=posixpath.normpath(posixpath.join(posixpath.dirname(f),target))
      if resolved not in tree:
        print('MISSING {}:{} {} -> {}'.format(f,i,target,resolved))
PY

echo '== Protected-base Java routes =='
git grep -n -I -E \
  '@(RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)|RequestMethod\.' \
  "$base" -- '*.java' || true

echo '== Protected-base Java security implementation terms =='
git grep -n -I -E \
  '(BCrypt|Jwt|JWT|PasswordEncoder|SecurityFilterChain|Authentication|authorizeHttpRequests|permitAll)' \
  "$base" -- '*.java' || true

echo '== Protected-base Java durable job, idempotency, and transaction terms =='
git grep -n -I -E \
  '(Idempoten|idempoten|Durable|durable|JobStatus|jobStatus|`@Transactional`|TransactionTemplate|atomic)' \
  "$base" -- '*.java' || true

Length of output: 233047


🏁 Script executed:

#!/bin/bash
set -u

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='15c000a644796ef72e071dcd745dd4cf89feb38a'

echo '== Canonical Markdown fragment-anchor audit at literal head =='
python3 - <<'PY'
import re, subprocess, posixpath, unicodedata
head='15c000a644796ef72e071dcd745dd4cf89feb38a'
docs=[
 'README.md','SUMMARY_KR.md','PRD.md','TRD.md','ARCHITECTURE.md','SECURITY.md',
 'docs/UML.md','docs/ERD.md','docs/API_CONTRACT.md','docs/THREAT_MODEL.md',
 'docs/TEST_STRATEGY.md','docs/OPERABILITY.md','docs/TRACEABILITY.md',
 'docs/DOCUMENTATION_ASSESSMENT.md','docs/adr/README.md'
]
tree=set(subprocess.check_output(['git','ls-tree','-r','--name-only',head],text=True).splitlines())
content={}
for f in docs:
    content[f]=subprocess.check_output(['git','show',head+':'+f],text=True,errors='replace')
def slug(s):
    s=unicodedata.normalize('NFKD',s).lower()
    s=re.sub(r'[`*_~]','',s)
    s=re.sub(r'[^\w\s-]','',s,flags=re.UNICODE)
    return re.sub(r'[\s-]+','-',s).strip('-')
anchors={}
for f,text in content.items():
    counts={}
    for line in text.splitlines():
        m=re.match(r'^\s{0,3}#{1,6}\s+(.+?)\s*#*\s*$',line)
        if m:
            a=slug(m.group(1)); n=counts.get(a,0); counts[a]=n+1
            anchors.setdefault(f,set()).add(a if n==0 else a+'-'+str(n))
rx=re.compile(r'(?<!!)\[[^\]]+\]\(([^)\s]+)')
for f,text in content.items():
  for lineno,line in enumerate(text.splitlines(),1):
    for raw in rx.findall(line):
      link=raw.strip('<>')
      if link.startswith(('http://','https://','mailto:')): continue
      path,sep,frag=link.partition('#')
      target=f if not path else posixpath.normpath(posixpath.join(posixpath.dirname(f),path))
      if target not in tree:
          print('MISSING_FILE {}:{} {}'.format(f,lineno,link))
      elif sep and target in anchors and slug(frag) not in anchors[target]:
          print('MISSING_ANCHOR {}:{} {} -> {}#{}'.format(f,lineno,link,target,slug(frag)))
PY

echo '== Literal-head documentation source-path references absent from its tree =='
python3 - <<'PY'
import re, subprocess
head='15c000a644796ef72e071dcd745dd4cf89feb38a'
docs=subprocess.check_output(
 ['git','diff','--name-only','622e5e6c3d534f230c390f10e3832efadfc01825',head,'--','*.md','*.MD'],
 text=True).splitlines()
tree=set(subprocess.check_output(['git','ls-tree','-r','--name-only',head],text=True).splitlines())
rx=re.compile(r'`((?:[\w.-]+/)+[\w.-]+(?:\.[\w.-]+)?)`')
for f in docs:
 text=subprocess.check_output(['git','show',head+':'+f],text=True,errors='replace')
 for i,line in enumerate(text.splitlines(),1):
  for path in rx.findall(line):
   if path not in tree and not path.startswith(('http://','https://')):
    print('POSSIBLE_MISSING_SOURCE_REFERENCE {}:{} {}'.format(f,i,path))
PY

echo '== Protected-base migration/bootstrap files matching ERD references =='
git ls-tree -r --name-only "$base" | grep -E \
  '(^|/)(01_schema\.sql|V1__create_etl_idempotency_records\.sql|V2__create_etl_job_records\.sql)$' || true

echo '== Protected-base controller configuration and response details =='
for f in \
  etl-service/src/main/java/com/xtrmetl/etl/controller/EtlJobController.java \
  etl-service/src/main/java/com/xtrmetl/etl/controller/EtlController.java \
  zuul-gateway/src/main/java/com/xtrmetl/gateway/security/JwtAuthenticationFilter.java \
  etl-service/src/main/resources/db/migration/V2__create_etl_job_records.sql
do
  echo "--- $f"
  git show "$base:$f" 2>/dev/null | grep -n -E \
    '(Conditional|RequestMapping|PostMapping|GetMapping|ResponseEntity|Location|Cache-Control|valid_token|job_status|CHECK|CREATE TABLE|Idempotency|Authentication)' || true
done

echo '== Status-claim enforcement inside the new literal-head contract test =='
git show "$head:etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java" \
  | grep -n -E \
    '(active_pr|implemented_on_develop|planned|superseded|out_of_scope|known_gap|`#121`|`#139`|`#142`|`#143`|`#148`|assertTrue)' || true

Length of output: 11850


@seonghobae I reviewed literal head 15c000a644796ef72e071dcd745dd4cf89feb38a against protected develop@622e5e6c3d534f230c390f10e3832efadfc01825.

I found two documentation-contract issues.

  1. README.md Line 257 links to LICENSE, but the literal head has no LICENSE file. This breaks the internal-link contract. DocumentationValidationTest.readmeInternalLinksResolve() should fail on this target.

  2. CanonicalDocumentationContractTest does not verify capability-to-status relationships. For example, Lines 54–83 only require implemented_on_develop and active_pr to occur somewhere in the root documents. The test remains green if POST /api/etl/jobs/{job_record_id}/cancellation, CANCELLED, or a Resource Server JWT claim is relabeled implemented_on_develop, provided active_pr still occurs elsewhere. Add assertions that bind each protected API/state to implemented_on_develop and each open-PR API/state to active_pr.

The protected-base code supports the main corrected claims. It contains the documented ETL and CDC routes, feature-gated durable intake/status, principal-scoped idempotency, and the literal valid_token gateway placeholder. I did not use synthetic-merge evidence as literal-head proof.

✅ Action performed

Review finished.

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 12

🤖 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 `@AGENTS.md`:
- Around line 104-108: Update the “Standards, research, and commercial
readiness” section by replacing the misspelled `doctoring/ADRs` reference with
the repository’s canonical documentation and ADR directory paths, so
contributors record APA 7 references in the correct locations.

In `@ARCHITECTURE.md`:
- Line 133: Implement bounded retention for etl_job_records.request_payload:
define TTL, purge payloads on terminal states, handle cleanup failures, and
restore cleanup behavior after restart, with migration and lifecycle tests
covering these paths. Update ARCHITECTURE.md lines 133-133 and PRD.md lines
304-321 to document the same retention contract; if implementation is deferred,
mark the capability as a known_gap and restrict production use instead.
- Line 279: Update the sentence beginning with “#121” so the issue identifier is
enclosed in Markdown backticks, preventing it from being interpreted as a
heading; leave the rest of the sentence unchanged.

In `@docs/API_CONTRACT.md`:
- Around line 143-154: Update the Problem Details contract to match
EtlApiProblemHandler’s problem.setInstance(...) response field by documenting
instance instead of path, unless an explicit path alias is implemented. Keep the
documented public fields aligned with the actual response and add or update
contract tests to lock in the chosen field name.

In `@docs/ERD.md`:
- Around line 73-75: Update the `etl_job_records` section in `docs/ERD.md` so
terminal-state `request_payload` clearing is not presented as implemented in
protected `develop`; mark it as `known_gap` or `active_pr` until the
corresponding migration and integration tests exist. Keep the documented active
and terminal status values, and retain the statement that protected develop
lacks lease, pagination, cancellation, and replay-lineage fields.

In `@docs/TEST_STRATEGY.md`:
- Around line 131-140: Update docs/TEST_STRATEGY.md lines 131-140 to include
known_gap in the canonical status taxonomy and require each capability status to
be validated against source-backed claims. Update docs/TRACEABILITY.md line 39
so the Status value is planned, moving the partial scaffold detail into the
Source / persistence or Evidence column.

In
`@etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java`:
- Around line 120-129: Replace the standalone status-token checks with
capability-to-status assertions. In
etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java:120-129,
bind protected contracts such as POST /api/etl/process, etl_idempotency_records,
and etl_job_records to documentation entries marked implemented_on_develop. In
etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java:149-158,
bind cancellation, CANCELLED, and Resource Server JWT claims to their exact
active_pr or known_gap statuses, ensuring unrelated status labels cannot satisfy
the tests.

In
`@etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java`:
- Around line 57-59: Restore the approved LICENSE file referenced by README.md
so DocumentationValidationTest.readmeInternalLinksResolve passes without
weakening the internal-link contract; if no license has been authorized, remove
the README LICENSE link instead and resolve the deployment policy before
changing the test.

In `@PRD.md`:
- Line 230: NFR-REL-1 heading을 현재 ####에서 ###로 변경해 `## 5. Non-Functional
Requirements` 아래의 계층을 한 단계씩 따르도록 수정하세요.

In `@README.md`:
- Line 22: README.md의 Databricks / Snowflake / Qlik status를 canonical 상태인
known_gap으로 변경하고, Notes 설명에는 scaffold-only를 유지하세요. 다른 상태 라벨이나 문서 구조는 변경하지 마세요.

In `@SECURITY.md`:
- Around line 67-69: Update the PR `#139` entry in SECURITY.md to replace “finite
future waiting” with the established “bounded acknowledgement wait/retry
boundary” terminology, matching ARCHITECTURE.md and PRD.md while preserving the
surrounding remediation contract description.

In `@TRD.md`:
- Around line 24-30: Update the Spring Boot and Spring Cloud version entries in
TRD.md to match the root pom.xml Maven properties: 3.5.16 and 2025.0.3. Leave
the already aligned Java and Debezium entries unchanged.
🪄 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: ed81746a-f995-4246-a2d3-41c9abaf21d2

📥 Commits

Reviewing files that changed from the base of the PR and between 622e5e6 and 132d223.

📒 Files selected for processing (28)
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • PRD.md
  • README.md
  • SECURITY.md
  • SUMMARY_KR.md
  • TRD.md
  • docs/API_CONTRACT.md
  • docs/DOCUMENTATION_ASSESSMENT.md
  • docs/ERD.md
  • docs/OPERABILITY.md
  • docs/TEST_STRATEGY.md
  • docs/THREAT_MODEL.md
  • docs/TRACEABILITY.md
  • docs/UML.md
  • docs/adr/0001-canonical-documentation-and-status.md
  • docs/adr/0002-atomic-etl-and-idempotency.md
  • docs/adr/0003-durable-job-database-authority.md
  • docs/adr/0004-cdc-delivery-and-lifecycle-truth.md
  • docs/adr/0005-gateway-identity-boundary.md
  • docs/adr/0006-exact-evidence-and-agent-authority.md
  • docs/adr/0007-standalone-msa-and-connector-truth.md
  • docs/adr/0008-purpose-bound-pii-controls.md
  • docs/adr/README.md
  • etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java
  • etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java

Comment thread AGENTS.md
Comment thread ARCHITECTURE.md Outdated
Comment thread ARCHITECTURE.md Outdated
Comment thread docs/API_CONTRACT.md
Comment thread docs/ERD.md Outdated
Comment thread PRD.md Outdated
Comment thread README.md Outdated
Comment thread SECURITY.md Outdated
Comment thread TRD.md

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review exact current head e3f69c747ffdeae5212f9735b0d59e6562e344cc. The predecessor-head findings have been revalidated and addressed; do not reuse conclusions from older heads.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='e3f69c747ffdeae5212f9735b0d59e6562e344cc'

echo '== Commit identity =='
printf 'checked-out: '; git rev-parse HEAD
git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"
git show -s --format='base %H%nparents %P%nsubject %s' "$base"
git show -s --format='head %H%nparents %P%nsubject %s' "$head"

echo '== Literal diff name/status =='
git diff --name-status "$base" "$head"

echo '== Relevant changed files =='
git diff --name-only "$base" "$head" -- \
  '*.md' '*.MD' \
  'etl-service/src/test/java/com/xtrmetl/etl/documentation/*.java' \
  'etl-service/src/main/**/*.java' \
  'zuul-gateway/src/main/**/*.java'

echo '== Java test outline =='
for f in \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java
do
  if git cat-file -e "$head:$f" 2>/dev/null; then
    echo "--- $f"
    git show "$head:$f" > "/tmp/$(basename "$f")"
    ast-grep outline "/tmp/$(basename "$f")" --items all || true
    nl -ba "/tmp/$(basename "$f")"
  fi
done

echo '== Current documentation status claims and API/state references =='
git grep -n -I -E \
  '(implemented_on_develop|active_pr|planned|superseded|known_gap|out_of_scope|CANCELLED|cancellation|Resource Server|JWT|valid_token|Idempotency-Key|/api/etl/jobs)' \
  "$head" -- '*.md' '*.MD' '*.java' || true

echo '== Literal-head Markdown link audit =='
python3 - <<'PY'
import posixpath, re, subprocess
head = 'e3f69c747ffdeae5212f9735b0d59e6562e344cc'
tree = set(subprocess.check_output(
    ['git', 'ls-tree', '-r', '--name-only', head], text=True).splitlines())
files = [p for p in tree if p.lower().endswith('.md')]
link = re.compile(r'(?<!!)\[[^\]]+\]\(([^)\s]+)')
for path in sorted(files):
    text = subprocess.check_output(
        ['git', 'show', f'{head}:{path}'], text=True, errors='replace')
    for line_no, line_text in enumerate(text.splitlines(), 1):
        for raw in link.findall(line_text):
            target = raw.strip('<>')
            if target.startswith(('http://', 'https://', 'mailto:', '#')):
                continue
            target = target.split('#', 1)[0].split('?', 1)[0]
            if not target:
                continue
            resolved = posixpath.normpath(posixpath.join(posixpath.dirname(path), target))
            if resolved not in tree:
                print(f'MISSING {path}:{line_no}: {raw} -> {resolved}')
PY

echo '== Protected-base literal route and security evidence =='
git grep -n -I -E \
  '@(RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)|RequestMethod\.' \
  "$base" -- '*.java' || true
git grep -n -I -E \
  '(valid_token|Jwt|JWT|SecurityFilterChain|Authentication|Idempoten|idempoten|Durable|durable|JobStatus|Transactional)' \
  "$base" -- '*.java' '*.sql' || true

echo '== Diff for current documentation contracts =='
git diff --unified=50 "$base" "$head" -- \
  README.md PRD.md TRD.md ARCHITECTURE.md SECURITY.md \
  'docs/**/*.md' \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java

Length of output: 6735


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='622e5e6c3d534f230c390f10e3832efadfc01825'
old_head='15c000a644796ef72e071dcd745dd4cf89feb38a'
head='e3f69c747ffdeae5212f9735b0d59e6562e344cc'

show_numbered() {
  git show "$1:$2" | awk '{printf "%5d  %s\n", NR, $0}'
}

echo '== Documentation contract tests at literal head =='
for f in \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java
do
  echo "--- $f"
  show_numbered "$head" "$f"
done

echo '== Changes from predecessor reviewed head to requested head =='
git diff --unified=40 "$old_head" "$head" -- \
  README.md PRD.md TRD.md ARCHITECTURE.md SECURITY.md \
  'docs/**/*.md' \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/CanonicalDocumentationContractTest.java \
  etl-service/src/test/java/com/xtrmetl/etl/documentation/DocumentationValidationTest.java

echo '== Status-bearing documentation lines at literal head =='
git grep -n -I -E \
  '(implemented_on_develop|active_pr|planned|superseded|known_gap|out_of_scope|CANCELLED|cancellation|Resource Server|JWT|valid_token|Idempotency-Key|/api/etl/jobs)' \
  "$head" -- '*.md' '*.MD' || true

echo '== Literal-head Markdown link audit =='
python3 - <<'PY'
import posixpath, re, subprocess
head = 'e3f69c747ffdeae5212f9735b0d59e6562e344cc'
tree = set(subprocess.check_output(
    ['git', 'ls-tree', '-r', '--name-only', head], text=True).splitlines())
link = re.compile(r'(?<!!)\[[^\]]+\]\(([^)\s]+)')
for path in sorted(p for p in tree if p.lower().endswith('.md')):
    text = subprocess.check_output(
        ['git', 'show', f'{head}:{path}'], text=True, errors='replace')
    for line_no, line_text in enumerate(text.splitlines(), 1):
        for raw in link.findall(line_text):
            target = raw.strip('<>')
            if target.startswith(('http://', 'https://', 'mailto:', '#')):
                continue
            target = target.split('#', 1)[0].split('?', 1)[0]
            if target:
                resolved = posixpath.normpath(posixpath.join(posixpath.dirname(path), target))
                if resolved not in tree:
                    print(f'MISSING {path}:{line_no}: {raw} -> {resolved}')
PY

echo '== Locate protected-base sources relevant to documented contracts =='
git ls-tree -r --name-only "$base" | grep -E \
  '(^|/)(Etl(Job)?Controller|JwtAuthenticationFilter|.*Security.*|V[0-9]+__.*(job|idempoten).*\.(java|sql))$' \
  || true

echo '== Protected-base route, status, and security evidence =='
git grep -n -I -E \
  '@(RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)|RequestMethod\.|valid_token|Jwt|JWT|SecurityFilterChain|Idempoten|idempoten|Durable|durable|JobStatus|Transactional' \
  "$base" -- '*.java' '*.sql' || true

Length of output: 222835


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='622e5e6c3d534f230c390f10e3832efadfc01825'
head='e3f69c747ffdeae5212f9735b0d59e6562e344cc'

echo '== README directory link and target =='
git show "$head:README.md" | awk 'NR >= 190 && NR <= 215 { printf "%5d  %s\n", NR, $0 }'
echo '-- tracked entries under docs/connectors --'
git ls-tree -r --name-only "$head" -- docs/connectors || true
echo '-- working-tree target type --'
if [ -d docs/connectors ]; then
  echo 'docs/connectors is a directory'
elif [ -e docs/connectors ]; then
  echo 'docs/connectors exists but is not a directory'
else
  echo 'docs/connectors does not exist'
fi

echo '== Maven version declarations at literal head =='
for f in $(git ls-tree -r --name-only "$head" | grep -E '(^|/)pom\.xml$'); do
  echo "--- $f"
  git show "$head:$f" | grep -n -E '(spring-boot|spring-cloud|3\.5\.|2025\.0\.)' || true
done

echo '== TRD runtime version statements =='
git show "$head:TRD.md" | awk 'NR >= 15 && NR <= 35 { printf "%5d  %s\n", NR, $0 }'

echo '== Protected-base ETL problem mapping and error statuses =='
for f in \
  etl-service/src/main/java/com/xtrmetl/etl/controller/EtlApiProblemHandler.java \
  etl-service/src/main/java/com/xtrmetl/etl/service/EtlRequestError.java
do
  echo "--- $f"
  git show "$base:$f" | awk '{printf "%5d  %s\n", NR, $0}' | \
    grep -E -C 4 '(HttpStatus|SERVICE_UNAVAILABLE|INTERNAL_SERVER_ERROR|TRANSIENT|503|500|Target|DataAccess)' \
    || true
done

echo '== Literal-head README retry statements and canonical problem contract =='
git show "$head:README.md" | awk 'NR >= 105 && NR <= 145 { printf "%5d  %s\n", NR, $0 }'
git show "$head:docs/api/problem-details.md" | awk 'NR <= 150 { printf "%5d  %s\n", NR, $0 }'

Length of output: 29239


@seonghobae I reviewed literal head e3f69c747ffdeae5212f9735b0d59e6562e344cc against protected develop@622e5e6c3d534f230c390f10e3832efadfc01825.

I found one documentation-contract gap.

  • CanonicalDocumentationContractTest.capabilityStatusesAreBoundToSourceBackedClaims() binds status rows only in docs/TRACEABILITY.md at Lines 133–152. It does not bind the same capability labels in docs/API_CONTRACT.md. For example, docs/API_CONTRACT.md currently marks POST /api/etl/jobs/{job_record_id}/cancellation and CANCELLED as active_pr, but a future change could relabel that API or state as implemented_on_develop while leaving its traceability row unchanged. Both documentation tests would still pass. Add assertions for the API contract’s active_pr cancellation and CANCELLED content. Add assertions for the protected durable intake/status API as implemented_on_develop as well.

The previous LICENSE finding does not apply to this head. README.md now removes the invalid link. The directory link to docs/connectors/ resolves. The revised status assertions correctly bind the traceability rows for cancellation, Resource Server JWT, gateway placeholder, and canonical CDC.

Protected-base source supports the documented ETL, idempotency, feature-gated durable intake, CDC, and valid_token gateway claims. I did not use synthetic-merge evidence as literal-head proof.

You are interacting with an AI system.

@seonghobae seonghobae added the documentation Improvements or additions to documentation label Sep 2, 2026 — with ChatGPT Codex Connector

Copy link
Copy Markdown
Collaborator Author

Extended this existing canonical public-surface writer rather than opening a competing README/Pages PR: added docs/index.md at commit a1dfca16a260e6f605d099499a064d7ddb330042 as a Pages-ready product landing. It carries the exact ContextualWisdomLab/mightyETL Ask DeepWiki target, product responsibility, durable links to README/PRD/TRD/Architecture/API/Security/Operability/Traceability, protected-develop truth boundary, and release/onboarding guidance. The file explicitly does not claim GitHub Pages is enabled or published. All predecessor exact-head checks/reviews are stale after this source commit; re-read the current branch head and acquire fresh ordinary governance evidence before integration.

Copy link
Copy Markdown
Collaborator Author

Canonical documentation handoff: stock-data capability is implemented as a path-disjoint candidate in #333, head 06ccc7f688eef135ff13bf105076f62f2879abfd, based on protected develop@e550688c80f0dcf4677c0fbe50bd3341429106fb.

I inspected this PR's changed-file inventory before writing: none of #333's 14 new paths replace your root README/AGENTS/CLAUDE/PRD/TRD/ARCHITECTURE/CHANGELOG or numbered ADRs. Please integrate the effective feature delta, not a whole-file overwrite, from docs/changes/stock_data_source.md, docs/adr/stock_data_source_boundary.md, docs/stock_data/stock_source_specification.md and docs/product-technical-gap-baseline.md when the canonical stack adopts the feature. The semantic ADR filename deliberately avoids a competing numbered allocation.

Actual capability: Java provider/host ACL for bounded FSC daily-stock queries, exact typed values, complete-result pagination validation and raw-page SHA-256 evidence. No new numerical/security runtime, unrestricted HTTP client, SQL write, live provider verification or release. EgressWeave #246 owns the missing released cross-language transport; the primary wire-guide and approved-key retrieval remain required. Keep this as Proposed/open-PR capability until verified integration.

Fresh hosted run 34115900752 passed the existing Java 25 reactor on Ubuntu/Windows/macOS; the Ubuntu log explicitly runs the new stock JUnit contract and the six-module reactor succeeds on test-merge 007885892690be5ed7c5eeb0097eaf2b13a98b07. Local focused checks are 245 assertions plus warning-free javac/Javadoc. Stock-specific 100% coverage is not measured; existing scoped JaCoCo success is not stock coverage. The current verification comment on #333 records remaining checks/gates. No existing PR was closed, force-pushed or stripped of delta.

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

Labels

documentation Improvements or additions to documentation priority: medium Normal-priority or P2 work scope: commercial-readiness Production, enterprise, release, or commercial readiness status: draft Draft pull request type: docs Documentation, ADR, PRD, or technical writing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant