Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
6052259
feat(core): add workload identity contract vocabulary (0.7.1b) (#402)
GionaGranchelli Sep 9, 2026
bd26bbd
feat(control-plane): add authoritative workload registration and stat…
GionaGranchelli Sep 10, 2026
045ebf7
fix(0.7.1c): enforce identity/metadata bounds in V8 migration
Sep 13, 2026
39f4c44
docs(0.7.1c): update module-card coverage table for the new control-p…
Sep 13, 2026
c700f93
fix(build-logic): stop the JUnit signature verifier rejecting legal m…
GionaGranchelli Sep 15, 2026
9d02ccc
fix(build-logic): record post-freeze published module in the descript…
GionaGranchelli Sep 15, 2026
9d33e0e
ci: run verifyJUnitTestSignatures in the quality lane (#410)
GionaGranchelli Sep 15, 2026
4a7549c
ci: calibrate the tests containment watchdog to 14 minutes (#413)
GionaGranchelli Sep 15, 2026
84c5472
fix(quality): accept the lock-guarded control-plane store as a scoped…
GionaGranchelli Sep 15, 2026
e8ad713
feat(build): bind API compatibility to release semantics, not byte-id…
GionaGranchelli Sep 15, 2026
ecadc4b
0.7.1d: governed run attribution & identity continuity (#407)
GionaGranchelli Sep 15, 2026
e03167f
docs(0.7.1e): specify the control-plane authority contract (#417)
GionaGranchelli Sep 15, 2026
99b2b63
fix(build): recognize multi-generation API migration history (#419)
GionaGranchelli Sep 16, 2026
1a45d46
feat(0.7.1e): control-plane authority contract — public ports + HTTP …
GionaGranchelli Sep 16, 2026
08a7874
fix(release-closure): derive the example guide's release instead of p…
GionaGranchelli Sep 16, 2026
7d610e8
ci(tests): make the test watchdog progress-aware and give it real hea…
GionaGranchelli Sep 16, 2026
5ffc4a7
fix(formatting): make the KtLint max-line-length policy take effect (…
GionaGranchelli Sep 17, 2026
992f25a
docs(0.7.1d1): freeze the governed approval identity carriage model (…
Sep 16, 2026
eb860d1
feat(0.7.1d1): reserved approval attribution codec (P1 of #418)
Sep 16, 2026
2b0ace4
feat(0.7.1d1): governed approval attribution on the durable approval …
Sep 16, 2026
a8c6131
feat(0.7.1d1): governed approval attribution on the file-backed store…
Sep 16, 2026
e1dc31e
fix(0.7.1d1): use the Testcontainers 2.x PostgreSQL API in the new ap…
Sep 16, 2026
7fe2bf2
test(0.7.1d1): consolidate the governed JDBC approval tests onto one …
Sep 16, 2026
cb09fb3
feat(0.7.1d1): governed identity carriage through the preview approva…
Sep 17, 2026
844123f
feat(0.7.1d1): governed transaction mutation store (P3, ops half) [fo…
Sep 18, 2026
00954b0
fix(0.7.1d1): validate every governed run-id carrier before the trans…
Sep 18, 2026
e5d82bd
wip(0.7.1d1): formatter sweep on the governed mutation store tests [g…
Sep 18, 2026
e320a17
fix(0.7.1d1): repair the recursively broken assertThatSuspendCallThro…
Sep 19, 2026
d03a12b
refactor(0.7.1d1): expose governed mutation by composition, extract t…
Sep 19, 2026
6faa613
refactor(0.7.1d1): extract the PK-race recovery, clearing NestedBlock…
Sep 19, 2026
b21cbe0
test(0.7.1d1): split the governed suite into its own class, with its …
Sep 19, 2026
d15a15a
fix(0.7.1d1): correct the collapsed helper asserts in the legacy test…
Sep 19, 2026
b76e0d2
wip(0.7.1d1): ktlint green on the legacy test file [detekt regression…
Sep 19, 2026
6484072
fix(0.7.1d1): clear every detekt finding but LargeClass, and both rem…
Sep 19, 2026
630c7e0
refactor(0.7.1d1): split the governed suite's continuity surface into…
Sep 19, 2026
2424d21
refactor(0.7.1d1): split the legacy suite's rollback/rejection tests …
Sep 20, 2026
a84cafd
test(0.7.1d1): drop the unused identity() helper from the rejection s…
Sep 20, 2026
40f0b38
docs(0.7.1d1): name the canonical suspension as the run-id authority …
Sep 20, 2026
f1ee4dc
fix(build-logic): derive the example-guide release from the promoted …
GionaGranchelli Sep 20, 2026
41ac915
ci(quality): recognise cancellation preservation across sibling catch…
GionaGranchelli Sep 21, 2026
6e893f2
Merge remote-tracking branch 'origin/master' into epic/0.7.1-control-…
Sep 21, 2026
51361d9
Merge remote-tracking branch 'origin/epic/0.7.1-control-plane-authori…
Sep 21, 2026
300fc74
fix(jdbc): preserve cancellation through approval mutation cleanup
Sep 22, 2026
54d1069
chore(api): land the committed API dumps and realign the 0.7.0 migrat…
Sep 22, 2026
89fc14e
fix(api): target the migration entries at the PR base, not origin/master
Sep 22, 2026
e4c186a
feat(sovereign-ops): carry governed identity through the transactiona…
Sep 22, 2026
f6ba719
test(sovereign-ops): migrate the wiring discriminator to Testcontaine…
Sep 22, 2026
f2650e0
Merge pull request #423 from GionaGranchelli/task/418-governed-approv…
GionaGranchelli Sep 22, 2026
fc77b67
feat(0.7.1f): establish safe control-plane exposure model (#428)
GionaGranchelli Sep 23, 2026
0f36ab8
fix(quality): fail closed on incomplete mutation measurement (#429)
GionaGranchelli Sep 24, 2026
6ac4c8e
fix(test): bound and fail-loud MCP test server teardown (#432)
GionaGranchelli Sep 24, 2026
feae94f
fix(build-logic): repair stale docs/quality fixtures and wire the sna…
GionaGranchelli Sep 24, 2026
e38ce9f
docs(0.7.1g1a): canonical mutation population drift audit (#430)
GionaGranchelli Sep 24, 2026
5c5de97
docs(0.7.1g1b): M06 evolution preflight — authority evolution blocked…
GionaGranchelli Sep 24, 2026
5a71dca
docs(0.7.1g1c): M06 TIMED_OUT debt triage — 43 of 43 explained as one…
GionaGranchelli Sep 25, 2026
607e0f0
docs(0.7.1g1d): sentinel liveness kill proof — control group disprove…
GionaGranchelli Sep 25, 2026
8c30d7d
docs(0.7.1g1e): TIMED_OUT tool-limitation adjudication — 43/43 eligib…
GionaGranchelli Sep 25, 2026
4fda493
feat(0.7.1g1f): base classification enrollment ceremony (M22-M29) (#437)
GionaGranchelli Sep 25, 2026
0693662
ci(0.7.1g1f): re-measure the policy-maintainability pin (305 -> 364) …
GionaGranchelli Sep 25, 2026
0477700
docs(quality): TASK-0.7.1g1G0 candidate-only population admission pre…
GionaGranchelli Sep 25, 2026
66cb3c1
test(0.7.1): make the drain count assertion deterministic (#441)
GionaGranchelli Sep 25, 2026
305f1f8
test(0.7.1g1g1a): contract tests for RuntimeEvidenceContractValidator…
GionaGranchelli Sep 25, 2026
5647f20
docs(0.7.1i): record integration closure / master promotion authority…
GionaGranchelli Sep 25, 2026
92b306e
test(0.7.1g1g1b): assert 8 of the 10 weak-assertion mutation gaps in …
GionaGranchelli Sep 25, 2026
02e1fcc
test(0.7.1g1g1c): assert the positive-timeout contract for a renewed …
GionaGranchelli Sep 26, 2026
0aedf0a
docs(0.7.1g1): record the mutation-debt taxonomy and remediation boun…
GionaGranchelli Sep 26, 2026
c568b9c
docs(0.7.1g1G1): record the suspension-capability verdict for the 46 …
GionaGranchelli Sep 26, 2026
35d5bcd
docs(0.7.1g1G2): adjudicate the residual mutation population at the f…
GionaGranchelli Sep 26, 2026
80d6847
feat(0.7.1g1G3): appearing population admission ceremony (M30-M39) (#…
GionaGranchelli Sep 27, 2026
7703685
0.7.1g1G4a: custody of the 118 undetermined identities, g1G2 erratum,…
GionaGranchelli Sep 27, 2026
e25bbe4
0.7.1g1G4b: DefaultApprovalGateway residual remediation (27 -> 4 unde…
GionaGranchelli Sep 27, 2026
1817469
0.7.1g1G4z: wire the population-admission ledger into the real ratche…
GionaGranchelli Sep 28, 2026
c2a04a0
docs: merge-authorization, authority-test hierarchy and pristine-base…
GionaGranchelli Sep 28, 2026
6d798f8
0.7.1g1G4z2: preserve the admission ledger's mutator order and prove …
GionaGranchelli Sep 28, 2026
19c3d93
0.7.1g1G4c: ApprovalResumeCoordinator residual remediation (#455)
GionaGranchelli Sep 28, 2026
36923ee
0.7.1g1G4d: ApprovalSuspensionCoordinator residual remediation (#456)
GionaGranchelli Sep 28, 2026
16f4cba
0.7.1g1G4e: final residual structural adjudication (#457)
GionaGranchelli Sep 29, 2026
3e32020
0.7.1g1G4f: resumed-frame failure attribution (#458)
GionaGranchelli Sep 29, 2026
18f10db
0.7.1g1G4g: withContext ordinary-failure delivery (#459)
GionaGranchelli Sep 29, 2026
19703cf
docs(0.7.1g1P1): STOP record — full canonical campaign, 68 candidate-…
GionaGranchelli Sep 29, 2026
aa0cc52
docs(0.7.1g1G5a): exact bytecode mechanism partition of the frozen 52…
GionaGranchelli Sep 29, 2026
42d9d94
docs(0.7.1g1G5b): adjudicate suspension-sentinel tooling limitation (…
GionaGranchelli Sep 30, 2026
cd46f17
docs(0.7.1g1G5c): close the SURVIVED cohort (1 KILLED, 11 EQUIVALENT)…
GionaGranchelli Sep 30, 2026
284faa4
docs(0.7.1g1G5d): close the final NO_COVERAGE cohort (4 UNREACHABLE) …
GionaGranchelli Sep 30, 2026
5bcb030
docs(0.7.1g1G6): freeze the final canonical population (#466)
GionaGranchelli Oct 1, 2026
689e8b6
feat(0.7.1g1P1): mint authority for the 67 admissible appearing ident…
GionaGranchelli Oct 1, 2026
ec8b4da
0.7.1g1P2: authority model reconciliation (design record, no implemen…
GionaGranchelli Oct 1, 2026
e6e0d69
feat(0.7.1g1P2-1): bind M34 to a canonical authority projection, not …
GionaGranchelli Oct 1, 2026
64d0545
feat(0.7.1g1P2-2): digest-migration certificate as a first-class auth…
GionaGranchelli Oct 1, 2026
9ebe7b4
authority(0.7.1g1P2-P1M): mint the base-side raw-v1 -> authority-v2 m…
GionaGranchelli Oct 2, 2026
d192e2e
authority(0.7.1g1P2-Step3a): establish certificate consumption as a p…
GionaGranchelli Oct 2, 2026
a2c6c3a
authority(0.7.1g1P2-Step3b): wire the canonical certificate ledger to…
GionaGranchelli Oct 2, 2026
c4d3c84
authority(0.7.1g1P2-Step3b): base-revision certificate read + M34 acc…
GionaGranchelli Oct 2, 2026
4960cc5
ci(0.7.1g1P2): authority-transport non-vacuity floor instead of a fro…
GionaGranchelli Oct 2, 2026
514f61a
authority(0.7.1g1P2-T7): pin the fresh-measurement authority context …
GionaGranchelli Oct 2, 2026
a1ce28c
authority(0.7.1g1P2-3c2): T3/T2/T8 mapped, T9 pinned to the chain it …
GionaGranchelli Oct 2, 2026
5dc10f2
docs(0.7.1g1P2-3c): close Step 3c with boundary-level transport assur…
GionaGranchelli Oct 2, 2026
3a0771d
docs(0.7.1h): content-freeze the Epic record against the merged imple…
GionaGranchelli Oct 2, 2026
a77bbf4
merge: reconcile release/0.7.0 into the 0.7.1 epic line
GionaGranchelli Oct 2, 2026
2ba0fe4
Merge pull request #481 from GionaGranchelli/task/0.7.1i-reconcile-re…
GionaGranchelli Oct 3, 2026
80cecf9
0.7.1i: bind API migrations to the release lineage (#482)
GionaGranchelli Oct 3, 2026
0f3e9d2
0.7.1i: carry an already-certified evidence population across the pro…
GionaGranchelli Oct 3, 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
1 change: 1 addition & 0 deletions .github/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ and related GitHub configuration.
| CI step | Local command |
|---------|---------------|
| Run tests | `./gradlew test` |
| Run tests (guarded, same guards as CI) | `bash .github/scripts/test-watchdog.sh` |
| Verify maintainability baseline | `./gradlew verifyMaintainabilityBaseline` |
| Full maintainability verification | `./gradlew verifyFullMaintainabilityBaseline` |
| Change policy check | `./gradlew verifyChangePolicy` |
Expand Down
71 changes: 71 additions & 0 deletions .github/scripts/test-watchdog.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/env bash
#
# Guarded test runner for the CI `tests` job.
#
# A hanging suite and a merely slow suite need different treatment, so this carries two independent
# guards:
#
# inactivity no observable progress for WATCHDOG_INACTIVITY_SECONDS -> a real stall, abort now
# ceiling wall-clock WATCHDOG_CEILING_SECONDS -> a growth margin, abort regardless of progress
#
# Progress is read from Gradle's own test-result tree, which advances as each test executes. Both
# guards dump worker threads first, so the uploaded artifact shows where the run stopped.
#
# Calibration consequence: the ceiling must sit comfortably above the suite's real runtime. If the
# suite grows into the ceiling, the guard silently becomes an assertion about suite duration rather
# than a hang detector, and healthy runs get aborted at random.
set -uo pipefail

CEILING_SECONDS="${WATCHDOG_CEILING_SECONDS:-1200}"
INACTIVITY_SECONDS="${WATCHDOG_INACTIVITY_SECONDS:-270}"
POLL_SECONDS="${WATCHDOG_POLL_SECONDS:-30}"
DUMP_DIR="${WATCHDOG_DUMP_DIR:-/tmp/threaddumps}"
RESULTS_ROOT="${WATCHDOG_RESULTS_ROOT:-.}"
COMMAND="${WATCHDOG_COMMAND:-./gradlew test}"

mkdir -p "$DUMP_DIR"

progress_fingerprint() {
find "$RESULTS_ROOT" -path '*/build/test-results/*' -type f -printf '%p %s %T@\n' 2>/dev/null |
sort | md5sum | cut -d' ' -f1
}

abort() {
echo "::error::$1"
for P in $(jps -l 2>/dev/null | grep -iE 'GradleWorkerMain|GradleDaemon' | awk '{print $1}'); do
jstack "$P" >"$DUMP_DIR/worker-$P-$(date +%H%M%S).txt" 2>&1 || true
done
kill "$CHILD_PID" 2>/dev/null || true
wait "$CHILD_PID" 2>/dev/null || true
exit 1
}

echo "watchdog: ceiling=${CEILING_SECONDS}s inactivity=${INACTIVITY_SECONDS}s poll=${POLL_SECONDS}s results=${RESULTS_ROOT}"

bash -c "exec ${COMMAND}" &
CHILD_PID=$!

started=$(date +%s)
last_progress=$started
fingerprint=$(progress_fingerprint)

while kill -0 "$CHILD_PID" 2>/dev/null; do
sleep "$POLL_SECONDS"
now=$(date +%s)
current=$(progress_fingerprint)
if [ "$current" != "$fingerprint" ]; then
fingerprint="$current"
last_progress="$now"
fi
idle=$((now - last_progress))
elapsed=$((now - started))
if [ "$idle" -ge "$INACTIVITY_SECONDS" ]; then
abort "Run tests made no progress for ${idle}s (limit ${INACTIVITY_SECONDS}s) — dumping threads and aborting"
fi
if [ "$elapsed" -ge "$CEILING_SECONDS" ]; then
abort "Run tests reached the ${CEILING_SECONDS}s wall-clock ceiling — dumping threads and aborting"
fi
done

wait "$CHILD_PID"
exit $?
84 changes: 84 additions & 0 deletions .github/workflows/architecture-authority.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Architecture Authority

# The API architecture authority (verify060Architecture) aggregates Contract-1 (committed dump vs
# source), Contract-2 (base-branch compatibility + stability policy) and the migration-registry
# hygiene rule. It ran in NO workflow at all, and in no verifyPr lane either, so release-line drift
# in the API/migration policy stayed invisible until someone ran it by hand — twice (0.7.1c and
# 0.7.1d), the second time as a permanent red that no PR could clear without deleting release
# history.
#
# It lives in its own workflow rather than in ci.yml because ci.yml is the JDK 25 production matrix
# (.github/AGENTS.md rule 6), while this gate is a build-logic authority documented against JDK 21.
# It lives outside maintainability-baseline.yml because that workflow triggers only for PRs against
# master, which would leave every epic-targeted slice — where this drift actually happens —
# unguarded.
#
# It invokes the single gate and its own base resolution; it does not re-implement the constituent
# checks.

on:
pull_request:
push:
branches:
- master

permissions:
contents: read

jobs:
api-architecture:
name: api-architecture (verify060Architecture)
runs-on: ubuntu-latest
timeout-minutes: 30

steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Contract-2 and the registry chain walk compare against base-branch dumps, so the base
# SHA must be resolvable from history.
fetch-depth: 0

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
# The gate consumes -PchangePolicyBase, which is configuration-time and untracked as a
# task input, so a cached result could belong to a different base SHA.
cache-read-only: true

- name: Resolve comparison base
id: base
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
BASE="${{ github.event.pull_request.base.sha }}"
else
BASE="${{ github.event.before }}"
fi
# A new branch push reports an all-zero (or empty) before-SHA; fall back to the pushed
# commit's parent so the gate still compares against something real.
case "$BASE" in
""|0000000000000000000000000000000000000000)
BASE="$(git rev-parse HEAD~1 2>/dev/null || git rev-parse HEAD)"
;;
esac
echo "sha=$BASE" >> "$GITHUB_OUTPUT"
echo "Comparing against base $BASE"

- name: Verify API architecture authority
run: |
./gradlew verify060Architecture --no-daemon \
-PchangePolicyBase="${{ steps.base.outputs.sha }}"

- name: Upload architecture report
if: always()
uses: actions/upload-artifact@v4
with:
name: api-architecture-report
path: build/reports/tramai/architecture/
retention-days: 30
58 changes: 35 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
gates: spotlessCheck verifyStaticAnalysis verifyStaticSafetyGuards
- name: hygiene
gates: verifyDependencyHygiene
- name: junit-test-signatures
gates: verifyJUnitTestSignatures

steps:
- name: Checkout
Expand Down Expand Up @@ -101,6 +103,16 @@ jobs:
- name: static-analysis
test-filter: "--tests 'dev.tramai.build.quality.StaticAnalysis*Test'"
expected: 25
# 0.7.1e: the API compatibility / migration-policy suites lived only in
# maintainability-baseline.yml, which triggers for PRs against master — so on every
# epic-targeted slice (where this policy actually drifts) they never ran. They are pure
# dump/policy logic, so they belong in this JDK 25 matrix like the other partitions.
- name: ci-wiring
test-filter: "--tests 'dev.tramai.build.quality.TestsWatchdogWiringTest'"
expected: 6
- name: api-compatibility
test-filter: "--tests 'dev.tramai.build.quality.ApiCompatibilityMutationTest' --tests 'dev.tramai.build.quality.ApiBaselineVerifierTest' --tests 'dev.tramai.build.quality.ApiStabilityPolicyTest'"
expected: 67

steps:
- name: Checkout
Expand Down Expand Up @@ -149,29 +161,14 @@ jobs:
uses: gradle/actions/setup-gradle@v4

- name: Run tests
timeout-minutes: 15
run: |
./gradlew test &
GRADLE_PID=$!
DUMP_DIR=/tmp/threaddumps
mkdir -p "$DUMP_DIR"
# Containment watchdog: if tests exceed ~12 min, dump worker threads and
# fail fast instead of letting a concurrency flake hold the pipeline
# hostage for the full timeout.
for i in $(seq 1 18); do
if ! kill -0 "$GRADLE_PID" 2>/dev/null; then break; fi
sleep 40
done
if kill -0 "$GRADLE_PID" 2>/dev/null; then
echo "::error::Run tests exceeded 12 minutes — dumping threads and aborting"
for P in $(jps -l 2>/dev/null | grep -iE 'GradleWorkerMain|GradleDaemon' | awk '{print $1}'); do
jstack "$P" > "$DUMP_DIR/worker-$P-$(date +%H%M%S).txt" 2>&1 || true
done
kill "$GRADLE_PID" 2>/dev/null || true
wait "$GRADLE_PID" 2>/dev/null || true
exit 1
fi
wait "$GRADLE_PID"
timeout-minutes: 25
env:
# Wall-clock ceiling: growth margin, not a hang signal. Healthy runs measure ~13-14 min,
# so 20 min absorbs suite growth while the inactivity guard below catches real stalls.
WATCHDOG_CEILING_SECONDS: "1200"
# No test-result progress for 4.5 min means the run is stalled, not slow.
WATCHDOG_INACTIVITY_SECONDS: "270"
run: bash ./.github/scripts/test-watchdog.sh

- name: Upload test hang thread dumps
if: always()
Expand Down Expand Up @@ -220,13 +217,28 @@ jobs:
run: |
./gradlew verifyMutationRatchet \
--no-daemon \
-PtramaiMutationEvolution=${{ contains(github.event.pull_request.labels.*.name, 'mutation-population-evolution') && 'recorded-evolution' || 'forbid' }} \
-PtramaiMutationBaseSha="${{ github.event.pull_request.base.sha }}"

- name: Verify mutation ratchet against previous master
if: github.event_name == 'push' && github.event.before != '0000000000000000000000000000000000000000'
# Evolution authority follows the transition, not the branch. A merge into master carries a
# mutation-population evolution only if it changed BOTH the committed population and the
# evolution records; anything else stays FORBID (fast, no PIT) so an ordinary push can never
# enter a ~50 minute campaign, and a removal without its records fails closed in FORBID.
# A legitimate evolution still has to survive the exact record-set check, which rejects
# records that do not match the identities disappearing in this transition.
run: |
CHANGED=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}")
EVOLUTION="forbid"
if echo "$CHANGED" | grep -qx 'config/quality/mutation-baseline.json' && \
echo "$CHANGED" | grep -qx 'config/quality/mutation-evolution.yml'; then
EVOLUTION="recorded-evolution"
fi
echo "mutation evolution mode: $EVOLUTION"
./gradlew verifyMutationRatchet \
--no-daemon \
-PtramaiMutationEvolution="$EVOLUTION" \
-PtramaiMutationBaseSha="${{ github.event.before }}"

consumer-smoke:
Expand Down
29 changes: 24 additions & 5 deletions .github/workflows/maintainability-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,25 @@ jobs:
# MutationRatchetAuthorityTest (7) = 257 -> 302.
# 10.3d: W4 mutation ratchet wiring discriminator + W5 CI workflow wiring discriminators in CoverageWiringTest = 248 -> 253.
# 12.3b (R12-003): Gradle 9 strict task dependency validation tests (+1 in policy-maintainability, +1 in scanners-coverage) = 302 -> 303, 253 -> 254.
# Counts: 8 + 71 + 75 + 25 (quality) + 174 + 303 + 254 = 910.
# 0.7.1e: ApiStabilityPolicyTest (24) enrolled in scanners-coverage = 254 -> 278. The suite was
# in no CI lane at all, so the release-line API-policy discriminators never ran in CI.
# Docs/version-surface repair: the example-selection guard derives the promoted release from
# CHANGELOG.md, so ExampleGuideReleaseAssertionTest (+3) enters release-sovereign = 174 -> 179.
# The same measurement certifies accumulated policy-maintainability drift = 303 -> 305
# (both reproduced with the exact filters below; 0 failures).
# 0.7.1g1F follow-up (split out of the ceremony PR by review, scope hygiene): the pin is corrected to
# a MEASURED value. Measured through this lane's own 13 filters (extracted from the matrix below, not
# approximated): 333 on the epic line before the ceremony suite, 364 with it (0 failures both times;
# 333 + 31 = 364 cross-checks the two runs). The pin had been stale at 305 for the whole epic line
# because this workflow only triggers for pull requests targeting master, so epic-targeted PRs never
# exercised it.
# NOTE: the other lanes' pins in this matrix were NOT re-measured and may carry the same epic-line
# drift. Re-derive them before this workflow next runs against master.
# #426: sibling-catch cancellation recognition adds 8 scanner tests, and the 83-line
# context-equivalence case is split into three single-scenario tests (1 removed, 3 added).
# MERGED: master's 264 scanner tests + the epic's ApiStabilityPolicyTest (24) and nine other
# lane additions = 297, measured through this lane's own 20 filters after merging master in.
# Counts: 8 + 71 + 75 + 25 (quality) + 179 + 364 + 297 = 1019.
build-logic-tests:
name: build-logic (${{ matrix.name }})
runs-on: ubuntu-latest
Expand Down Expand Up @@ -139,7 +157,7 @@ jobs:
--tests 'dev.tramai.build.publishing.*'
--tests 'dev.tramai.build.docs.*'
--tests 'dev.tramai.build.conventions.*'
expected: 174
expected: 179
- name: policy-maintainability
test-filter: >-
--tests 'dev.tramai.build.quality.ChangePolicy*Test'
Expand All @@ -155,12 +173,13 @@ jobs:
--tests 'dev.tramai.build.quality.DetektBaselineGrowthDriftTest'
--tests 'dev.tramai.build.quality.DependencyBaselineVerifierTest'
--tests 'dev.tramai.build.quality.DependencyEdgeNormalizerTest'
expected: 303
expected: 364
- name: scanners-coverage
test-filter: >-
--tests 'dev.tramai.build.quality.KotlinCancellationCatchScannerTest'
--tests 'dev.tramai.build.quality.ApiCompatibilityMutationTest'
--tests 'dev.tramai.build.quality.ApiBaselineVerifierTest'
--tests 'dev.tramai.build.quality.ApiStabilityPolicyTest'
--tests 'dev.tramai.build.quality.JUnitTestSignatureVerifierTest'
--tests 'dev.tramai.build.quality.CancellationDeltaComparatorTest'
--tests 'dev.tramai.build.quality.CoveragePolicyDeltaVerifierTest'
Expand All @@ -177,7 +196,7 @@ jobs:
--tests 'dev.tramai.build.quality.TestPerformanceVerifierTest'
--tests 'dev.tramai.build.quality.TestPerformanceAggregatorTest'
--tests 'dev.tramai.build.quality.ResolvedDependencyAggregateTest'
expected: 254
expected: 297

steps:
- name: Checkout
Expand Down Expand Up @@ -228,4 +247,4 @@ jobs:
name: build-logic-${{ matrix.name }}-test-reports
path: |
build-logic/build/test-results/test/
build-logic/build/reports/tests/test/
build-logic/build/reports/tests/test/
Loading
Loading