Skip to content

KYAML step 1/6 — probe whether GitHub Actions parses a KYAML workflow #1020

Description

@hyperpolymath

Step 1 of 6 in the KYAML adoption order fixed by 3-practice/YAML-POLICY.adoc §5
(landed in #1009). Also precondition 1 of §3.3.

Work

Probe whether GitHub Actions parses a KYAML workflow.

Gate (§5)

One real workflow converted to KYAML on a scratch branch spawns jobs >= 1
and completes. jobs=0 is a failure of the probe, not a flaky run.

✅ RESULT — gate PASSED, measured 2026-09-22

Ran on hyperpolymath/pons-asinorum, branch probe/kyaml-parse, commit ac2c614.

The specific way this could have failed. kubectl -o kyaml quotes the trigger
key — it emits "on": "push", quoting "on" (and "n") because YAML 1.1 reads
bare on as boolean true. So every KYAML workflow says "on":, and had GitHub
looked up the normalised key true, a quoted "on" would be a different key
⇒ no trigger ⇒ jobs=0.

Two arms, one commit, semantically identical (verified by diffing both through
yq -o=json -P 'sort_keys(..)' — equal after normalising only the arm labels), so
any difference is attributable to syntax alone:

arm syntax run jobs step marker in log
control plain YAML 35794781121 1 PROBE_YAML_ARM_EXECUTED found
subject KYAML, kubectl dialect 35794781018 1 PROBE_KYAML_ARM_EXECUTED found

Confounds excluded by construction. jobs=0 is this estate's startup-death
signature and has several unrelated causes, so a bare zero would have been
unattributable. pons has no actions.lock, and neither arm carries a uses:,
so the absent-from-lock startup death could not have produced the result. The
plain-YAML control is what makes a non-zero meaningful.

Why the log marker, not the green square. conclusion=success alone proves
nothing — a green run can execute nothing. Each arm echoes a unique string and
both were grepped out of the run logs, which is what turns the square into evidence.

Scope of this result

This settles the parser dimension and nothing else. actionlint support,
gh actions-lock's extractor (it reads step-level uses:; flow-style mappings
are untested against it), the estate's own yq-based gates, and reviewability all
remain open — they belong to steps 3 and 6, not here.

Closing as complete: the gate is met with measured evidence.


🤖 Generated with Claude Code

https://claude.ai/code/session_01WRvDivYwLSeVCJUrfjic3f

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions