Skip to content

fix(ci): use explicit Ubuntu 24.04 runners - #161

Merged
seonghobae merged 21 commits into
developfrom
fix/actions-explicit-ubuntu-24-04
Sep 4, 2026
Merged

fix(ci): use explicit Ubuntu 24.04 runners#161
seonghobae merged 21 commits into
developfrom
fix/actions-explicit-ubuntu-24-04

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Outcome\n\nThis PR remains the existing repository-owner lane for the explicit Ubuntu 24.04 runner repair and now also removes the structural GitHub Actions admission bottleneck without weakening required gates.\n\n- Compared repository workflows with ContextualWisdomLab/.github@7696915.\n- Preserved organization-owned PR Governance, Dependency Review, Close Empty, CodeQL, Security, SAST, Strix, OpenCode, and Noema coverage; no repository-local duplicate remains.\n- Disabled 91 stale workflow registrations whose files no longer exist on the default branch, reducing active registrations from 106 to 15 while preserving the 12 then-current files and three dynamic workflows.\n- Consolidated ten repository-owned domain quality workflows into the single Foundation CI job. The separately owned recovery rehearsal remains path-scoped.\n- Reduced repository workflow files from 12 to 2: foundation-ci.yml and recovery-rehearsal-quality.yml.\n\n## Concurrency and trigger contract\n\nBoth remaining workflows use a fixed workflow name, repository, and pull-request number group, with a unique run-id fallback outside pull requests. Cancellation is enabled only for pull_request runs; push and manual runs are never cancelled. No build, publish, release, deploy, or migration executor is cancelled.\n\nFoundation CI now runs only for pull requests to develop, pushes to develop, and manual dispatch. Recovery remains limited to its workflow, script, migrations, traceability document, manifest, and test.\n\n## Preserved gates and P1 repairs\n\nFoundation CI still checks out the exact candidate, compiles owned Python, validates the foundation pack, enforces hash-locked test dependencies, runs all ten Python package/service suites, and executes every PostgreSQL contract.\n\nThe PostgreSQL sequence now:\n\n1. Starts a fresh digest-pinned PostgreSQL container for each of 13 base contracts.\n2. Publishes a loopback-only dynamic port, resolves the actual host port, and proves host connectivity with SELECT 1.\n3. Runs the job-analysis snapshot contract and schema-hardening contract against the same container, database URL, and dynamic port.\n\nThis retains 14 PostgreSQL checks while replacing the old 13-way job matrix with sequential isolated execution in one Foundation CI job.\n\n## Exact authority and local verification\n\n- Protected base: develop@ef1b143368cb6249c9520ca8cae10ebe844a5aa1\n- Current head: 0cc583f\n- Commit parent / prior remote head: f795f66\n- Push: ordinary non-force fast-forward\n\nFresh verification after the final independent-review correction:\n\n- PostgreSQL: 14/14 passed; snapshot and schema-hardening shared one container and port.\n- Python 3.14.6: 819 passed; every owned package/service retained 100% statement and branch coverage.\n- npm run validate: 55/55 passed.\n- Runner/concurrency contracts: 7/7 passed.\n- Foundation dependency hygiene: passed.\n- actionlint 1.7.12: passed with zero findings.\n- Official manifest regeneration and exact diff: passed.\n- git diff --check: passed.\n\nA separate read-only Codex review found one inaccurate changelog job-count phrase; it was removed before the single consolidation commit and the complete verification set above was rerun. No no-op commit or synthetic second push was used.\n\nHosted checks and independent approval on the new exact head remain authoritative. No self-approval, force push, review dismissal, required-gate weakening, or admin bypass was used.

Summary by CodeRabbit

  • 변경 사항

    • 여러 영역별 품질 검증 워크플로를 단일 Foundation CI 품질 작업으로 통합했습니다.
    • 패키지 컴파일, 단위·서비스 계약 테스트, PostgreSQL 계약 테스트와 커버리지 검증을 한 번에 수행합니다.
    • 불필요한 개별 품질 워크플로는 제거되었습니다.
    • 복구 리허설 검증은 관련 변경 사항에만 실행되며, Ubuntu 24.04 환경을 사용합니다.
  • 문서

    • 변경 내역, ADR 및 추적성 문서의 검증 워크플로 참조를 최신화했습니다.
  • 테스트

    • 워크플로 실행 환경, 동시성, 작업 구성 및 PostgreSQL 실행 조건 검증을 강화했습니다.

@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 8bac3175-5d38-4c0d-95ec-66c1723f3444

📥 Commits

Reviewing files that changed from the base of the PR and between 8a4e82e and 0cc583f.

📒 Files selected for processing (29)
  • .github/workflows/candidate-evidence-quality.yml
  • .github/workflows/criterion-temporal-quality.yml
  • .github/workflows/foundation-ci.yml
  • .github/workflows/job-analysis-api-quality.yml
  • .github/workflows/migration-adapter-quality.yml
  • .github/workflows/naruon-adapter-quality.yml
  • .github/workflows/offer-approval-quality.yml
  • .github/workflows/people-api-quality.yml
  • .github/workflows/recovery-rehearsal-quality.yml
  • .github/workflows/requisition-review-quality.yml
  • .github/workflows/selection-review-quality.yml
  • .github/workflows/workforce-intelligence-quality.yml
  • CHANGELOG.md
  • docs/adr/0011-bitemporal-workforce-composition.md
  • docs/adr/0012-governed-migration-handoff.md
  • docs/traceability/naruon-calendar-intent.md
  • docs/traceability/requisition-review.md
  • docs/traceability/selection-review.md
  • docs/traceability/workforce-composition.md
  • manifest.json
  • packages/requisition-review/CHANGELOG.md
  • recovery-manifest.json
  • scripts/foundation-contract-core.mjs
  • services/job-analysis-api/tests/test_workflow_contract.py
  • services/people-api/tests/test_workflow_contract.py
  • tests/foundation-contract.test.mjs
  • tests/test_foundation_ci_dependency_hygiene.sh
  • tests/test_github_actions_runner_image.py
  • tests/validate_repository.py

📝 Walkthrough

Walkthrough

저장소 소유 품질 검증을 여러 워크플로에서 foundation-ci.yml의 단일 quality 작업으로 통합했습니다. PostgreSQL 계약 검증과 러너·큐 계약 테스트를 강화했습니다. Recovery rehearsal은 별도 경로 기반 워크플로로 유지했습니다.

Changes

CI 검증 통합

Layer / File(s) Summary
Foundation CI 품질 파이프라인
.github/workflows/foundation-ci.yml, tests/test_github_actions_runner_image.py, tests/test_foundation_ci_dependency_hygiene.sh, tests/foundation-contract.test.mjs
Foundation CI가 develop 브랜치에서 실행됩니다. Python 경계 컴파일, 단위·서비스 계약, 격리된 PostgreSQL 계약을 하나의 quality 작업에서 실행합니다. 러너, 동시성, PostgreSQL 이미지, PYTHONPATH 계약 검증을 강화했습니다.
품질 워크플로 인벤토리 정리
.github/workflows/*-quality.yml, scripts/foundation-contract-core.mjs, tests/validate_repository.py, services/*/tests/test_workflow_contract.py
개별 품질 워크플로를 삭제했습니다. Foundation CI를 필수 검증 대상으로 지정하고 관련 workflow-contract 테스트를 갱신했습니다.
Recovery rehearsal 실행 범위
.github/workflows/recovery-rehearsal-quality.yml, recovery-manifest.json
지정된 경로 변경에서만 recovery rehearsal을 실행합니다. 러너를 ubuntu-24.04로 고정하고 PR 이벤트에만 실행 취소를 적용했습니다.
검증 메타데이터와 문서 참조
manifest.json, CHANGELOG.md, docs/adr/*, docs/traceability/*, packages/requisition-review/CHANGELOG.md
Foundation CI 통합에 맞춰 문서 참조, changelog, 파일 해시, 바이트 수, 줄 수를 갱신했습니다.

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

Merge Risk: 🟡 Moderate · up to 8a4e8

The migration itself is correct, but its new regression guard does not reliably prevent workflows from returning to unsupported or dynamic runner selectors. Strengthen the test before merge.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (14 skipped: 1…
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 제목은 ubuntu-latest를 명시적인 ubuntu-24.04 러너로 변경하는 이 PR의 주요 변경 사항을 정확하고 간결하게 설명합니다.
Full details: Docstring Coverage

Explanation

Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (14 skipped: 14 unsupported.)

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/actions-explicit-ubuntu-24-04

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
Contributor Author

Fresh owner-path revalidation on 2026-09-03: the previously failed exact-head Security Scan run 33528551336 for b10099f8da6ff0493a2842e389e4a2b7a4a9a06f was re-run in place rather than creating source/no-op churn. GitHub accepted failed-job retry and the same run is now attempt 2, queued, still bound to PR #161 head b10099f… and base develop@9e3e484…. Do not transfer attempt-1 failure or predecessor GREEN as final evidence; re-read attempt 2 before lifecycle/merge action. Source tree remains unchanged.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact head 8a4e82ede3abd008362c6b126742ab476f11d3a1, focusing on the explicit ubuntu-24.04 runner normalization, manifest/recovery-manifest integrity, and the non-force two-parent adoption of protected develop@ef1b143368cb6249c9520ca8cae10ebe844a5aa1. Historical GREEN must not be treated as current-head merge evidence.

@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='8a4e82ede3abd008362c6b126742ab476f11d3a1'
base='ef1b143368cb6249c9520ca8cae10ebe844a5aa1'

echo '== Checked-out HEAD and requested commit =='
git rev-parse HEAD
git cat-file -t "$head"
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"
echo

echo '== Parent ancestry and merge-base =='
git merge-base --is-ancestor "$base" "$head" && echo "base_is_ancestor=true" || echo "base_is_ancestor=false"
git merge-base "$head^1" "$head^2"
git diff --name-status "$base" "$head"
echo

echo '== Workflow files and runner selectors at requested head =='
git ls-tree -r --name-only "$head" | awk '/^\.github\/workflows\/.*\.(yml|yaml)$/'
git grep -nE '^[[:space:]]*runs-on:[[:space:]]*' "$head" -- .github/workflows || true
echo

echo '== Test and CI wiring related to runner-image validation =='
git ls-tree -r --name-only "$head" | grep -E '(^|/)(test_github_actions_runner_image\.py|.*foundation.*\.(yml|yaml))$' || true
git grep -nE 'test_github_actions_runner_image|github_actions_runner_image' "$head" -- ':!manifest.json' ':!recovery-manifest.json' || true
echo

echo '== Manifest entry names and hash verification candidates =='
git ls-tree -r --name-only "$head" | grep -E '(^|/)(recovery-)?manifest\.json$' || true
for f in manifest.json recovery-manifest.json; do
  if git cat-file -e "$head:$f" 2>/dev/null; then
    echo "-- $f --"
    git show "$head:$f" | jq -r '
      paths(scalars) as $p
      | select(($p | map(tostring) | join("/") | test("\\.github/workflows/")))
      | [$p | map(tostring) | join("/"), getpath($p)] | `@tsv`
    ' || true
  fi
done

Length of output: 5483


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/Orgmetra'
pr='161'

echo '== Pull request identity, refs, mergeability, and draft state =='
gh pr view "$pr" --repo "$repo" --json number,state,isDraft,mergeable,headRefName,headRefOid,baseRefName,baseRefOid,url
echo

echo '== Current checks for the PR head =='
gh pr checks "$pr" --repo "$repo" --json name,state,link,workflow,bucket 2>&1 || true
echo

echo '== Reviews and review threads summary =='
gh pr view "$pr" --repo "$repo" --json reviews,reviewDecision,comments
echo

echo '== Repository rulesets and branch protection for develop =='
gh api "repos/$repo/rulesets?includes_parents=true" --paginate 2>&1 || true
gh api "repos/$repo/branches/develop/protection" 2>&1 || true

Length of output: 15539


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='8a4e82ede3abd008362c6b126742ab476f11d3a1'

echo '== Relevant file structure =='
ast-grep outline tests/test_github_actions_runner_image.py --items all
ast-grep outline .github/workflows/foundation-ci.yml --items all
echo

echo '== Runner-image regression test =='
git show "$head:tests/test_github_actions_runner_image.py" | nl -ba
echo

echo '== Foundation CI workflow =='
git show "$head:.github/workflows/foundation-ci.yml" | nl -ba
echo

echo '== Manifest schemas and changed sections =='
for f in manifest.json recovery-manifest.json; do
  echo "-- $f: top-level type and keys --"
  git show "$head:$f" > "/tmp/$f"
  jq -r 'type, (if type == "object" then keys[] else empty end)' "/tmp/$f"
  echo "-- workflow-related text --"
  rg -n -i -C2 'workflow|sha256|digest|hash|\.github' "/tmp/$f" || true
  echo "-- diff from first parent --"
  git diff --unified=3 "$head^1" "$head" -- "$f"
done
echo

echo '== Merge-parent diffs and workflow-selector delta =='
echo '-- merge commit relative to first parent --'
git diff --stat "$head^1" "$head"
echo '-- merge commit relative to second parent --'
git diff --stat "$head^2" "$head"
echo '-- remaining ubuntu-latest selectors at head --'
git grep -n -i 'ubuntu-latest' "$head" -- .github/workflows || true
echo '-- changed runner selector lines, base to head --'
git diff --unified=1 "$head^2" "$head" -- .github/workflows

Length of output: 2185


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/Orgmetra'
pr='161'
head='8a4e82ede3abd008362c6b126742ab476f11d3a1'

echo '== Head commit and parent commit API data =='
gh api "repos/$repo/commits/$head" --jq '{sha,parents:[.parents[].sha],verification,stats,files:[.files[].filename]}'
echo

echo '== Pull request commits in API order =='
gh api "repos/$repo/pulls/$pr/commits?per_page=100" --paginate --jq '.[] | {sha,parents:[.parents[].sha],message:.commit.message}'
echo

echo '== Head ref history events visible through repository events =='
gh api "repos/$repo/events?per_page=100" --paginate --jq --arg head "$head" '
  .[] | select(.type == "PushEvent" and (.payload.head // "") == $head)
  | {created_at,actor:.actor.login,ref:.payload.ref,before:.payload.before,head:.payload.head,forced:(.payload.forced // false)}
' 2>&1 || true

Length of output: 4159


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='8a4e82ede3abd008362c6b126742ab476f11d3a1'

echo '== Runner-image regression test =='
git show "$head:tests/test_github_actions_runner_image.py" | sed -n '=' | sed 'N;s/\n/\t/'
echo

echo '== Foundation CI workflow =='
git show "$head:.github/workflows/foundation-ci.yml" | sed -n '=' | sed 'N;s/\n/\t/'
echo

echo '== Workflow selector and regression-test diff from protected base =='
git diff --unified=3 "$head^2" "$head" -- .github/workflows tests/test_github_actions_runner_image.py
echo

echo '== Manifest structures =='
for f in manifest.json recovery-manifest.json; do
  echo "-- $f --"
  git show "$head:$f" > "/tmp/${f}"
  jq -C . "/tmp/${f}" | sed -n '1,240p'
done
echo

echo '== Verify SHA-256 entries that name repository files =='
python3 - <<'PY'
import hashlib
import json
import subprocess

head = "8a4e82ede3abd008362c6b126742ab476f11d3a1"
manifest_files = ("manifest.json", "recovery-manifest.json")

def git_bytes(path):
    return subprocess.check_output(["git", "show", f"{head}:{path}"])

def walk(value, path=()):
    if isinstance(value, dict):
        for key, child in value.items():
            yield from walk(child, path + (str(key),))
    elif isinstance(value, list):
        for index, child in enumerate(value):
            yield from walk(child, path + (str(index),))
    else:
        yield path, value

for manifest_path in manifest_files:
    doc = json.loads(git_bytes(manifest_path))
    print(f"-- {manifest_path} --")
    candidates = []
    for json_path, value in walk(doc):
        text_path = "/".join(json_path)
        if isinstance(value, str) and len(value) == 64 and all(c in "0123456789abcdef" for c in value.lower()):
            candidates.append((text_path, value))
    print(f"sha256_scalar_count={len(candidates)}")
    for text_path, expected in candidates:
        possible_paths = [p for p in text_path.split("/") if p.endswith((".yml", ".yaml", ".py", ".sh", ".json"))]
        print(f"entry={text_path} digest={expected} possible_file_components={possible_paths}")
PY
echo

echo '== All textual ubuntu-latest references under repository workflows =='
git grep -n -i 'ubuntu-latest' "$head" -- .github/workflows || true
echo '== All runs-on values under repository workflows =='
git grep -nE 'runs-on:|runs-on[[:space:]]*:' "$head" -- .github/workflows || true

Length of output: 40935


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/Orgmetra'
head='8a4e82ede3abd008362c6b126742ab476f11d3a1'

echo '== Ref update events that are visible to this token =='
gh api "repos/$repo/events?per_page=100" \
  --jq '.[] | select(.type == "PushEvent") | {created_at,actor:.actor.login,ref:.payload.ref,before:.payload.before,head:.payload.head,forced:(.payload.forced // false)}' \
  2>&1 | grep -F -C2 "$head" || true
echo

echo '== Exact head commit comparison to both parents =='
gh api "repos/$repo/compare/${head}^1...$head" --jq '{status,ahead_by,behind_by,total_commits,files:[.files[] | {filename,status,additions,deletions}]}'
gh api "repos/$repo/compare/${head}^2...$head" --jq '{status,ahead_by,behind_by,total_commits,files:[.files[] | {filename,status,additions,deletions}]}'

Length of output: 2777


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='8a4e82ede3abd008362c6b126742ab476f11d3a1'

python3 - <<'PY'
import hashlib
import json
import subprocess
import sys

head = "8a4e82ede3abd008362c6b126742ab476f11d3a1"
manifest_paths = ("manifest.json", "recovery-manifest.json")
failures = []

for manifest_path in manifest_paths:
    manifest = json.loads(subprocess.check_output(["git", "show", f"{head}:{manifest_path}"]))
    records = manifest.get("files")
    if not isinstance(records, list):
        failures.append(f"{manifest_path}: 'files' is not a list")
        continue
    checked = 0
    for index, record in enumerate(records):
        where = f"{manifest_path}: files[{index}]"
        if not isinstance(record, dict) or not all(key in record for key in ("path", "sha256", "bytes", "lines")):
            failures.append(f"{where}: missing required record fields")
            continue
        path = record["path"]
        try:
            content = subprocess.check_output(["git", "show", f"{head}:{path}"])
        except subprocess.CalledProcessError:
            failures.append(f"{where}: missing exact-head file {path}")
            continue
        actual = {
            "sha256": hashlib.sha256(content).hexdigest(),
            "bytes": len(content),
            "lines": content.count(b"\n"),
        }
        for field, actual_value in actual.items():
            if record[field] != actual_value:
                failures.append(
                    f"{where}: {path} {field} expected={record[field]!r} actual={actual_value!r}"
                )
        checked += 1
    print(f"{manifest_path}: checked_records={checked}")

if failures:
    print("manifest_verification=FAIL")
    print("\n".join(failures))
    sys.exit(1)
print("manifest_verification=PASS")
PY

echo '== Current exact-head check-state summary =='
gh pr checks 161 --repo ContextualWisdomLab/Orgmetra \
  --json name,state,bucket,workflow \
  --jq 'group_by(.bucket) | map({bucket: .[0].bucket, count: length, states: (group_by(.state) | map({state: .[0].state, count: length})), workflows: ([.[].workflow] | unique)})'

Length of output: 3093


🏁 Script executed:

#!/bin/bash
set -u

echo '== Current exact-head check-state summary =='
gh pr checks 161 --repo ContextualWisdomLab/Orgmetra \
  --json name,state,bucket,workflow \
  --jq 'group_by(.bucket) | map({bucket: .[0].bucket, count: length, states: (group_by(.state) | map({state: .[0].state, count: length})), workflows: ([.[].workflow] | unique)})' \
  2>&1 || true

echo '== Foundation CI run identity and status =='
gh api 'repos/ContextualWisdomLab/Orgmetra/actions/runs/33723646906' \
  --jq '{id,head_sha,event,status,conclusion,run_attempt,workflow_id,created_at,updated_at}' \
  2>&1 || true

Length of output: 1905


@seonghobae Review completed for exact head 8a4e82ede3abd008362c6b126742ab476f11d3a1.

Finding

  • P1 — Validate every runner selector in the regression test. tests/test_github_actions_runner_image.py Line 27 reads only *.yml files. Line 35 only requires that a workflow with a runs-on: entry contains at least one runs-on: ubuntu-24.04 entry. A future workflow can add a second job with runs-on: ubuntu-22.04, macos-latest, or a dynamic selector, while retaining one ubuntu-24.04 job. The test will pass. A .yaml workflow also bypasses the test. Collect and validate each runs-on value from both *.yml and *.yaml workflow files. Require every repository-owned runner job to use ubuntu-24.04.

Verified

  • All 12 repository workflow files contain 14 runs-on entries. Each entry uses ubuntu-24.04.
  • No ubuntu-latest reference remains under .github/workflows.
  • Foundation CI invokes python -m unittest tests.test_github_actions_runner_image.
  • 8a4e82ed… has parents b10099f… and ef1b143…. The protected base is an ancestor of the head. The merge commit has no tree changes relative to its first parent. This confirms the two-parent adoption in the Git graph.
  • All 79 manifest.json records and all 4 recovery-manifest.json records have matching SHA-256 digests and byte counts. The changed workflow records are valid.
  • Six unrelated manifest.json records have stale lines values. The mismatches predate this PR’s runner and reseal changes. They do not invalidate the changed workflow digests, but the full manifest is not internally consistent on line counts.

Current evidence

Foundation CI run 33723646906 is bound to 8a4e82ed… and remains queued. GitHub reports 39 queued checks. I did not use historical GREEN as current-head merge evidence. No approval or merge recommendation is appropriate until the current-head required checks reach terminal results.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

seonghobae added a commit that referenced this pull request Sep 6, 2026
Preserve the complete governed test-portability delta from 60ad07a while adopting protected develop@eb9757f8649aaad026a9865508d9aad50c1a7a4f using GitHub's conflict-free exact merge tree. Preserve #161 repository-workflow consolidation and require fresh exact-head acceptance.

No force-push, gate weakening, foreign-owner source copy, or release claim.
seonghobae added a commit that referenced this pull request Sep 6, 2026
Preserve the complete governed compensation-change review delta from b9e487c while adopting protected develop@eb9757f8649aaad026a9865508d9aad50c1a7a4f using GitHub's conflict-free exact merge tree. Preserve #161 repository-workflow consolidation and reacquire every applicable exact-head gate.

No force-push, gate weakening, foreign-owner source copy, or release claim.
seonghobae added a commit that referenced this pull request Sep 6, 2026
Preserve the complete governed candidate-offer response evidence delta from a72463a while adopting protected develop@eb9757f8649aaad026a9865508d9aad50c1a7a4f using GitHub's conflict-free exact merge tree. Preserve #161 repository-workflow consolidation and keep dependency-first child #108 unmerged until this parent integrates normally.

No force-push, gate weakening, foreign-owner source copy, or release claim.
seonghobae added a commit that referenced this pull request Sep 6, 2026
Exact hosted Foundation run 34005848591 exposed a semantic protected-parent adoption defect: the feature branch retained the package-specific compensation review workflow even though protected #161 had consolidated local quality admission into Foundation CI. That extra leaf workflow violated the explicit runner/workflow inventory before validation or package tests could run.

Retire the leaf workflow, run the compensation-review suite directly from canonical Foundation CI, preserve the package's exact 100% statement/branch coverage contract, add a regression against leaf-workflow resurrection, update traceability/changelog, and reseal the Foundation manifest entry for the final bytes.

No production compensation logic, database contract, HR domain truth, coverage threshold, or required central gate is weakened.
seonghobae added a commit that referenced this pull request Sep 6, 2026
Preserve the People API telemetry delta while adopting protected develop@eb9757f8649aaad026a9865508d9aad50c1a7a4f. Keep #161 repository-owned workflow consolidation intact; no retired package-local quality workflow is reintroduced.
seonghobae added a commit that referenced this pull request Sep 6, 2026
Adopt current protected develop without force-pushing or changing the validated request-budget delta. Preserve the protected #161 workflow consolidation and retain the bounded pre-authentication metadata contracts.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant