Files
zeekay b1e9ab409d the job asks for its runner the way the fleet answers
runs-on was a bare scalar. Jobs written that way queue and are never
picked up — link and quest have waited since 10 August, painter since the
5th, none of them with a single success — while repos writing the same
label as a sequence drain within seconds of a push on the same fleet.

Same label, same runners, different shape. It fails silently: nothing errors,
the job simply never starts, so the lane looks configured and does nothing.
2026-08-29 13:35:53 -07:00

88 lines
4.1 KiB
YAML

name: ci
# Native CI on git.hanzo.ai. Runs the SAME lint a contributor runs locally:
#
# python3 scripts/lint-hips.py
#
# This job used to carry its own copy of the checks as an inline heredoc, so the
# gate existed only on Hanzo Git and a failure could not be reproduced without
# pushing. Two implementations of one rule is the defect this repository exists
# to name. There is now one, in scripts/lint-hips.py, and this file calls it.
#
# Every check fires on a defect that was actually present in HIPs/: five specs
# unreachable from the index, two files both claiming hip: 0127, a HIP with no
# status shipping green, 101 H1 headings disagreeing with their own front
# matter, and a second index that described 25 HIPs while 138 existed.
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
jobs:
lint:
runs-on: [hanzo-build-linux-amd64]
steps:
- uses: actions/checkout@v4
# The lint's own test suite runs FIRST. It breaks a scratch copy of the
# corpus 22 ways and requires the lint to report the matching code for
# each, plus asserts that every declared check has a test. A green lint
# whose checks have never been seen to fail is indistinguishable from a
# lint that returns success unconditionally -- which is exactly what the
# GitHub workflow this replaced did.
# The capability list is an INPUT, so it is checked out rather than
# copied here. A snapshot committed into this repo would be a second
# statement of which capabilities exist, and it would drift from the one
# the cloud actually serves -- which is the whole thing the ratchet below
# exists to catch.
- uses: actions/checkout@v4
with:
repository: hanzoai/openapi
path: .capabilities
- name: the lint fails when it should
run: python3 scripts/test-lint-hips.py
- name: every HIP is structurally sound
run: python3 scripts/lint-hips.py
# The index is GENERATED. This regenerates it in memory and fails on any
# difference, so README cannot drift from HIPs/ -- and its own self-test
# runs first, because a generator that silently emits a SHORT table is
# worse than none. Eleven ways to break the corpus, and each must both
# refuse and leave README.md byte-identical.
- name: the generator refuses when it should
env:
HANZO_CAPABILITIES: .capabilities/capabilities.yaml
run: python3 scripts/test-index.py
- name: README is exactly what HIPs/ projects to
env:
HANZO_CAPABILITIES: .capabilities/capabilities.yaml
run: python3 scripts/index.py --check
# One capability, one HIP. The ratchet (capability-coverage.txt) carries
# what has no spec yet and may only SHRINK, so a capability shipping
# without one fails here instead of going unnoticed. coverage.py refuses
# to report at all if it cannot resolve the list -- a coverage gate that
# passes when its input is missing has not been shown to work.
#
# ONE INPUT. This step used to take a second: a checkout of cloud, whose
# manifest coverage.py unioned with the list above, because an app serving
# no HTTP operation (kafka on :9092, zen coresident) could never appear in
# a taxonomy curated over the emitted document. The union is what broke the
# gate -- the two spelt six capabilities differently, so a union of two
# spellings was twelve names for six things and six came back uncovered
# whichever spelling the HIPs carried. `fleet:` is DERIVED from that same
# manifest now, complete for the apps that serve no operation and carrying
# one name each, so the second checkout answers a question nobody asks. It
# also named hanzoai/cloud, the re-rooted OSS core, which carries no
# manifest at all -- so what it actually contributed was an empty set from
# a step allowed to fail.
- name: every capability has a HIP
env:
HANZO_CAPABILITIES: .capabilities/capabilities.yaml
run: python3 scripts/coverage.py