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
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)
✅ RESULT — gate PASSED, measured 2026-09-22
Ran on
hyperpolymath/pons-asinorum, branchprobe/kyaml-parse, commitac2c614.The specific way this could have failed.
kubectl -o kyamlquotes the triggerkey — it emits
"on": "push", quoting"on"(and"n") because YAML 1.1 readsbare
onas booleantrue. So every KYAML workflow says"on":, and had GitHublooked 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), soany difference is attributable to syntax alone:
PROBE_YAML_ARM_EXECUTEDfoundkubectldialectPROBE_KYAML_ARM_EXECUTEDfoundConfounds excluded by construction.
jobs=0is this estate's startup-deathsignature and has several unrelated causes, so a bare zero would have been
unattributable. pons has no
actions.lock, and neither arm carries auses:,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=successalone provesnothing — 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.
actionlintsupport,gh actions-lock's extractor (it reads step-leveluses:; flow-style mappingsare 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