SKILL.md
HeyEddi CI Config
Authors a correct eddi-ci.yaml for HeyEddi Reviewer / optional Spot runners. Do not invent knobs from memory.
Safety
- Never merge a PR without authorize merge in the current turn; never write
auto_merge - Billable knobs and Spot
pipelinejobs need explicit opt-in - Always
loadpolicycontractbefore authoring - Spot runners are fail-closed / placeholder — declare YAML only; never claim jobs ran (
@heyeddi-ci-runners)
Knowledge rule (mandatory)
The skill package does not ship a full knob table. On every run:
- Run
loadpolicycontract(orpython …/scripts/loadpolicycontract.py). - Treat the returned
guide,knobs,rules, andminimal_exampleas authoritative. - Prefer human docs for narrative:
docs_url(default https://ci.heyeddi.com/docs#policy). - Read
context/ANTI_PATTERNS.mdfor durable safety rules that never go stale.
Contract feed (production): https://cihook.heyeddi.com/api/public/eddi-ci-policy
Fallback order inside the script: local heyeddi-ci checkout → HEYEDDICIPOLICY_URL / production API → docs page text.
Decision gate: add the file or not (mandatory)
Missing eddi-ci.yaml is not a defect. Safe defaults already apply (runners off, oncifailure off). Decide before writing anything:
Write / create eddi-ci.yaml only when at least one is true
- User explicitly asks to create, add, or configure
eddi-ci.yaml inspectreporeportsheyeddiproduct.usesheyeddiproduct: true— the repo already uses a HeyEddi product (see signals below). Then add a Reviewer-only safe file (billable knobs off,pipeline: {}) unless the user declines.- User wants Reviewer policy beyond defaults (e.g.
allowexternalprs, highervalidationmaxattempts, document team rules) - User wants Spot / isolated runners (
pipeline:jobs) and accepts that those jobs need real commands + path filters - User is following the HeyEddi PR CTA and confirms they want to configure now (CTA alone ≠ auto-write; ask once if intent is unclear)
HeyEddi product signals (from inspectrepo → heyeddiproduct.evidence):
.heyeddi/workspace present.agents/skills/heyeddi-*installedskills-lock.jsonpinsHeyEddi-com/heyeddi-skills(legacyHeyEddi-com/skillsstill counts)PRODUCT.md/.heyeddi/product.md/README.md/ package identity mention HeyEddi
Do not create the file when
- The only signal is “file is missing” and no HeyEddi product markers
- User only wants a normal code review and never opted into config / not a HeyEddi project
- User declines after you explain that defaults are already safe
- You would have to invent test commands or path filters to fill
pipeline(still OK to add Reviewer-only YAML without pipeline jobs)
If not adding
Explain briefly: HeyEddi already runs with safe defaults; they can invoke @heyeddi-ci-config later when they want policy or runners. Stop. Do not write the file.
If updating an existing file
Edit only when the user asked to change policy/runners, or when fixing invalid YAML they already committed. Do not “improve” an untouched valid config unprompted.
When to use this skill
- Any of the “write / create” conditions above
- User asks how
eddi-ci.yamlworks (load contract + explain; create only if they then opt in)
When not to use
Do not invent a config pass just because the file is absent.
Instructions
- Run
inspectrepoand apply the decision gate (includingheyeddiproduct). If not adding, explain and stop. - If adding because HeyEddi product was detected: default to Reviewer-only safe YAML; ask before enabling runners or
oncifailure. - If adding/updating for other reasons: confirm intent — Reviewer-only policy vs runners vs both.
- Load the live contract via
loadpolicycontract. - Finish repo inspect for languages / real test commands when runners are in scope. Do not invent
pytest/npm testwithout evidence. - Confirm billable knobs against the contract: keep
aireview.onci_failurefalse unless the user explicitly opts in; addpipelinejobs only when runners are wanted and commands are known. - Write
eddi-ci.yamlat the repo root using only keys from the contract knobs. - Prefer empty
pipeline: {}unless runners are requested and path filters are known. - Tell the user to commit/push; HeyEddi App lints the file when it changes on a PR.
Tools
| Tool | Purpose |
|---|---|
loadpolicycontract |
Fetch living knobs/guide/rules/example |
inspect_repo |
HeyEddi product detection + languages / likely test cmds |
Examples
Reviewer-only (safe)
After loading the contract, write the contract’s minimal_example (or equivalent) with billable knobs off.
Runners when requested
Only after inspectrepo (or equivalent) shows real commands and path prefixes, add pipeline jobs with filter.paths. Never enable onci_failure without explicit opt-in.
Notes
- Unknown top-level keys fail schema (
extra=forbid). - Invalid YAML → App ignores file and uses safe defaults.
- See
context/EXAMPLES.mdfor shapes; always re-check knobs fromloadpolicycontract.