Back to feed

sledtools/pika branch #125

github-actions

Adapt pikaci cleanup to manifest filters

Target branch: master

Merge Commit: 9d6a8c0927dff9d1c3d4cdd51bd5306c8e62ecb1

branch: merged tutorial: ready ci: failed
Open CI Details

Continuous Integration

CI: failed

Compact status on the review page, with full logs on the CI page.

Open CI Details

Latest run #160 failed

9 passed 1 failed

head 5ad0188aee428362fd937a2733960e65a65b0112 · queued 2026-03-26 23:31:54 · 10 lane(s)

queued 8s · ran 16m 01s

check-pika-rust · success check-pika-followup · success check-notifications · success check-agent-contracts · success check-rmp · success check-pikachat · success check-pikachat-typescript · success check-apple-host-sanity · failed check-pikachat-openclaw-e2e · success check-fixture · success

Summary

This branch removes the GitHub Actions shadow CI layer (pre-merge.yml, apple-mini-validate.yml, repo-secrets-smoke.yml) and the forge-github-ci-shim.py bridge script, consolidating all CI orchestration onto the canonical forge service at git.pikachat.org. Path filters in ci/forge-lanes.toml and the pikaci Rust crate are cleaned of references to the deleted workflow files and GitHub-only helper scripts. Apple remote lanes switch from the GitHub-step wrapper (pikaci-apple-github-step / with-pikaci-apple-ci-env) to the direct pikaci-apple-remote.sh entrypoint. The pikaci catalog drops the now-unused shadow_recipe field from every staged Linux target. Guardrail tests, documentation, justfile recipes, Nix derivations, and shell helper libraries are all updated to reflect the forge-only CI model.

Tutorial Steps

Delete GitHub Actions workflow files

Intent: Remove the three GitHub Actions workflow definitions that provided advisory shadow CI, Apple mini validation, and repo-secrets smoke testing. These responsibilities are now fully handled by the canonical forge service.

Affected files: .github/workflows/pre-merge.yml, .github/workflows/apple-mini-validate.yml, .github/workflows/repo-secrets-smoke.yml

Evidence
@@ -1,322 +0,0 @@ -name: pre-merge
@@ -1,105 +0,0 @@ -name: apple-mini-validate
@@ -1,27 +0,0 @@ -name: repo-secrets-smoke

The entire .github/workflows/pre-merge.yml (322 lines), .github/workflows/apple-mini-validate.yml (105 lines), and .github/workflows/repo-secrets-smoke.yml (27 lines) are deleted.

pre-merge.yml contained the full shadow CI matrix: branch lane selection via forge-github-ci-shim.py, nightly scheduling, staged Linux SSH setup, Apple remote Tailscale joins, and summary jobs. apple-mini-validate.yml was a manual-dispatch workflow for narrow Apple mini validation with sanity and bundle lanes. repo-secrets-smoke.yml was a manual-dispatch workflow that decrypted repo secrets and ran helper tests.

All three are superseded by forge-native orchestration from ci/forge-lanes.toml.

Remove the forge-github-ci-shim bridge script and its tests

Intent: Delete the Python shim that translated ci/forge-lanes.toml into GitHub Actions matrix JSON, along with its test suite. With the GitHub workflows gone, this bridge is no longer needed.

Affected files: scripts/forge-github-ci-shim.py, scripts/test_forge_github_ci_shim.py

Evidence
@@ -1,489 +0,0 @@ deleted file mode 100755 scripts/forge-github-ci-shim.py
@@ -1,459 +0,0 @@ deleted file mode 100644 scripts/test_forge_github_ci_shim.py

The scripts/forge-github-ci-shim.py script (489 lines) provided select and run subcommands that parsed ci/forge-lanes.toml, computed changed paths against a base/head diff, and emitted GitHub Actions matrix JSON via --github-output. Its companion test file scripts/test_forge_github_ci_shim.py (459 lines) is also removed.

References to this shim in ci/forge-lanes.toml path filters (e.g. scripts/forge-github-ci-shim.py as a trigger path for the pikachat-typescript lane) are cleaned up in a subsequent step.

Remove GitHub-specific Apple CI helper scripts

Intent: Delete the GitHub-step wrapper scripts that were used exclusively by the GitHub Actions Apple workflows. The direct pikaci-apple-remote.sh script replaces them.

Affected files: scripts/pikaci-apple-github-step, scripts/with-pikaci-apple-ci-env, scripts/write-pikaci-apple-github-env

Evidence
@@ -1,336 +0,0 @@ deleted file mode 100755 scripts/pikaci-apple-github-step
@@ -1,148 +0,0 @@ deleted file mode 100755 scripts/with-pikaci-apple-ci-env
@@ -1,36 +0,0 @@ deleted file mode 100755 scripts/write-pikaci-apple-github-env

scripts/pikaci-apple-github-step (336 lines) was the GitHub-specific Apple CI orchestrator that handled tailscale-up and remote-run subcommands, mapped sops secrets to env vars, and wrote GITHUB_OUTPUT artifacts. scripts/with-pikaci-apple-ci-env (148 lines) was the secret-loading wrapper that decrypted sops/age secrets and exported them into the subprocess environment. scripts/write-pikaci-apple-github-env (36 lines) wrote Apple CI config to GITHUB_ENV.

All Apple remote CI now goes through ./scripts/pikaci-apple-remote.sh run --just-recipe <recipe> directly, which handles its own secret loading without GitHub-specific plumbing.

Remove pikaci-tools.sh shell library and its tests

Intent: Delete the shared shell library that provided JSON parsing helpers used by the now-removed GitHub workflow scripts.

Affected files: scripts/lib/pikaci-tools.sh, scripts/test_pikaci_tools_json.py

Evidence
@@ -1,103 +0,0 @@ deleted file mode 100644 scripts/lib/pikaci-tools.sh
@@ -1,93 +0,0 @@ deleted file mode 100644 scripts/test_pikaci_tools_json.py

scripts/lib/pikaci-tools.sh (103 lines) provided pikaci_tools_json_string, pikaci_tools_json_object, and pikaci_tools_json_array functions used by the GitHub Apple step scripts to build structured JSON output. scripts/test_pikaci_tools_json.py (93 lines) was its Python test harness.

With the GitHub-specific scripts removed, this library has no remaining consumers.

Remove sops secret helper tests

Intent: Delete the test suite for sops secret decryption helpers that were only exercised through the GitHub workflows.

Affected files: scripts/test_sops_secret_helpers.py

Evidence
@@ -1,93 +0,0 @@ deleted file mode 100644 scripts/test_sops_secret_helpers.py

scripts/test_sops_secret_helpers.py (93 lines) tested the check-repo-secret-files script's sops decryption paths. This was invoked by the now-deleted repo-secrets-smoke.yml workflow. The check-repo-secret-files script itself is also deleted.

Clean forge-lanes.toml path filters and update Apple lane entrypoints

Intent: Remove .github/workflows/pre-merge.yml from trigger path lists across all forge lanes, drop the forge-github-ci-shim.py reference, remove GitHub-only Apple script references, and switch Apple lane commands to the direct pikaci-apple-remote.sh entrypoint.

Affected files: ci/forge-lanes.toml

Evidence
@@ -77,7 +77,6 @@ paths = [
-  ".github/workflows/pre-merge.yml",
@@ -207,10 +203,8 @@ paths = [
-  ".github/workflows/pre-merge.yml",
-  "scripts/forge-github-ci-shim.py",
@@ -225,8 +219,8 @@ paths = [
-entrypoint = "./scripts/pikaci-apple-github-step remote-run --just-recipe apple-host-sanity"
-command = ["./scripts/pikaci-apple-github-step", "remote-run", "--just-recipe", "apple-host-sanity"]
+entrypoint = "./scripts/pikaci-apple-remote.sh run --just-recipe apple-host-sanity"
+command = ["./scripts/pikaci-apple-remote.sh", "run", "--just-recipe", "apple-host-sanity"]
@@ -249,9 +242,7 @@ paths = [
-  "scripts/pikaci-apple-github-step",
-  "scripts/with-pikaci-apple-ci-env",
@@ -372,6 +361,6 @@ concurrency_group = "nightly-android"
-entrypoint = "./scripts/pikaci-apple-github-step remote-run --just-recipe apple-host-bundle"
+entrypoint = "./scripts/pikaci-apple-remote.sh run --just-recipe apple-host-bundle"

Eight lane definitions in ci/forge-lanes.toml had .github/workflows/pre-merge.yml in their paths array; all are removed. The check-pikachat-typescript lane also drops scripts/forge-github-ci-shim.py.

The apple_host_sanity branch lane and nightly_apple_host_bundle nightly lane both switch their entrypoint and command fields from ./scripts/pikaci-apple-github-step remote-run to ./scripts/pikaci-apple-remote.sh run. The Apple sanity lane's path filter also drops scripts/pikaci-apple-github-step and scripts/with-pikaci-apple-ci-env.

Drop shadow_recipe field from pikaci staged Linux target catalog

Intent: Remove the shadow_recipe field from the PikaStagedLinuxTargetConfig struct and all target configurations, since shadow recipes were only used by the GitHub Actions shim.

Affected files: crates/pikaci/src/catalog.rs

Evidence
@@ -27,7 +27,6 @@ pub(crate) struct PikaStagedLinuxTargetConfig {
-    pub shadow_recipe: &'static str,
@@ -242,7 +241,6 @@ impl PikaStagedLinuxTarget {
-                shadow_recipe: "pre-merge-pika-rust-shadow",
@@ -379,7 +369,6 @@ pub(crate) struct PikaStagedLinuxTargetInfoJson {
-    pub shadow_recipe: &'static str,

The shadow_recipe field is removed from three locations:

  1. The PikaStagedLinuxTargetConfig struct definition
  2. Every match arm in PikaStagedLinuxTarget::config() — ten targets total (PreMergePikaRust, PreMergePikaFollowup, PreMergeAgentContracts, PreMergeNotifications, PreMergeFixtureRust, PreMergeRmp, PreMergePikachatRust, PreMergePikachatTypescript, PreMergePikachatOpenclawE2e)
  3. The PikaStagedLinuxTargetInfoJson struct and its From impl

The main.rs entrypoint also removes the line println!("shadow_recipe={}", shell_escape(config.shadow_recipe)); from the target-info subcommand output.

Remove shadow_recipe from pikaci main.rs and update test fixtures

Intent: Clean up the main CLI entrypoint and its inline test to remove references to the deleted GitHub workflow and shadow recipe output.

Affected files: crates/pikaci/src/main.rs

Evidence
@@ -279,7 +279,6 @@ fn main() -> anyhow::Result<()> {
-                println!("shadow_recipe={}", shell_escape(config.shadow_recipe));
@@ -788,7 +787,6 @@ fn target_spec(name: &str) -> anyhow::Result<TargetSpec> {
-                ".github/workflows/pre-merge.yml",
@@ -1822,7 +1820,7 @@ mod tests {
-            ".github/workflows/pre-merge.yml",
+            ".github/workflows/release.yml",

Three changes in crates/pikaci/src/main.rs:

  1. The target-info subcommand no longer emits shadow_recipe=... to stdout
  2. The target_spec function for pre-merge-pikachat-apple-followup drops .github/workflows/pre-merge.yml from its hardcoded filter list
  3. A test assertion that used .github/workflows/pre-merge.yml as a sample path for glob matching is updated to use .github/workflows/release.yml instead (a file that still exists)

Drop shadow_recipe from pikaci model tests

Intent: Remove all shadow_recipe fields and assertions from the model test suite's mirror of the staged Linux target catalog.

Affected files: crates/pikaci/src/model.rs

Evidence
@@ -424,7 +424,6 @@ mod tests {
-        shadow_recipe: &'static str,
@@ -487,7 +486,6 @@ mod tests {
-                    shadow_recipe: "pre-merge-pika-rust-shadow",
@@ -1214,10 +1204,6 @@ mod tests {
-        assert_eq!(
-            notifications_config.shadow_recipe,
-            "pre-merge-notifications-shadow"
-        );
@@ -1335,7 +1312,6 @@ mod tests {
-        let config = lane.target().config();
-        assert_eq!(config.shadow_recipe, "pre-merge-rmp-shadow");

The test-only StagedLinuxRustTargetConfig struct in model.rs tests drops its shadow_recipe field. All ten enum variant configs remove their shadow_recipe values. Six assert_eq! calls that verified shadow_recipe values are deleted across the notifications, followup, fixture, pikachat, pikachat_typescript, pikachat_openclaw, and rmp lane test functions. Two test functions also remove now-unused _config variable bindings.

Update guardrail tests to target forge-only CI artifacts

Intent: Rewrite pikahut guardrail tests that previously validated constraints against .github/workflows/pre-merge.yml to validate against ci/forge-lanes.toml and just/checks.just instead. Remove tests that only made sense with the GitHub workflow in place.

Affected files: crates/pikahut/tests/guardrails.rs

Evidence
@@ -103,14 +103,17 @@ fn extract_pikaci_target_filters
+            if line.contains("filters: &[")
+                || line.contains("filters: static_filters(&[")
+                || line.trim() == "&["
@@ -363,7 +366,7 @@ fn selector_references_in_docs_and_lanes_exist
-        root.join(".github/workflows/pre-merge.yml"),
+        root.join("just/checks.just"),
@@ -395,7 +398,7 @@ fn required_lanes_do_not_regress_to_cli_test_harness
-    let workflow = fs::read_to_string(root.join(".github/workflows/pre-merge.yml"))?;
+    let checks = fs::read_to_string(root.join("just/checks.just"))?;
@@ -965,31 +950,11 @@ fn pre_merge_agent_contracts_filter
-    let pikaci = fs::read_to_string(root.join("crates/pikaci/src/main.rs"))?;
-    let rust_lane_filters = extract_pikaci_target_filters(&pikaci, "pre-merge-agent-contracts");
@@ -1262,25 +1189,6 @@ fn pre_merge_fixture_filter
-fn pre_merge_fixture_remote_lane_skips_fork_pull_requests

Major changes to crates/pikahut/tests/guardrails.rs:

  1. Filter extraction parser updated: extract_pikaci_target_filters now recognizes filters: static_filters(&[ in addition to filters: &[, and the closing-bracket detection handles ]), ]),, and ])}, variants.

  2. Reference scanning pivots: selector_references_in_docs_and_lanes_exist scans just/checks.just instead of .github/workflows/pre-merge.yml.

  3. Regression guard pivots: required_lanes_do_not_regress_to_cli_test_harness reads just/checks.just instead of the workflow file.

  4. Removed cross-validation against pikaci filters: Several tests (pre_merge_pikachat_filter_tracks_checked_in_lane_surface, pre_merge_agent_contracts_filter_tracks_checked_in_lane_surface, pre_merge_notifications_filter_tracks_checked_in_lane_surface, pre_merge_fixture_filter_tracks_checked_in_lane_surface) previously extracted pikaci target filters from main.rs and asserted they were a subset of forge lane paths. These cross-checks are removed — the forge lane paths in ci/forge-lanes.toml are now the single source of truth.

  5. Deleted test: pre_merge_fixture_remote_lane_skips_fork_pull_requests is entirely removed, as it validated GitHub-specific behavior (checking for PIKA_BUILD_SSH_KEY secret references in the workflow).

  6. Apple and infra selector scanning: Updated to scan just/checks.just instead of the workflow file.

Update documentation to reflect forge-only CI model

Intent: Remove all references to GitHub shadow CI, the forge-github-ci-shim, and GitHub-specific Apple CI plumbing from project documentation.

Affected files: docs/agent-ci.md, docs/compatibility-testing-spec.md, docs/pikaci-apple-remote-access.md, docs/rmp-ci.md, docs/testing/ci-selectors.md, docs/testing/integration-matrix.md, crates/pika-git/README.md

Evidence
@@ -1,7 +1,7 @@ docs/agent-ci.md
-  - changing provider CI gating in `.github/workflows/pre-merge.yml`
+  - changing provider CI gating in `ci/forge-lanes.toml`
@@ -11,7 +11,7 @@ docs/agent-ci.md
-These lanes are defined canonically in `ci/forge-lanes.toml` and orchestrated by the forge on `git.pikachat.org`. GitHub mirrors them through `.github/workflows/pre-merge.yml` as advisory shadow CI:
+These lanes are defined canonically in `ci/forge-lanes.toml` and orchestrated by the forge on `git.pikachat.org`.
@@ -55,22 +55,19 @@ docs/pikaci-apple-remote-access.md
-The narrow GitHub live-validation entrypoint is the dedicated `apple-mini-validate` workflow.
+Use the direct Apple remote wrapper when you want the narrow live-validation path:
@@ -294,7 +294,7 @@ docs/compatibility-testing-spec.md
-- `.github/workflows/pre-merge.yml`
+- `ci/forge-lanes.toml`
@@ -13,13 +13,9 @@ docs/rmp-ci.md
-- GitHub workflow: `.github/workflows/pre-merge.yml` as advisory shadow CI
-- GitHub shadow approval gate:

Documentation updates across seven files:

  • agent-ci.md: read_when frontmatter and body text now point to ci/forge-lanes.toml instead of the GitHub workflow. Removes mention of GitHub as advisory shadow CI. Nightly probes section drops "with GitHub mode=nightly as an advisory mirror".

  • compatibility-testing-spec.md: Nightly lane reference updated from .github/workflows/pre-merge.yml to ci/forge-lanes.toml.

  • pikaci-apple-remote-access.md: Replaces the gh workflow run apple-mini-validate.yml examples with direct ./scripts/pikaci-apple-remote.sh run invocations. Removes paragraphs about GitHub workflows mapping AGE_SECRET_KEY to SOPS_AGE_KEY, step-local secret loading via with-pikaci-apple-ci-env, and the GitHub-side dependency on AGE_SECRET_KEY.

  • rmp-ci.md: Removes all GitHub workflow and shadow approval gate references from both pre-merge and nightly sections. Drops the note about forge-github-ci-shim.py.

  • ci-selectors.md: Policy class descriptions change from "GitHub pre-merge" to "canonical forge CI". Apple lane command references switch from pikaci-apple-github-step to pikaci-apple-remote.sh. The "Apple Live Validation Workflow" table section is entirely removed.

  • integration-matrix.md: Similar reference updates.

  • pika-git/README.md: Removes the bullet about GitHub mirroring via forge-github-ci-shim.py.

Update justfile and checks.just recipes

Intent: Remove justfile recipes and references that targeted the deleted GitHub workflow and shim script, and update check recipes accordingly.

Affected files: justfile, just/checks.just

Evidence
@@ -105,11 +105,6 @@ justfile
-pre-merge-pika-rust-shadow:
-    python3 scripts/forge-github-ci-shim.py run --mode branch --lane-id pika_rust
@@ -5,13 +5,6 @@ just/checks.just
-# Run the GitHub CI shim selector for branch mode
-ci-shim-select-branch *ARGS:

The justfile loses several shadow recipes: pre-merge-pika-rust-shadow, pre-merge-pikachat-rust-shadow, pre-merge-agent-contracts-shadow, pre-merge-notifications-shadow, pre-merge-rmp-shadow, and nightly-shadow. These all invoked forge-github-ci-shim.py run --mode branch/nightly --lane-id <id>.

just/checks.just loses the ci-shim-select-branch and ci-shim-select-nightly recipes that wrapped the shim's select subcommand, plus the ci-shim-test recipe that ran the shim's Python test suite.

Update Nix derivation and flake to remove shim dependency

Intent: Remove the forge-github-ci-shim from the Nix CI check derivation's file list and from the flake's lint/check targets.

Affected files: nix/ci/linux-rust.nix, flake.nix

Evidence
@@ -51,7 +51,6 @@ nix/ci/linux-rust.nix
-            scripts/forge-github-ci-shim.py
@@ -318,13 +318,6 @@ flake.nix
-          forgeGithubCiShimTest = pkgs.runCommand

nix/ci/linux-rust.nix removes scripts/forge-github-ci-shim.py from the source file list copied into the CI sandbox.

flake.nix removes the forgeGithubCiShimTest check derivation that ran python3 scripts/test_forge_github_ci_shim.py, the pikaci-tools-json-test derivation that ran scripts/test_pikaci_tools_json.py, and the sopsSecretHelpersTest derivation that ran scripts/test_sops_secret_helpers.py. The shellcheck-scripts derivation is also updated to remove the deleted scripts from its input list.

Remove check-repo-secret-files script

Intent: Delete the repo secret validation script that was only invoked by the deleted repo-secrets-smoke workflow.

Affected files: scripts/check-repo-secret-files

Evidence
@@ -1,57 +0,0 @@ deleted file mode 100755 scripts/check-repo-secret-files

scripts/check-repo-secret-files (57 lines) iterated over sops-encrypted files in the secrets/ directory, decrypted each one, and verified the decryption succeeded. It was invoked exclusively by repo-secrets-smoke.yml. With that workflow gone, the script has no remaining caller.

Diff