Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
181 commits
Select commit Hold shift + click to select a range
5261356
security: rebuild audit pseudonymization on current main
seonghobae Aug 5, 2026
28966e6
test(security): require strong policy override keys
seonghobae Aug 5, 2026
2e9c4a2
fix(security): reject weak policy override keys
seonghobae Aug 5, 2026
ac70dd7
docs(security): document policy override key strength
seonghobae Aug 5, 2026
27106a5
fix: trigger CI due to strix timeout
seonghobae Aug 5, 2026
b3ad882
chore: remove stray CI trigger script
seonghobae Aug 5, 2026
0e7770b
test: cover disabled policy signing startup path
seonghobae Aug 5, 2026
a86ab46
docs: consolidate unreleased changelog entries
seonghobae Aug 5, 2026
eb34323
build: enforce zero missed production lines and branches
seonghobae Aug 5, 2026
164aecf
ci: verify exact PR head with coverage gates
seonghobae Aug 5, 2026
294b30b
ci: fuzz the exact pull request head
seonghobae Aug 5, 2026
febb3fd
docs: record exact-head and coverage gates
seonghobae Aug 5, 2026
9cf1ff8
test: add shared security provider fixture
seonghobae Aug 5, 2026
3214bc0
test: cover null policy secret normalization
seonghobae Aug 5, 2026
62dac96
test: cover tenant delete fail-closed branches
seonghobae Aug 5, 2026
0416068
test: cover validation security edge cases
seonghobae Aug 5, 2026
6b61330
test: cover conversion filename boundary
seonghobae Aug 5, 2026
70f3399
test: cover artifact deletion failure
seonghobae Aug 5, 2026
d73571b
test: cover repository delete edge cases
seonghobae Aug 5, 2026
36254ee
test: cover exception log sanitization
seonghobae Aug 5, 2026
a1533de
test: cover download filename and digest edges
seonghobae Aug 5, 2026
31c4b4d
fix: redact rejected parameter values
seonghobae Aug 5, 2026
c0c0c45
docs: record rejected-value redaction
seonghobae Aug 5, 2026
a308f0f
test: cover every override header separator
seonghobae Aug 5, 2026
39dc005
refactor: trust normalized policy secret contract
seonghobae Aug 5, 2026
6e311ed
refactor: remove unreachable blank filename branch
seonghobae Aug 5, 2026
8ca8958
fix(ci): isolate exact-head evidence finalization runs
seonghobae Aug 5, 2026
61ab219
fix(ci): use repository-native evidence verifier
seonghobae Aug 5, 2026
2831bb9
docs(evidence): ingest verified Netty 4.1.136 evidence
github-actions[bot] Aug 5, 2026
fa1659a
fix(security): restore reviewed Netty 4.1.136 remediation
seonghobae Aug 5, 2026
6d9a3d7
test(evidence): verify complete Netty SBOM graph coherence
seonghobae Aug 5, 2026
20513e3
docs(security): record deterministic Netty SBOM provenance
seonghobae Aug 5, 2026
67cd42c
docs(evidence): correct CycloneDX generation contract
seonghobae Aug 5, 2026
06452c3
docs(changelog): record deterministic Netty buyer evidence
seonghobae Aug 5, 2026
1907593
test(security): require auditable policy overrides
seonghobae Aug 5, 2026
0189136
fix(security): fail closed without override audit key
seonghobae Aug 5, 2026
c57af8b
docs(security): require auditable override startup
seonghobae Aug 5, 2026
5073573
docs(changelog): record auditable override gate
seonghobae Aug 5, 2026
ff10462
test(security): require standalone override auditability
seonghobae Aug 5, 2026
f08d789
refactor(security): expose reusable override key validation
seonghobae Aug 5, 2026
9c33db4
fix(security): enforce override auditability in standalone service
seonghobae Aug 5, 2026
10bfb26
test(fuzz): use separated override audit keys
seonghobae Aug 5, 2026
162166a
test(web): use separated override audit keys
seonghobae Aug 5, 2026
967fe25
test(service): use separated override audit keys
seonghobae Aug 5, 2026
92ce1c6
test(audit): reject unauditable policy signing
seonghobae Aug 5, 2026
422c465
docs(security): cover standalone override validation
seonghobae Aug 5, 2026
cacd637
docs(changelog): record standalone override guard
seonghobae Aug 5, 2026
08b14b7
test(build): require warning-free public Javadocs
seonghobae Aug 5, 2026
f86581f
build(docs): gate warning-free public Javadocs
seonghobae Aug 5, 2026
c0d2c7b
docs(api): explain tenant context claims
seonghobae Aug 5, 2026
21bbc79
docs(api): explain conversion status payload
seonghobae Aug 5, 2026
648e71b
docs(api): explain admin job list payload
seonghobae Aug 5, 2026
f454056
docs(api): explain conversion acceptance payload
seonghobae Aug 5, 2026
8d3d180
docs(api): explain viewer bootstrap payload
seonghobae Aug 5, 2026
f96d7d4
docs(api): explain error response envelope
seonghobae Aug 5, 2026
4b1f65d
docs(api): complete public Javadocs
seonghobae Aug 5, 2026
e08e0e0
docs(api): finish warning-free Javadoc surface
seonghobae Aug 5, 2026
ecbc0a9
docs(changelog): record executable Javadoc gate
seonghobae Aug 5, 2026
fcc77fd
docs(agents): make verify and Javadocs authoritative
seonghobae Aug 5, 2026
58c9cff
docs(acceptance): make verify evidence authoritative
seonghobae Aug 5, 2026
bf7083d
docs(governance): use current sibling repository names
seonghobae Aug 5, 2026
91091dd
perf(io): remove filesystem TOCTOU prechecks
seonghobae Aug 5, 2026
dca468e
test(ci): require non-skipped Maven report acceptance
seonghobae Aug 5, 2026
231ce19
feat(ci): fail on skipped or empty Maven reports
seonghobae Aug 5, 2026
1e3d6f6
fix(ci): reject skipped or empty Maven test reports
seonghobae Aug 5, 2026
040909f
docs(ci): require zero-skipped Maven report evidence
seonghobae Aug 5, 2026
6ee5c40
docs(changelog): record zero-skipped CI gate
seonghobae Aug 5, 2026
b34b931
test(ci): require bounded entity-free XML reports
seonghobae Aug 5, 2026
eeee286
fix(ci): bound and sanitize Maven XML evidence
seonghobae Aug 5, 2026
fa25f04
docs(ci): define bounded XML report parsing
seonghobae Aug 5, 2026
9a83d0f
docs(changelog): record safe Maven report parsing
seonghobae Aug 5, 2026
7b6f60a
fix(ci): eliminate report size-check race
seonghobae Aug 5, 2026
98870b0
test(ci): reject encoded XML declaration bypasses
seonghobae Aug 5, 2026
72b30b6
fix(ci): enforce UTF-8 Maven report evidence
seonghobae Aug 5, 2026
08b31c1
docs(ci): require UTF-8 Maven XML evidence
seonghobae Aug 5, 2026
95b046a
docs(changelog): record encoded XML rejection
seonghobae Aug 5, 2026
a93127b
test(ci): reject failing Maven report evidence
seonghobae Aug 5, 2026
5d1040e
fix(ci): reject failing Maven report evidence
seonghobae Aug 5, 2026
fff6161
docs(ci): reject contradictory Maven outcomes
seonghobae Aug 5, 2026
3c9bea3
docs(changelog): record report outcome checks
seonghobae Aug 5, 2026
d089e6b
test(ci): assert singular Maven outcome diagnostics
seonghobae Aug 5, 2026
e3104fc
test: require complete Maven report counts
seonghobae Aug 5, 2026
260d98f
fix: reject incomplete Maven report counts
seonghobae Aug 5, 2026
6e7e864
docs: record fail-closed report attributes
seonghobae Aug 5, 2026
2656321
docs: define complete Maven report evidence
seonghobae Aug 5, 2026
67b50dc
test(security): reproduce cross-tenant download IDOR
seonghobae Aug 6, 2026
3d3893a
fix(security): enforce tenant ownership on direct downloads
seonghobae Aug 6, 2026
5039007
test(security): authenticate direct download behavior tests
seonghobae Aug 6, 2026
308209e
docs(security): record tenant-scoped download contract
seonghobae Aug 6, 2026
12aba23
docs(security): define direct download tenant boundary
seonghobae Aug 6, 2026
622e62d
test(security): require dedicated artifact read permission
seonghobae Aug 6, 2026
26232b8
feat(security): add dedicated artifact read permission
seonghobae Aug 6, 2026
dba23ff
fix(security): enforce artifact-specific download scope
seonghobae Aug 6, 2026
c1eb255
docs(security): record artifact-specific download scope
seonghobae Aug 6, 2026
1e34497
docs(security): separate job metadata from artifact bytes
seonghobae Aug 6, 2026
2ff43fc
test(security): authenticate direct download fixtures with artifact s…
seonghobae Aug 6, 2026
090984d
fix(security): rebuild tenant administration on current download-secu…
seonghobae Aug 6, 2026
9a85fc6
test(security): require fail-closed tenant content lookup
seonghobae Aug 6, 2026
8df2faf
fix(security): reject missing tenant in scoped hash lookup
seonghobae Aug 6, 2026
3e98e6f
docs(changelog): record fail-closed tenant hash lookup
seonghobae Aug 6, 2026
d57f1aa
test(security): require explicit tenant for scoped content lookup
seonghobae Aug 6, 2026
f1cab8b
test(security): reject missing tenant lifecycle event queries
seonghobae Aug 6, 2026
8d7fde3
fix(security): fail closed for missing lifecycle-event tenant
seonghobae Aug 6, 2026
3ba53ac
refactor(repository): minimize tenant isolation patch
seonghobae Aug 6, 2026
a6df06c
test(ci): require full verification on stacked pull requests
seonghobae Aug 6, 2026
96a0966
test(lifecycle): define durable deletion receipt contracts
seonghobae Aug 6, 2026
c1239e2
fix(ci): verify stacked pull requests without weakening gates
seonghobae Aug 6, 2026
8c803da
feat(lifecycle): add immutable artifact-deletion receipt foundation
seonghobae Aug 6, 2026
31200cf
test(lifecycle): cover strict receipt replay branches
seonghobae Aug 6, 2026
3396c03
fix(lifecycle): preserve replay validation coverage
seonghobae Aug 6, 2026
2b4b5bb
test(ci): require full verification on stacked pull requests
seonghobae Aug 6, 2026
7d37bdc
fix(ci): verify exact heads on every PR base
seonghobae Aug 6, 2026
bac871a
feat(lifecycle): reconcile cleanup worker onto receipt foundation v2
seonghobae Aug 6, 2026
758de22
chore(stack): inherit all-PR CI from authoritative parent
seonghobae Aug 6, 2026
19fbfc4
chore(stack): remove duplicated parent CI contract
seonghobae Aug 6, 2026
0aec056
Merge bac871ab0f5c89237e7afdd9ad7f0cc7132a644f into 19fbfc4b938530ff7…
seonghobae Aug 6, 2026
7ae97af
test(lifecycle): align receipt assertions with integrated contract
seonghobae Aug 6, 2026
b08fde8
test(security): preserve fail-closed tenant delete default
seonghobae Aug 6, 2026
7483078
test(security): assert scoped delete default performs no read
seonghobae Aug 6, 2026
5f7df14
test(lifecycle): make write-failure fixture restart-valid
seonghobae Aug 6, 2026
558dcbf
test(coverage): exercise fail-closed tenant listing default
seonghobae Aug 6, 2026
00d8a94
test(lifecycle): cover fail-closed replay branch matrix
seonghobae Aug 6, 2026
2173a0e
test(lifecycle): cover failure state without attempt evidence
seonghobae Aug 6, 2026
4a831ad
test(lifecycle): cover checksum-only receipt conflict
seonghobae Aug 6, 2026
4dd0c70
test(lifecycle): close remaining replay switch branches
seonghobae Aug 6, 2026
a37c9c5
test(lifecycle): close remaining failed-receipt branches
seonghobae Aug 6, 2026
0739a04
test(lifecycle): cover completed receipt failure evidence
seonghobae Aug 6, 2026
6daff79
test(lifecycle): require stable cleanup failure code
seonghobae Aug 6, 2026
f39a677
test(lifecycle): close deletion replay coverage gaps
seonghobae Aug 6, 2026
2e8e5ad
docs(repository): document process-local constructor
seonghobae Aug 6, 2026
9738436
fix(ci): preserve exact-head checks for stacked pull requests
seonghobae Aug 6, 2026
4936743
test(ci): lock stacked pull-request coverage contract
seonghobae Aug 6, 2026
1315788
chore(stack): reconcile #268 with #270
seonghobae Aug 6, 2026
ed38632
test(ci): support standard script discovery
seonghobae Aug 6, 2026
7a52277
Merge ed3863209109cd24a3cf1f1d6bdcd51db16fbef1 into 13157889cb2fa8a6d…
seonghobae Aug 6, 2026
633faec
test(lifecycle): require durable recovery after initial artifact read…
seonghobae Aug 6, 2026
3752ba7
fix(lifecycle): model durable pre-snapshot deletion receipts
seonghobae Aug 6, 2026
4997377
fix(lifecycle): persist exact artifact snapshot before tombstone
seonghobae Aug 6, 2026
4614e19
test(security): require durable initial artifact-read recovery
seonghobae Aug 6, 2026
b24b6d7
fix(lifecycle): durably record artifact snapshot capture
seonghobae Aug 6, 2026
5d0e6f1
fix(lifecycle): persist deletion intent before initial artifact read
seonghobae Aug 6, 2026
4b32c21
fix(security): persist artifact snapshot lifecycle states
seonghobae Aug 6, 2026
fe34d3d
fix(build): align lifecycle enum with durable pre-snapshot marker state
seonghobae Aug 6, 2026
cd93d9f
test(security): remove duplicate initial-read recovery regression
seonghobae Aug 6, 2026
7689d64
test(security): expect durable receipt before initial artifact read
seonghobae Aug 6, 2026
cee2002
docs(security): document durable pre-snapshot deletion evidence
seonghobae Aug 6, 2026
707382b
docs(operations): add pre-snapshot receipt recovery runbook
seonghobae Aug 6, 2026
a760648
docs(changelog): record durable initial artifact-read recovery
seonghobae Aug 6, 2026
da3269c
test(docs): define durable cleanup documentation contract
seonghobae Aug 7, 2026
0b43710
docs(agents): describe integrated durable cleanup boundary
seonghobae Aug 7, 2026
e0bc9df
docs(security): align authorization decision with durable cleanup
seonghobae Aug 7, 2026
1356e5d
docs(deployment): document durable cleanup operation and limits
seonghobae Aug 7, 2026
98a8589
test(docs): make cleanup claims formatting-independent
seonghobae Aug 7, 2026
4529a5d
test(docs): verify recovery semantics instead of wording
seonghobae Aug 7, 2026
6e2235f
test(lifecycle): cover receipt tenant conflict through public API
seonghobae Aug 7, 2026
afb492e
test(lifecycle): align replay branch coverage with checksum capture
seonghobae Aug 7, 2026
b772efd
test(lifecycle): accept durable checksum capture evidence
seonghobae Aug 7, 2026
bddd753
test(lifecycle): cover unavailable digest fail-closed path
seonghobae Aug 7, 2026
9d26f9c
test(lifecycle): cover checksum state invariants
seonghobae Aug 7, 2026
31fc206
test(lifecycle): cover checksum replay and defensive ledger branches
seonghobae Aug 7, 2026
98e63bc
test(lifecycle): cover digest provider loss after receipt acceptance
seonghobae Aug 7, 2026
e510d3c
test(lifecycle): align ledger conflict evidence with production contract
seonghobae Aug 7, 2026
68f2bab
test(lifecycle): align transition evidence with stable contract
seonghobae Aug 7, 2026
819ddf2
test(lifecycle): prevent bounded recovery starvation
seonghobae Aug 7, 2026
245957e
fix(lifecycle): rotate bounded deletion recovery fairly
seonghobae Aug 7, 2026
80aec07
docs(changelog): record fair bounded deletion recovery
seonghobae Aug 7, 2026
936d7b0
docs(security): define bounded recovery fairness
seonghobae Aug 7, 2026
fbf2cba
docs(changelog): restore trailing newline after fairness entry
seonghobae Aug 7, 2026
39ee692
test(lifecycle): require restart-durable recovery fairness
seonghobae Aug 7, 2026
7a61895
fix(lifecycle): persist snapshot retry evidence
seonghobae Aug 7, 2026
64bec20
feat(lifecycle): persist pre-snapshot retry evidence
seonghobae Aug 7, 2026
12a6e21
feat(lifecycle): replay durable snapshot failures fairly
seonghobae Aug 7, 2026
9f8c51e
feat(lifecycle): make bounded recovery fair across restart
seonghobae Aug 7, 2026
3f6ffb0
test(lifecycle): align replay evidence with snapshot retries
seonghobae Aug 7, 2026
2df4b45
test(lifecycle): cover durable snapshot-failure replay
seonghobae Aug 7, 2026
b5a57d3
test(lifecycle): cover snapshot failure persistence and replay
seonghobae Aug 7, 2026
7d17391
docs(operations): explain durable restart-fair cleanup ordering
seonghobae Aug 7, 2026
4d31bda
docs(changelog): record durable restart-fair recovery
seonghobae Aug 7, 2026
1e3ae68
test(lifecycle): close durable recovery coverage gaps
seonghobae Aug 7, 2026
d721006
test(privacy): reject exception-selected deletion log details
seonghobae Aug 7, 2026
8d3fa3d
fix(privacy): remove exception classes from deletion warnings
seonghobae Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 82 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# Every pull request target, including immutable stack branches, receives the
# same exact-head, synthetic-merge, and buyer-readiness acceptance evidence.
pull_request: {}

permissions:
contents: read
Expand All @@ -17,14 +18,86 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Verify exact checked-out revision
env:
EXPECTED_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: test "$(git rev-parse HEAD)" = "$EXPECTED_SHA"
- name: Use preinstalled Temurin JDK 21
# Uses the runner image's bundled JDK instead of actions/setup-java to
# keep every workflow dependency hash-pinned (Scorecard Pinned-Dependencies).
run: |
echo "JAVA_HOME=$JAVA_HOME_21_X64" >> "$GITHUB_ENV"
echo "$JAVA_HOME_21_X64/bin" >> "$GITHUB_PATH"
- name: Run tests
run: mvn -B --no-transfer-progress test
- name: Run tests and coverage acceptance gates
shell: bash
run: |
if ! mvn -B --no-transfer-progress verify; then
if [[ -f target/site/jacoco/jacoco.csv ]]; then
echo "::group::JaCoCo CSV diagnostics"
cat target/site/jacoco/jacoco.csv
echo "::endgroup::"
fi
if [[ -f target/site/jacoco/jacoco.xml ]]; then
echo "::group::JaCoCo uncovered line diagnostics"
python3 - <<'PY'
import xml.etree.ElementTree as ET
from pathlib import Path

report = Path("target/site/jacoco/jacoco.xml")
root = ET.parse(report).getroot()
gaps = []
for package in root.findall("package"):
package_name = package.get("name", "")
for source_file in package.findall("sourcefile"):
source_name = source_file.get("name", "")
source_path = f"{package_name}/{source_name}" if package_name else source_name
for line in source_file.findall("line"):
missed_instructions = int(line.get("mi", "0"))
missed_branches = int(line.get("mb", "0"))
if missed_instructions or missed_branches:
gaps.append(
(
source_path,
int(line.get("nr", "0")),
missed_instructions,
missed_branches,
)
)

for source_path, line_number, missed_instructions, missed_branches in gaps:
print(
f"{source_path}:{line_number}: "
f"missed_instructions={missed_instructions} "
f"missed_branches={missed_branches}"
)
PY
echo "::endgroup::"
fi
exit 1
fi
python3 scripts/verify_maven_test_reports.py

merge-compatibility:
name: Maven merge compatibility
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Verify merge revision
env:
EXPECTED_SHA: ${{ github.sha }}
run: test "$(git rev-parse HEAD)" = "$EXPECTED_SHA"
- name: Use preinstalled Temurin JDK 21
run: |
echo "JAVA_HOME=$JAVA_HOME_21_X64" >> "$GITHUB_ENV"
echo "$JAVA_HOME_21_X64/bin" >> "$GITHUB_PATH"
- name: Verify merged result
run: |
mvn -B --no-transfer-progress verify
python3 scripts/verify_maven_test_reports.py

script-checks:
name: Buyer-readiness script tests
Expand All @@ -33,6 +106,11 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Verify exact checked-out revision
env:
EXPECTED_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: test "$(git rev-parse HEAD)" = "$EXPECTED_SHA"
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ jobs:
- TenantClaimsFuzzTest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}

- name: Verify exact checked-out revision
env:
EXPECTED_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: test "$(git rev-parse HEAD)" = "$EXPECTED_SHA"

- name: Set up JDK 21
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961
Expand Down
71 changes: 51 additions & 20 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,19 @@ including mandatory quality and security merge gates.

## Mandatory merge gates

- `mvn -DskipTests compile` must pass with warning/deprecated budget = 0.
- `mvn test` must pass.
- JaCoCo coverage for production package must remain 100% line/branch.
- JavaDoc gate must pass (`mvn -q -DskipTests javadoc:javadoc`) with no warnings/errors.
- `mvn -B --no-transfer-progress verify` is the authoritative local and CI
acceptance command. Do not substitute `compile`, `test`, or a predecessor
head result for this exact-head lifecycle.
- Java 21 compilation must pass with warning and deprecation budget = 0.
- Every test must pass with zero failures, errors, and skips.
- JaCoCo coverage for the `com.clearfolio.viewer.*` production package must
remain 100% statement/line and branch coverage, expressed as zero missed
production lines and branches.
- The verify lifecycle must generate public Javadocs with Maven Javadoc Plugin
3.12.0, `doclint=all`, `failOnError=true`, and `failOnWarnings=true`. Public
record components, constructors, methods, enum values, fields, parameters,
return values, and thrown failures must be understandable without reading the
implementation.
- Markdown lint for changed docs must pass.
- Security evidence must be attached on PR (SAST/code-scanning checks).
- CodeQL Java/Kotlin analysis must remain enabled through repository default
Expand All @@ -31,10 +40,15 @@ including mandatory quality and security merge gates.
`python3 scripts/summarize_buyer_readiness.py --manifest docs/diligence/2026-07-03-buyer-data-room-manifest.json --output docs/diligence/2026-07-03-buyer-readiness-scorecard.md --summary docs/qa/evidence/2026-07-02-krw2b-sale-readiness/buyer-readiness-scorecard-summary.json --check`.
- Figma Slides generation payload check must pass:
`python3 scripts/check_figma_deck_payload.py --payload docs/design/2026-07-03-buyer-diligence-slides-generation-payload.json --summary docs/qa/evidence/2026-07-02-krw2b-sale-readiness/figma-deck-payload-check.json`.
- `mvn test` includes `DependencyPolicyTest`, which prevents reintroducing the
broad `tika-parsers-standard-package`, default Logback starter, or excluded
Jakarta annotation dependency unless a future PR updates the license policy,
SBOM evidence, attribution package, and buyer diligence docs together.
- `mvn verify` includes `DependencyPolicyTest`, which prevents reintroducing the
broad `tika-parsers-standard-package`, default Logback starter, excluded
Jakarta annotation dependency, an unreviewed Netty version, or a weakened
public-Javadoc gate unless a future PR updates the corresponding security,
license, SBOM, attribution, acceptance, and buyer-diligence evidence together.
- CI, Security Scan, SAST Semgrep, every fuzz target, required organization
reviews, and branch protection must all pass on the exact current PR head.
Queued, pending, cancelled, skipped-required, stale-head, or predecessor-head
evidence is not passing.

## Change management rule

Expand All @@ -58,7 +72,7 @@ Codex, Cursor, opencode, …) working in this repo.
then **remediate**:
- This is a Maven / Spring Boot app — findings are almost always vulnerable
Java dependencies. Fix by bumping the offending artifact (or its managed
version) in `pom.xml`; re-run `mvn -DskipTests compile` and `mvn test`.
version) in `pom.xml`; re-run `mvn -B --no-transfer-progress verify`.
- There is currently no `Dockerfile` or k8s manifest here; if one is added,
trivy will also flag image/IaC misconfigs — fix those at the source.
- For a genuine false positive only, add a narrow, **documented**
Expand All @@ -82,15 +96,32 @@ Codex, Cursor, opencode, …) working in this repo.
- Reference implementation: xtrmLLMBatchPython's pgcrypto-encrypted Postgres
credential registry (`get_credential(name)`). Reuse that pattern (a DB-backed
KV is fine) unless a dedicated KV is adopted.
- **This repo applies** — it is a Spring Boot service with real runtime secrets
(artifact-token HMAC secret, tenant-claims HMAC secret). **Known deviation to
migrate:** those secrets are currently injected straight from env via Spring
placeholders in `application-buyer-demo.yml`
(`clearfolio.artifact-token.secret: ${CLEARFOLIO_ARTIFACT_TOKEN_SECRET:}`,
`clearfolio.tenant-claims.hmac-secret: ${CLEARFOLIO_TENANT_CLAIMS_HMAC_SECRET:}`,
consumed by `ArtifactLinkService` / `TenantAccessService`). Move these to a
KV-backed lookup so env is only the bootstrap transport into the KV. New
secrets/credentials must go through the KV from the start, not new env reads.
- **This repo applies** — it is a Spring Boot service with real runtime secrets.
Tenant-claim and artifact-token HMAC secrets are loaded respectively as
`clearfolio.tenant-claims.hmac-secret` and
`clearfolio.artifact-token.secret` from the Spring config-tree credential
mount selected by the non-secret `CLEARFOLIO_SECRET_CONFIG_DIR` bootstrap
setting. Do not restore direct runtime environment binding for either key.
New secrets and credentials must enter through the mounted credential source,
not new process-environment reads.

### Durable cleanup boundary

- This slice integrates a single-process, receipt-first cleanup worker. It
forces deletion intent before the first artifact read, binds an exact digest
before metadata tombstoning, retries incomplete cleanup after startup and on
a bounded fixed-delay schedule, and exposes only low-cardinality aggregate
evidence. The filesystem-backed receipt ledger is restart-replayable; the
in-memory adapter remains available for standalone tests and ephemeral use.
- Do not overstate that reference boundary. It does not provide a cross-resource
transactional outbox, a distributed generation fence, or remote-object-store
atomicity across multiple service instances. Production adapters must provide
equivalent durable uniqueness, object-version preconditions, idempotent
retries, and operator recovery evidence before distributed cutover.
- Issue #263 remains the umbrella for the distributed adapter and later truthful
API/UI lifecycle work. Do not describe durable cleanup as absent, and do not
describe the current single-process implementation as a distributed deletion
transaction.

### Code exploration

Expand All @@ -108,11 +139,11 @@ Codex, Cursor, opencode, …) working in this repo.
DOM-decomposes emails and files into a persisted knowledge graph. Each
component is a standalone program that must ALSO work as a git submodule of
the hub, grown separately and together.
- Sibling components: **waf-ids-ai-soc** (WAF / IDS / AI SOC / LB / APIM),
- Sibling components: **wardnet** (WAF / IDS / AI SOC / LB / APIM),
**pg-erd-cloud** (ERD tool), **contextual-orchestrator** (LLM
cost/perf/upstream-LB gateway, beyond LiteLLM), **codec-carver** (STT /
omni-modal speech-video codec), **fast-mlsirm** (LLM-as-a-Judge calibration +
evaluation-item quality, using aFIPC FIPC + kaefa item-fit), **feelanet-adfs**
evaluation-item quality, using aFIPC FIPC + kaefa item-fit), **keyverse**
(passwordless SSO — OIDC/SCIM/ADFS/LDAP/FIDO2/OAuth2.1, eliminate passwords),
**newsdom-api** (PDF→DOM sidecar), and **semantic-data-portal** (upper
ontology / catalog / governance plane with its own graph engine).
Expand Down
Loading