Skip to content

test: files/ payload reachability gate — tests/unit/test_files_payload_reachability.py - #155

Merged
castrojo merged 3 commits into
mainfrom
arch/files-payload-reachability
Sep 20, 2026
Merged

castrojo merged 3 commits into
mainfrom
arch/files-payload-reachability

Conversation

@hivecommons-hive

Copy link
Copy Markdown
Contributor

Refactor

Adds one file: tests/unit/test_files_payload_reachability.py. No element,
payload, workflow, or document is modified.

Cluster claimed

  • New file: tests/unit/test_files_payload_reachability.py
  • Read-only inputs: elements/**/*.bst (parsed for kind: local path:
    sources), the files/ tree listing.
  • Not touched: elements/bluefin-server/os-stack.bst,
    elements/oci/k0s-sysext.bst, files/k0s/sysext/k0s-manifests.conf,
    tests/unit/test_k0s_manifests.py, tests/unit/test_kubestellar_kiosk.py,
    .github/scripts/docs-checks.py, files/installer/repart.d/**,
    include/flatcar.yml, elements/flatcar/**, renovate.json, files/bin/**,
    docs/**.

The structural problem

files/ is the image-payload tree. A file reaches an image only when some
element stages it with a kind: local source:

sources:
  - kind: local
    path: files/os/sysupdate.d

Nothing cross-checks the two sides. A directory under files/ that no element
names is invisible to just validate (which only runs bst show --deps all on
oci/bluefin-server-ddi.bst, oci/bluefin-server-installer.bst, and
oci/k0s-sysext.bst), invisible to the image build, and invisible to the unit
suite, because bats tests execute helper scripts straight out of the checkout
whether or not they ship. The reverse direction is equally unguarded: a
renamed payload directory leaves a stale path: on the element and quietly
removes the payload from the image.

files/bin/system-container is the live instance — docs/skills/system-containers.md
calls it "/usr/bin/system-container ... shipped in the OS image" (line 18)
and "The OS image ships a small helper at /usr/bin/system-container" (line 38),
tests/unit/system-container_test.bats covers it, and no element stages it.
Full analysis in #154.

What the gate asserts

  • test_declared_source_paths_exist — every kind: local path: declared by
    any element still exists on disk (parametrized per declared path).
  • test_every_payload_file_is_staged_or_declared — every file under files/
    is staged by an element, declared host tooling, or a recorded waiver.
  • test_host_tooling_declarations_are_not_staleHOST_TOOLING
    (files/bin/bluefin-kubestellar, files/lima) still exists and is still
    unstaged.
  • test_known_unstaged_waivers_are_still_unstagedKNOWN_UNSTAGED is
    shrink-only: staging a waived path fails the gate until the waiver is deleted,
    so the record cannot outlive the bug it describes.
  • test_at_least_one_element_stages_payload — guards the gate itself, so a
    parser regression cannot make it vacuously pass.

KNOWN_UNSTAGED holds exactly one entry, files/bin/system-container, citing
#154. The gate therefore passes today and fails the moment a second orphan
appears.

Deliberately not fixed here

Staging system-container into the image is a behaviour change (it adds a
binary to the shipped OS) and correcting the skill is a documentation decision.
Both belong to a maintainer. This PR only makes the invariant checkable, which
is why it references #154 rather than closing it.

Verification

  • python3 -m pytest tests/unit -q235 passed, 1 xfailed (was 211 passed, 1 xfailed; +24 from this file, all parametrized or new).
  • python3 .github/scripts/docs-checks.pyDocs checks passed.
  • Mutation-tested, each reverted afterwards:
    • added files/os/orphan/thing.conf → fails with
      assert not ['files/os/orphan/thing.conf'];
    • renamed files/os/ssh → fails with elements/bluefin-server/os-sshd-config.bst declares a kind: local source path that does not exist: files/os/ssh;
    • repointed an element at files/bin/system-container → fails with
      files/bin/system-container is now staged by an element. Remove it from KNOWN_UNSTAGED.

Picked up automatically by just test-unit and .github/workflows/unit-tests.yml;
no workflow change needed.

Refs #154 — the gate lands here; deciding whether system-container ships or
the docs are corrected is left open for maintainers.


Filed by architect agent (ACMM L5 — hold-gated mode). Hold-gated: human review required.

— hive: agent=architect backend=copilot model=claude-opus-5

…files_payload_reachability.py

Every path under files/ reaches an image only if some element stages it with a
kind: local source. Nothing cross-checks the two sides, so a payload directory
that no element names is invisible to `just validate` (which runs
`bst show --deps all` on the three oci/ targets only), to the image build, and
to the unit suite, because bats tests run helper scripts out of the checkout
whether or not they ship.

files/bin/system-container is the live instance: docs/skills/system-containers.md
promises it at /usr/bin/system-container in the OS image, it has bats coverage,
and no element stages it.

Add a gate asserting both directions of the contract:

  - every kind: local `path:` declared by an element still exists on disk, so
    renaming payload cannot silently drop it out of the image;
  - every file under files/ is staged, declared host tooling (HOST_TOOLING:
    files/bin/bluefin-kubestellar, files/lima), or a recorded waiver.

KNOWN_UNSTAGED holds exactly files/bin/system-container and is shrink-only:
staging a waived path fails the gate until the waiver is removed, so the record
cannot outlive the bug. The gate is structural only — no element, payload, or
documentation is changed, so /usr/bin/system-container is still absent from the
image until a maintainer decides to stage it or to correct the docs.

Refs #154

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: sec-check[bot] <sec-check[bot]@users.noreply.github.com>
@hivecommons-hive hivecommons-hive Bot added hold Work is intentionally paused. architecture Structural or interface design work. agent/architect Filed or owned by the architect agent. hive/hosted-projectbluefin-knuckle-gjvq Routed by the hosted Project Bluefin Hive deployment. labels Sep 15, 2026
@hivecommons-hive hivecommons-hive Bot changed the title [architect] test: files/ payload reachability gate — tests/unit/test_files_payload_reachability.py test: files/ payload reachability gate — tests/unit/test_files_payload_reachability.py Sep 17, 2026
@hivecommons-hive hivecommons-hive Bot added the agent/scanner Filed or owned by the scanner agent. label Sep 17, 2026
@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

Deferring this PR's red installer-test / Install and boot in QEMU to the shared incident #175.

Baseline evidence — the same check is failing on the default branch main, so the signal is not PR-local:

This is one repository incident, not one failure per PR, so no PR-specific retry or diff repair is appropriate here. This PR stays deferred until installer-test is green on main or #175 closes.

🐝 Hive Agent: scanner | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: unknown

— hive: agent=scanner backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI triage: the red check on this PR is not caused by its diff.

installer-test / Install and boot in QEMU fails in the guest, before anything this PR adds is involved. From the job log:

[ TIME ] Timed out waiting for device /dev/disk/by-partlabel/var.
[DEPEND] Dependency failed for /var.
[DEPEND] Dependency failed for Local File Systems.
ERROR: Timed out after 900s waiting for KubeStellar Console readiness!

The console timeout is downstream of the /var mount never appearing: with Local File Systems failed, the workloads that gate readiness cannot come up. That is a boot/installer partition-labelling defect in the image, and this PR is a tests-only change (tests/unit/test_files_payload_reachability.py) that never executes in the QEMU guest.

It is already owned elsewhere — #167 ("mount /var via filesystem label and provide /bin/sh"), #165 ("cap root-a SizeMaxBytes to 8G to guarantee /var space") and #173 ("remove udevd sysext ordering drop-in to prevent var mount d…") all target this exact failure. Rather than write a fourth implementation of the same fix inside a test PR, this one stands down and waits: it should go green once whichever of those lands.

No change pushed here; the reachability gate itself is unmodified.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: 5ebfeae

— hive: agent=architect backend=copilot model=claude-opus-5

castrojo
castrojo previously approved these changes Sep 18, 2026

@castrojo castrojo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving. The core invariant here is worth having and it is implemented honestly.

I checked the gate actually holds rather than assuming it does: I enumerated every kind: local declaration across elements/**/*.bst against the full files/ listing, and every payload file is genuinely accounted for — by a staged directory, by HOST_TOOLING, or by the single files/bin/system-container waiver. The test passes on the current tree for the right reason.

The strong part is the bidirectional check plus the shrink-only waiver enforcement. test_every_payload_file_is_staged_or_declared is the real gate — a new orphan under files/ fails it. test_declared_source_paths_exist catches rename drift in the other direction. test_known_unstaged_waivers_are_still_unstaged and test_host_tooling_declarations_are_not_stale are the ones I'd have asked for if they weren't here: they make a waiver unable to outlive the bug it was written for, which is a genuine invariant and the usual failure mode of waiver lists. And test_at_least_one_element_stages_payload is a legitimate anti-vacuity guard, because this gate's failure mode is passing silently.

I also like that the PR does not silently "fix" the files/bin/system-container orphan it discovered. Recording it as an explicit waiver rather than quietly staging it is the right instinct.

Two tests I'd prune, and one limitation I'd document. None blocks a tests-only PR, so I am approving rather than holding it, but they are worth a follow-up pass:

  • test_waivers_and_host_tooling_are_disjoint asserts that two module-level literal sets defined forty lines above do not intersect. It cannot fail except by someone typing the same string into both constants in a single edit. That is a tautology over constants, not observable behaviour.
  • test_files_tree_is_present asserts files/ exists and is non-empty. No plausible bug fails this and only this — a repo that deleted files/ would fail the build, just validate, and the anti-vacuity guard immediately beneath it first.

The limitation worth a docstring sentence: _declared_paths() scans every .bst by text regardless of whether that element is reachable from the three OCI targets just validate builds. So an orphaned element still "declares" its path, and a file can be reported reachable while never actually shipping — which is a near neighbour of the bug class the docstring says it closes. State it as a known bound rather than leaving it implied.

Minor: test_declared_source_paths_exist is parametrized on sorted(_declared_paths()) and then calls _declared_paths() again inside the body purely to build the owners message, re-parsing every .bst once per case. Correct, just quadratic YAML parsing for cosmetics — a module-level cache would fix it.

Merge-order interaction worth watching, since this gate newly constrains anything that adds to files/: PR #80 adds new systemd preset payload alongside os-systemd-presets.bst, and a files/ path without a matching kind: local declaration will turn this gate red. #91 (adds files/k0s/sysext/k0s-kiosk-tls.service) and #90 (deletes a manifest) are both safe, since those directories are declared at directory level.

CI: build and unit pass. The only red check is installer-test, which fails on main itself at tip 5ebfeae (run 34920225526) and is unrelated to this change.

Needs one more independent approval under the two-reviewer policy.

Drop test_waivers_and_host_tooling_are_disjoint (a tautology over two
module-level literal sets) and test_files_tree_is_present (subsumed by
the anti-vacuity guard and the build itself). Record in the module
docstring that staging is matched by declaration rather than by graph
reachability from the OCI targets.

Assisted-by: Claude Opus 4.6 via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@castrojo castrojo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-approving after pushing a prune to this branch. My earlier approval was dismissed by that push, so this restores it, and I am explaining what I changed since I am not the author.

What I changed (commit adca828, 013a224..adca828, one file):

Removed two test functions that cannot fail:

  • test_waivers_and_host_tooling_are_disjoint — asserted that HOST_TOOLING & KNOWN_UNSTAGED is empty. Both are module-level literal sets declared about forty lines above the assertion, so nothing observable can break it; only someone typing the same string into both constants in a single edit could. A tautology over constants.
  • test_files_tree_is_present — asserted files/ exists and is non-empty. No plausible bug fails this and only this: a repo that deleted files/ would fail the build, just validate, and test_at_least_one_element_stages_payload directly beneath it first.

I also added one sentence to the module docstring recording a real limitation that was implied but not stated:

Staging is matched by declaration, not by graph reachability: a path named by an element that no OCI target depends on still counts as staged here.

That matters because _declared_paths() scans every elements/**/*.bst by text regardless of whether the element is reachable from the three OCI targets just validate builds — so an orphaned element still "declares" its path, and a file can be reported reachable while never actually shipping. That is adjacent to the bug class the docstring says it closes, and it is better stated than discovered.

What I left untouched. All five load-bearing tests, verbatim: test_every_payload_file_is_staged_or_declared (the gate itself), test_declared_source_paths_exist (rename drift), test_known_unstaged_waivers_are_still_unstaged and test_host_tooling_declarations_are_not_stale (the shrink-only invariant, which is the part I most wanted kept — it stops a waiver outliving the bug it was written for), and test_at_least_one_element_stages_payload (anti-vacuity, legitimate here because this gate's failure mode is passing silently). Both module constants are retained; grep confirms the surviving tests still use them.

Verification, run independently of the change rather than taken on trust: python3 -m pytest tests/unit/test_files_payload_reachability.py -q gives 22 passed, down from 24 — exactly the two removed, neither parametrized. gh pr diff 155 --name-only lists only tests/unit/test_files_payload_reachability.py, and neither removed name appears in the file.

On the PR itself, unchanged from my earlier review: the bidirectional check plus shrink-only waiver enforcement is a genuine invariant worth having, and I particularly like that it records the files/bin/system-container orphan as an explicit waiver rather than quietly staging it to make the gate pass.

Merge-order note still stands: this gate newly constrains anything adding to files/, so #80 — which adds systemd preset payload — needs a matching kind: local declaration or it will turn this red.

CI: build and unit pass. The only red check is installer-test, which fails on main itself and is unrelated.

Needs one more independent approval under the two-reviewer policy.

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI triage: the red check is not caused by this PR, and nothing in this branch can turn it green.

This PR adds exactly one file — tests/unit/test_files_payload_reachability.py
— and the checks split accordingly:

check result
unit pass (229 passed, 1 xfailed locally on this branch)
build pass
installer-test / Install and boot in QEMU fail

What the QEMU job actually failed on

Job 105714003901,
step Install and boot exported server image. The install phase completes and
powers down cleanly; the failure is on the second boot, of the installed
system:

==> Booting the installed server in QEMU (background)...
==> Polling KubeStellar Console readiness at http://127.0.0.1:8080 (deadline: 900s)...
[ TIME ] Timed out waiting for device /dev/disk/by-partlabel/var.
[DEPEND] Dependency failed for /var.
[DEPEND] Dependency failed for Basic System.
[DEPEND] Dependency failed for Multi-User System.
[DEPEND] Dependency failed for Activate k0s sysext on boot.
ERROR: Timed out after 900s waiting for KubeStellar Console readiness!

The console-readiness timeout is a symptom: /dev/disk/by-partlabel/var never
appears, /var fails, and every unit ordered after local-fs.target — including
the k0s sysext activation that serves the console — is cancelled. The 900s poll
then expires. A pytest file under tests/unit/ is not reachable from the image
build or from early boot, so it cannot participate in this.

It is pre-existing on main

Build DDI artifacts (the workflow carrying the installer-test job) is failing
on main itself, not only here — the last several head commits:

2026-09-15T02:11:36Z  failure  Build DDI artifacts  fix(test): preserve installer-created var partition (#157)
2026-09-15T00:44:23Z  failure  Build DDI artifacts  fix(ci): support repart on hosted runners (#152)
2026-09-14T23:46:19Z  failure  Build DDI artifacts  ci: update installer test workflow pin (#151)

This branch already merged main at 013a224, so it carries #157 and still
reproduces — the var-partition work landed there has not closed this path.

Why I am not fixing it here

Making /var appear is an installer/boot change to the shipped image, which is
a behaviour change and outside what a hold-gated architect PR may contain.
Two open PRs already own that ground and should not be duplicated:

Once either lands on main, re-running this PR should clear the check with no
edits here. Keeping hold; no changes pushed.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: adca828

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

The red check on this PR is pre-existing breakage on main, not a regression from this branch.

This PR's diff is a single new file — tests/unit/test_files_payload_reachability.py, 180 additions, 0 deletions. It touches no image content, no installer script, and no workflow. It cannot affect a QEMU install.

Evidence that installer-test / Install and boot in QEMU is already failing on main:

run head sha installer-test / Install and boot in QEMU
34920225526 5ebfeae (this branch's merge base) failure
34914418293 4c1e7a76 failure
34910341724 5c6aa131 failure
34905862943 50be1ed2 failure

In run 34920225526 the job breakdown is build: success, installer-test: failure — the same shape as this PR's run 35375198501, on a commit that contains none of this branch's changes.

The remaining checks here are green: build pass, unit pass. The new suite passes locally as well:

$ python3 -m pytest tests/unit/test_files_payload_reachability.py -q
22 passed

The installer-test job runs through the reusable
projectbluefin/actions/.github/workflows/server-installer-test.yml called from
.github/workflows/build.yml:179, so the fix does not live on this branch.
#181 (fix(ci): make the installer-test readiness gate reachable) is the open PR
addressing it. This PR will go green on a re-run once that lands.

Holding the branch as-is rather than rebasing onto a still-red main.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: adca828

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI status re-verified. This branch already contains the current main tip (5ebfeae, "fix(test): preserve installer-created var partition" #157) — git merge-base --is-ancestor 5ebfeae <head> passes — and installer-test / Install and boot in QEMU still fails. The failure is not reachable from this diff, which is one new file, tests/unit/test_files_payload_reachability.py.

Evidence from the failing job (run 35375198501):

[DEPEND] Dependency failed for /var.
[DEPEND] Dependency failed for Activate k0s sysext on boot.
[DEPEND] Dependency failed for Local File Systems.
[DEPEND] Dependency failed for Basic System.
[DEPEND] Dependency failed for Multi-User System.
ERROR: Timed out after 900s waiting for KubeStellar Console readiness!
ERROR: QEMU smoke failed; retaining artifacts at .../qemu-evidence/bluefin-show-future.RkW0q8
error: recipe `test-installer-artifact` failed with exit code 1

The /var mount fails, every unit ordered after local-fs.target is skipped, the console never comes up, and the 900s readiness wait expires. The same job (Build DDI artifacts) is failing on main itself — the last three main runs (5ebfeae, 4c1e7a7, 5c6aa13) all conclude failure on that workflow while Unit tests, Docs checks and Build Kernel & ZFS are green.

Two open PRs target this exact breakage: #173 (fix(boot): remove udevd sysext ordering drop-in to prevent var mount d…) and #181 (fix(ci): make the installer-test readiness gate reachable). This PR goes green once one of them lands; there is nothing to change here. The unit check, which is the one this PR actually adds to, passes.

Not removing the hold, and not papering over the QEMU failure from inside a unit-test file.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: 5ebfeae

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI triage for the red check on this PR — no change is warranted here.

Failing check: installer-test / Install and boot in QEMU, step Install and boot exported server image.

This failure is pre-existing and repo-wide, not caused by this diff:

  • This PR's diff is exactly one new file, tests/unit/test_files_payload_reachability.py. It touches no element, no payload, no workflow, and no installer path.
  • build passes (50m) and Unit tests passes on this branch — the job this PR actually affects is green.
  • The same job fails on main with the same step: run 34920225526build success, installer-test / Install and boot in QEMU failure. It also fails on essentially every other open PR branch right now (fix/mask-homed-firstboot, feat/flatcar-usr-import, feat/systemd-creds-extensions, fix/track-refs-out-of-pr-path, …).

The installer-test failure is already occupied ground and is being worked separately — #181 (fix(ci): make the installer-test readiness gate reachable) and #162 (fix(luks-e2e)-style VM diagnostics for this same class of silent QEMU/ssh failure). Duplicating a fix for it from this PR would collide with those, so this branch stays as-is: one test file, green on every check it can influence.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: unknown

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI status note (no code change pushed).

The one red check on this PR is `installer-test / Install and boot in QEMU` (Build DDI artifacts). It is not caused by this branch:

  • This PR adds exactly one file, `tests/unit/test_files_payload_reachability.py`. It stages nothing, changes no element, no `files/` payload, and no workflow. The `unit` and `build` checks are both green.
  • The same job is red on `main`: the most recent `Build DDI artifacts` runs on `main` (e.g. fix(test): preserve installer-created var partition (#157), fix(ci): support repart on hosted runners (#152), ci: update installer test workflow pin (#151)) all fail in the same job.
  • The failure signature is a target-image boot failure, not a test failure: the guest drops to You are in emergency mode, with Dependency failed for Local File Systems / Virtual Machine and Container Storage / Flush Journal to Persistent Storage, then ERROR: QEMU smoke failed. Nothing in that path reads the unit-test tree.

No branch-local fix exists for this: the failure lives in the image boot path, and repairing it would mean a behaviour change to the shipped image, which is outside what this PR claims and outside what a hold-gated test-only PR should carry. Repairing the guest boot is already being worked separately (see #181 and #186), so this branch deliberately does not duplicate it.

This PR stays as-is, hold intact, pending human review.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: unknown

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI triage: the red check on this PR is not caused by its diff.

  • This PR adds exactly one file: `tests/unit/test_files_payload_reachability.py`. `unit` and `build` both pass.
  • The failing check is `installer-test / Install and boot in QEMU`, which fails identically on `main` at HEAD `5ebfeae` (run 34920225526, job outcome `failure` for `installer-test / Install and boot in QEMU`). The branch is already an ancestor-complete merge of that same `main`.
  • Failure signature in both cases is in the booted guest, not the test collection: `ERROR: Timed out after 900s waiting for KubeStellar Console readiness!` followed by `[DEPEND] Dependency failed for /var.` and the cascade behind it, then `error: recipe `test-installer-artifact` failed with exit code 1`.

The repair belongs to the boot/readiness path, not here — that ground is already claimed by open PRs (#181 readiness gate reachability, #205 console hydration retry, #173 udevd sysext ordering / var mount). Writing a second fix for it from this PR would duplicate them.

No change pushed to this branch: there is nothing in its diff to repair. It should go green once the installer-test failure is fixed on `main`. Hold label untouched.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: unknown

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

CI status note — the red check on this PR is not caused by this diff.

This PR adds exactly one file, tests/unit/test_files_payload_reachability.py. The checks that exercise it are green:

  • unit (Unit tests) — SUCCESS
  • build (Build DDI artifacts) — SUCCESS

The single failure is installer-test / Install and boot in QEMU, which is base breakage, not a regression here:

  • It has never passed on main since it was introduced in 50be1ed (ci: run installer smoke through shared QEMU workflow #149) — every main run since has failed, and the last green main run predates the job.

  • The failure mode on this run (job 105714003901) is a boot-time storage fault, upstream of anything a test file can touch:

    [ TIME ] Timed out waiting for device /dev/disk/by-partlabel/var.
    [DEPEND] Dependency failed for /var.
    [DEPEND] Dependency failed for Basic System.
    ...
    ERROR: Timed out after 900s waiting for KubeStellar Console readiness!
    

    /var never materialises, so basic.target never comes up and the console the gate polls can never answer. The 900s readiness timeout is the symptom, not the cause.

Both halves of the real fix are already claimed by other open PRs, so this branch deliberately does not touch them:

Pushing an installer or CI change onto this branch would duplicate that work and mix two unrelated clusters into one review, so this PR is left as-is. It should go green once #207 and #181 land and this branch is rebased. The hold label stays on.

🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: unknown

— hive: agent=architect backend=copilot model=claude-opus-5 copilot=1.0.78

@castrojo

Copy link
Copy Markdown
Collaborator

Verified against the Kubernetes cutover branch (#210) before merging: applied this patch on top of that tree and the gate passes 23/23, including the new files/cluster/**, files/kubernetes/** and files/os/libexec/** payload (staged by os-cluster-manifests.bst, os-cluster-bootstrap.bst and oci/kubernetes-sysext.bst respectively). The KNOWN_UNSTAGED waiver for files/bin/system-container still holds — #154 stays open as the decision about whether it ships or the skill is corrected.

@castrojo
castrojo merged commit 115c0da into main Sep 20, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent/architect Filed or owned by the architect agent. agent/scanner Filed or owned by the scanner agent. architecture Structural or interface design work. hive/hosted-projectbluefin-knuckle-gjvq Routed by the hosted Project Bluefin Hive deployment. hold Work is intentionally paused.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant