Norms for rules

Because rules are source code or shell commands, they don’t come with a lot of built-in guardrails. Rules are expected to behave themselves, which in a nutshell means:

  • Rules should be idempotent

  • Regarding files in repo

    • Only modify (or create or delete) files under the working dir they’re started in

    • Only read the files they declare as inputs (regardless of scope)

    • Only write the files they declare as outputs (regardless of scope)

  • Regarding external state (that is, outside the repo including state held in other services or elsewhere on disk)

    • Read whatever external state you want

    • Write external state only when the env var ICK_APPLY is set – this disables much of the parallelism in the name of getting the semantics right, because we don’t know if there’s a way to undo.

Ick promises that once a rule starts running, the working copy won’t be further modified by ick. You might have multiple simultaneous runs of the same scope=file rule in the same working copy, if there’s reason to.