refactor(P21): rename acdl_platform/ -> core/ (REQ-53)

---ci---
project: acdl
phase: 21
milestone: v1.6
status: execute
---/ci---

Rename the acdl_platform/ package to core/ across the directory, all
imports in tests/scripts/pipelines/workflows, and doc references. The
package is imported as core.confidence_signal / core.contract_resolver /
core.outbox_writer. The deploy workflow's platform-repo checkout dir is
renamed acdl-platform/ -> platform/ (workspace path, not the python
package). Both .gitea + .github workflows stay byte-identical.

Note: the original target name 'platform/' shadows Python's stdlib
platform module (pytest's import uuid -> platform.system() fails when
the repo root is on sys.path, which every test does). 'core/' avoids
the clash while honoring the intent (drop the verbose acdl_platform).

Tests: 154 pass. run_ci.sh green.
This commit is contained in:
Jon Chery
2026-07-22 18:21:12 +00:00
parent c5745de37c
commit b758a7c242
22 changed files with 52 additions and 52 deletions
+3 -3
View File
@@ -35,9 +35,9 @@ jobs:
- name: Compile all Python files - name: Compile all Python files
run: | run: |
python3 -m py_compile \ python3 -m py_compile \
acdl_platform/confidence_signal.py \ core/confidence_signal.py \
acdl_platform/outbox_writer.py \ core/outbox_writer.py \
acdl_platform/contract_resolver.py \ core/contract_resolver.py \
adapters/terraform/adapter.py \ adapters/terraform/adapter.py \
adapters/terraform/policy/checkov_adapter.py \ adapters/terraform/policy/checkov_adapter.py \
scripts/push_consumer_image.py scripts/push_consumer_image.py
+5 -5
View File
@@ -17,7 +17,7 @@
# #
# What this workflow does: # What this workflow does:
# 1. Checks out the consumer repo (the repo that invoked the workflow). # 1. Checks out the consumer repo (the repo that invoked the workflow).
# 2. Checks out the ACDL platform repo into the workspace (acdl-platform/). # 2. Checks out the ACDL platform repo into the workspace (platform/).
# This is the run-time fetch — consumers never clone the platform repo. # This is the run-time fetch — consumers never clone the platform repo.
# 3. Installs runtime deps: Python 3.12, Terraform 1.9.*, Checkov. # 3. Installs runtime deps: Python 3.12, Terraform 1.9.*, Checkov.
# 4. Configures AWS auth (OIDC default; static-key override via secrets). # 4. Configures AWS auth (OIDC default; static-key override via secrets).
@@ -73,7 +73,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: acdl/acdl repository: acdl/acdl
path: acdl-platform path: platform
ref: v1.4 ref: v1.4
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
@@ -110,18 +110,18 @@ jobs:
check-only) MODE_FLAG="--check-only" ;; check-only) MODE_FLAG="--check-only" ;;
*) echo "Unknown mode: ${{ inputs.mode }}"; exit 1 ;; *) echo "Unknown mode: ${{ inputs.mode }}"; exit 1 ;;
esac esac
bash acdl-platform/scripts/run_platform.sh $MODE_FLAG "${{ inputs.contract }}" bash platform/scripts/run_platform.sh $MODE_FLAG "${{ inputs.contract }}"
- name: Upload emitted Terraform - name: Upload emitted Terraform
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: acdl-terraform name: acdl-terraform
path: acdl-platform/terraform/spike/*.tf path: platform/terraform/spike/*.tf
if-no-files-found: warn if-no-files-found: warn
- name: Upload platform log - name: Upload platform log
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: acdl-platform-log name: acdl-platform-log
path: acdl-platform/logs/ path: platform/logs/
if-no-files-found: warn if-no-files-found: warn
+3 -3
View File
@@ -35,9 +35,9 @@ jobs:
- name: Compile all Python files - name: Compile all Python files
run: | run: |
python3 -m py_compile \ python3 -m py_compile \
acdl_platform/confidence_signal.py \ core/confidence_signal.py \
acdl_platform/outbox_writer.py \ core/outbox_writer.py \
acdl_platform/contract_resolver.py \ core/contract_resolver.py \
adapters/terraform/adapter.py \ adapters/terraform/adapter.py \
adapters/terraform/policy/checkov_adapter.py \ adapters/terraform/policy/checkov_adapter.py \
scripts/push_consumer_image.py scripts/push_consumer_image.py
+5 -5
View File
@@ -17,7 +17,7 @@
# #
# What this workflow does: # What this workflow does:
# 1. Checks out the consumer repo (the repo that invoked the workflow). # 1. Checks out the consumer repo (the repo that invoked the workflow).
# 2. Checks out the ACDL platform repo into the workspace (acdl-platform/). # 2. Checks out the ACDL platform repo into the workspace (platform/).
# This is the run-time fetch — consumers never clone the platform repo. # This is the run-time fetch — consumers never clone the platform repo.
# 3. Installs runtime deps: Python 3.12, Terraform 1.9.*, Checkov. # 3. Installs runtime deps: Python 3.12, Terraform 1.9.*, Checkov.
# 4. Configures AWS auth (OIDC default; static-key override via secrets). # 4. Configures AWS auth (OIDC default; static-key override via secrets).
@@ -73,7 +73,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: acdl/acdl repository: acdl/acdl
path: acdl-platform path: platform
ref: v1.4 ref: v1.4
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
@@ -110,18 +110,18 @@ jobs:
check-only) MODE_FLAG="--check-only" ;; check-only) MODE_FLAG="--check-only" ;;
*) echo "Unknown mode: ${{ inputs.mode }}"; exit 1 ;; *) echo "Unknown mode: ${{ inputs.mode }}"; exit 1 ;;
esac esac
bash acdl-platform/scripts/run_platform.sh $MODE_FLAG "${{ inputs.contract }}" bash platform/scripts/run_platform.sh $MODE_FLAG "${{ inputs.contract }}"
- name: Upload emitted Terraform - name: Upload emitted Terraform
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: acdl-terraform name: acdl-terraform
path: acdl-platform/terraform/spike/*.tf path: platform/terraform/spike/*.tf
if-no-files-found: warn if-no-files-found: warn
- name: Upload platform log - name: Upload platform log
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: acdl-platform-log name: acdl-platform-log
path: acdl-platform/logs/ path: platform/logs/
if-no-files-found: warn if-no-files-found: warn
+1 -1
View File
@@ -7,7 +7,7 @@
# inputs: module-specific inputs # inputs: module-specific inputs
# #
# Validated against schemas/contract.schema.json. # Validated against schemas/contract.schema.json.
# Resolved by acdl_platform/contract_resolver.py to a Target Stack instance. # Resolved by core/contract_resolver.py to a Target Stack instance.
uses: acdl/pipelines/deploy.yaml@v1.4 uses: acdl/pipelines/deploy.yaml@v1.4
module: static-asset module: static-asset
+3 -3
View File
@@ -29,9 +29,9 @@ stages:
description: Compile all Python files (py_compile) description: Compile all Python files (py_compile)
command: | command: |
python3 -m py_compile \ python3 -m py_compile \
acdl_platform/confidence_signal.py \ core/confidence_signal.py \
acdl_platform/outbox_writer.py \ core/outbox_writer.py \
acdl_platform/contract_resolver.py \ core/contract_resolver.py \
adapters/terraform/adapter.py \ adapters/terraform/adapter.py \
adapters/terraform/policy/checkov_adapter.py \ adapters/terraform/policy/checkov_adapter.py \
scripts/push_consumer_image.py scripts/push_consumer_image.py
+2 -2
View File
@@ -27,7 +27,7 @@ stages:
- name: resolve-stack - name: resolve-stack
description: Resolve the contract to a Target Stack instance via the contract resolver description: Resolve the contract to a Target Stack instance via the contract resolver
command: python3 acdl_platform/contract_resolver.py contracts/static-asset.yaml /tmp/acdl-stack.json command: python3 core/contract_resolver.py contracts/static-asset.yaml /tmp/acdl-stack.json
required: true required: true
- name: terraform-plan - name: terraform-plan
@@ -42,7 +42,7 @@ stages:
- name: confidence - name: confidence
description: Compute the confidence signal from policy + validation inputs description: Compute the confidence signal from policy + validation inputs
command: python3 acdl_platform/confidence_signal.py /tmp/acdl-deploy-inputs.json dev command: python3 core/confidence_signal.py /tmp/acdl-deploy-inputs.json dev
required: true required: true
- name: apply - name: apply
+3 -3
View File
@@ -42,9 +42,9 @@ echo ""
banner "Stage 1/3: lint (py_compile)" banner "Stage 1/3: lint (py_compile)"
python3 -m py_compile \ python3 -m py_compile \
acdl_platform/confidence_signal.py \ core/confidence_signal.py \
acdl_platform/outbox_writer.py \ core/outbox_writer.py \
acdl_platform/contract_resolver.py \ core/contract_resolver.py \
adapters/terraform/adapter.py \ adapters/terraform/adapter.py \
adapters/terraform/policy/checkov_adapter.py \ adapters/terraform/policy/checkov_adapter.py \
scripts/push_consumer_image.py \ scripts/push_consumer_image.py \
+6 -6
View File
@@ -19,7 +19,7 @@
# --quiet suppress terraform/checkov streaming (output to log only) # --quiet suppress terraform/checkov streaming (output to log only)
# #
# The contract file is a YAML file validated against schemas/contract.schema.json. # The contract file is a YAML file validated against schemas/contract.schema.json.
# The resolver (acdl_platform/contract_resolver.py) resolves it to a Target Stack # The resolver (core/contract_resolver.py) resolves it to a Target Stack
# instance, which the adapter (adapters/terraform/adapter.py) compiles to Terraform. # instance, which the adapter (adapters/terraform/adapter.py) compiles to Terraform.
# #
# Uses the rotated spike key (D-039/D-047) from gitignored .env.secrets. # Uses the rotated spike key (D-039/D-047) from gitignored .env.secrets.
@@ -30,7 +30,7 @@ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# Capture the caller's CWD before we cd to ROOT. The reusable deploy workflow # Capture the caller's CWD before we cd to ROOT. The reusable deploy workflow
# invokes this script from the CONSUMER repo's workspace root with a relative # invokes this script from the CONSUMER repo's workspace root with a relative
# contract path (e.g. .acdl/contract.yaml); the contract must resolve against # contract path (e.g. .acdl/contract.yaml); the contract must resolve against
# the consumer repo, not the platform repo (acdl-platform/). Without this, the # the consumer repo, not the platform repo (platform/). Without this, the
# `[ -f "$CONTRACT" ]` check below looks for the contract inside the platform # `[ -f "$CONTRACT" ]` check below looks for the contract inside the platform
# repo and fails (P0 fix — see docs/CONSUMER_GUIDE.md Step 4). # repo and fails (P0 fix — see docs/CONSUMER_GUIDE.md Step 4).
CALLER_CWD="$(pwd)" CALLER_CWD="$(pwd)"
@@ -86,7 +86,7 @@ stream() {
} }
CONTRACT_ID="11111111-1111-1111-1111-111111111111" # spike fixed UUID CONTRACT_ID="11111111-1111-1111-1111-111111111111" # spike fixed UUID
WORK="/tmp/acdl_platform" WORK="/tmp/acdl_platform_run"
rm -rf "$WORK"; mkdir -p "$WORK" rm -rf "$WORK"; mkdir -p "$WORK"
echo "=== Step 1: validate contract against contract.schema.json ===" echo "=== Step 1: validate contract against contract.schema.json ==="
@@ -101,7 +101,7 @@ print(f'contract: module={contract[\"module\"]} env={contract[\"environment\"]}
echo "" echo ""
echo "=== Step 2: resolve contract -> Target Stack instance ===" echo "=== Step 2: resolve contract -> Target Stack instance ==="
python3 acdl_platform/contract_resolver.py "$CONTRACT" "$WORK/stack.json" || fail "resolver failed" python3 core/contract_resolver.py "$CONTRACT" "$WORK/stack.json" || fail "resolver failed"
python3 -c "import json; d=json.load(open('$WORK/stack.json')); print(f'stack: {d[\"stack\"][\"name\"]} {d[\"stack\"][\"kind\"]} {len(d[\"resources\"])} resource(s)')" python3 -c "import json; d=json.load(open('$WORK/stack.json')); print(f'stack: {d[\"stack\"][\"name\"]} {d[\"stack\"][\"kind\"]} {len(d[\"resources\"])} resource(s)')"
echo "" echo ""
@@ -211,7 +211,7 @@ echo ""
echo "=== Step 7: confidence signal compute ===" echo "=== Step 7: confidence signal compute ==="
python3 <<PY > "$WORK/signal.json" || fail "confidence signal failed" python3 <<PY > "$WORK/signal.json" || fail "confidence signal failed"
import json import json
import acdl_platform.confidence_signal as c import core.confidence_signal as c
pcr = json.load(open("$WORK/pcr.json")) pcr = json.load(open("$WORK/pcr.json"))
inputs = { inputs = {
"policy": pcr, "policy": pcr,
@@ -247,7 +247,7 @@ event = {
} }
print(json.dumps(event, indent=2)) print(json.dumps(event, indent=2))
PY PY
python3 acdl_platform/outbox_writer.py "$WORK/event.json" > "$WORK/outbox_item.json" || fail "outbox write failed" python3 core/outbox_writer.py "$WORK/event.json" > "$WORK/outbox_item.json" || fail "outbox write failed"
echo "outbox: $(python3 -c "import json; d=json.load(open('$WORK/outbox_item.json')); print('contractId=', d['contractId'], 'hash=', d['hash'][:16]+'...')")" echo "outbox: $(python3 -c "import json; d=json.load(open('$WORK/outbox_item.json')); print('contractId=', d['contractId'], 'hash=', d['hash'][:16]+'...')")"
echo "" echo ""
+1 -1
View File
@@ -6,7 +6,7 @@ import pytest
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from acdl_platform.confidence_signal import ( from core.confidence_signal import (
WEIGHTS, PENALTY, THRESHOLDS, compute, Signal, _per_input_score, WEIGHTS, PENALTY, THRESHOLDS, compute, Signal, _per_input_score,
) )
+8 -8
View File
@@ -25,7 +25,7 @@ class TestContractSchema:
class TestResolveStaticAsset: class TestResolveStaticAsset:
def test_resolve_static_asset_contract(self, tmp_path): def test_resolve_static_asset_contract(self, tmp_path):
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT)) stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT))
assert stack["stack"]["name"] == "static-asset" assert stack["stack"]["name"] == "static-asset"
assert stack["stack"]["kind"] == "l2" assert stack["stack"]["kind"] == "l2"
@@ -33,7 +33,7 @@ class TestResolveStaticAsset:
assert len(stack["resources"]) >= 1 assert len(stack["resources"]) >= 1
def test_resolve_static_asset_has_s3_resource(self): def test_resolve_static_asset_has_s3_resource(self):
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT)) stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT))
s3_res = [r for r in stack["resources"] if r["type"] == "aws:s3:bucket"] s3_res = [r for r in stack["resources"] if r["type"] == "aws:s3:bucket"]
assert len(s3_res) == 1 assert len(s3_res) == 1
@@ -41,7 +41,7 @@ class TestResolveStaticAsset:
assert s3_res[0]["inputs"]["region"] == "us-east-1" assert s3_res[0]["inputs"]["region"] == "us-east-1"
def test_resolve_static_asset_validates_against_stack_schema(self): def test_resolve_static_asset_validates_against_stack_schema(self):
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT)) stack = resolve(str(ROOT / "contracts/static-asset.yaml"), str(ROOT))
schema = json.load(open(ROOT / "schemas/stack.schema.json")) schema = json.load(open(ROOT / "schemas/stack.schema.json"))
jsonschema.validate(stack, schema) jsonschema.validate(stack, schema)
@@ -63,7 +63,7 @@ class TestResolveMicroservice:
with open(contract_path, "w") as fh: with open(contract_path, "w") as fh:
yaml.dump(contract, fh) yaml.dump(contract, fh)
try: try:
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(contract_path), str(ROOT)) stack = resolve(str(contract_path), str(ROOT))
assert stack["stack"]["name"] == "microservice" assert stack["stack"]["name"] == "microservice"
assert stack["stack"]["kind"] == "l2" assert stack["stack"]["kind"] == "l2"
@@ -86,7 +86,7 @@ class TestResolveL1Direct:
contract_path = tmp_path / "test-s3.yaml" contract_path = tmp_path / "test-s3.yaml"
with open(contract_path, "w") as fh: with open(contract_path, "w") as fh:
yaml.dump(contract, fh) yaml.dump(contract, fh)
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(contract_path), str(ROOT)) stack = resolve(str(contract_path), str(ROOT))
assert stack["stack"]["name"] == "s3" assert stack["stack"]["name"] == "s3"
assert stack["stack"]["kind"] == "l1" assert stack["stack"]["kind"] == "l1"
@@ -104,7 +104,7 @@ class TestResolveL1Direct:
contract_path = tmp_path / "test-s3-schema.yaml" contract_path = tmp_path / "test-s3-schema.yaml"
with open(contract_path, "w") as fh: with open(contract_path, "w") as fh:
yaml.dump(contract, fh) yaml.dump(contract, fh)
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
stack = resolve(str(contract_path), str(ROOT)) stack = resolve(str(contract_path), str(ROOT))
schema = json.load(open(ROOT / "schemas/stack.schema.json")) schema = json.load(open(ROOT / "schemas/stack.schema.json"))
jsonschema.validate(stack, schema) jsonschema.validate(stack, schema)
@@ -121,7 +121,7 @@ class TestResolveErrors:
contract_path = tmp_path / "bad.yaml" contract_path = tmp_path / "bad.yaml"
with open(contract_path, "w") as fh: with open(contract_path, "w") as fh:
yaml.dump(contract, fh) yaml.dump(contract, fh)
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
with pytest.raises(ValueError, match="not found in registry"): with pytest.raises(ValueError, match="not found in registry"):
resolve(str(contract_path), str(ROOT)) resolve(str(contract_path), str(ROOT))
@@ -130,7 +130,7 @@ class TestResolveErrors:
contract_path = tmp_path / "incomplete.yaml" contract_path = tmp_path / "incomplete.yaml"
with open(contract_path, "w") as fh: with open(contract_path, "w") as fh:
yaml.dump(contract, fh) yaml.dump(contract, fh)
from acdl_platform.contract_resolver import resolve from core.contract_resolver import resolve
with pytest.raises(jsonschema.ValidationError): with pytest.raises(jsonschema.ValidationError):
resolve(str(contract_path), str(ROOT)) resolve(str(contract_path), str(ROOT))
+1 -1
View File
@@ -8,7 +8,7 @@ import pytest
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from acdl_platform.outbox_writer import _canonical_hash, write_event from core.outbox_writer import _canonical_hash, write_event
class TestCanonicalHash: class TestCanonicalHash:
+1 -1
View File
@@ -29,7 +29,7 @@ class TestPipelineIntegration:
def test_confidence_signal_with_adapted_tf(self): def test_confidence_signal_with_adapted_tf(self):
sys.path.insert(0, str(ROOT)) sys.path.insert(0, str(ROOT))
from acdl_platform.confidence_signal import compute from core.confidence_signal import compute
inputs = { inputs = {
"policy": [{"result": "pass"}], "policy": [{"result": "pass"}],
+10 -10
View File
@@ -78,7 +78,7 @@ class TestPipelineContract:
contract = _load_yaml("pipelines/ci.yaml") contract = _load_yaml("pipelines/ci.yaml")
lint = next(s for s in contract["stages"] if s["name"] == "lint") lint = next(s for s in contract["stages"] if s["name"] == "lint")
assert "py_compile" in lint["command"] assert "py_compile" in lint["command"]
assert "acdl_platform/confidence_signal.py" in lint["command"] assert "core/confidence_signal.py" in lint["command"]
assert "adapters/terraform/adapter.py" in lint["command"] assert "adapters/terraform/adapter.py" in lint["command"]
def test_contract_test_command_runs_pytest(self): def test_contract_test_command_runs_pytest(self):
@@ -141,9 +141,9 @@ class TestWorkflowConformance:
run_step = next(s for s in lint_job["steps"] if "run" in s) run_step = next(s for s in lint_job["steps"] if "run" in s)
assert "py_compile" in run_step["run"] assert "py_compile" in run_step["run"]
for py_file in [ for py_file in [
"acdl_platform/confidence_signal.py", "core/confidence_signal.py",
"acdl_platform/outbox_writer.py", "core/outbox_writer.py",
"acdl_platform/contract_resolver.py", "core/contract_resolver.py",
"adapters/terraform/adapter.py", "adapters/terraform/adapter.py",
"adapters/terraform/policy/checkov_adapter.py", "adapters/terraform/policy/checkov_adapter.py",
"scripts/push_consumer_image.py", "scripts/push_consumer_image.py",
@@ -175,8 +175,8 @@ class TestRunCiScript:
def test_run_ci_script_contains_lint_stage(self): def test_run_ci_script_contains_lint_stage(self):
content = open(ROOT / "scripts/run_ci.sh").read() content = open(ROOT / "scripts/run_ci.sh").read()
assert "py_compile" in content assert "py_compile" in content
assert "acdl_platform/confidence_signal.py" in content assert "core/confidence_signal.py" in content
assert "acdl_platform/contract_resolver.py" in content assert "core/contract_resolver.py" in content
assert "adapters/terraform/adapter.py" in content assert "adapters/terraform/adapter.py" in content
def test_run_ci_script_contains_test_stage(self): def test_run_ci_script_contains_test_stage(self):
@@ -198,9 +198,9 @@ class TestRunCiScript:
["bash", "-c", ["bash", "-c",
f"cd {ROOT} && " f"cd {ROOT} && "
"python3 -m py_compile " "python3 -m py_compile "
"acdl_platform/confidence_signal.py " "core/confidence_signal.py "
"acdl_platform/outbox_writer.py " "core/outbox_writer.py "
"acdl_platform/contract_resolver.py " "core/contract_resolver.py "
"adapters/terraform/adapter.py " "adapters/terraform/adapter.py "
"adapters/terraform/policy/checkov_adapter.py " "adapters/terraform/policy/checkov_adapter.py "
"scripts/push_consumer_image.py && " "scripts/push_consumer_image.py && "
@@ -342,7 +342,7 @@ class TestDeployWorkflowConformance:
deploy_job = wf["jobs"]["deploy"] deploy_job = wf["jobs"]["deploy"]
platform_checkout = next( platform_checkout = next(
s for s in deploy_job["steps"] s for s in deploy_job["steps"]
if "checkout" in s.get("uses", "") and s.get("with", {}).get("path") == "acdl-platform" if "checkout" in s.get("uses", "") and s.get("with", {}).get("path") == "platform"
) )
assert platform_checkout["with"]["repository"] == "acdl/acdl" assert platform_checkout["with"]["repository"] == "acdl/acdl"