Status: experimental implementation contract
Issue: #596 / C8-D
Authority: rendering only; no filesystem write, GitHub mutation, secret
resolution, dispatch, verification, approval, push, or merge authority. The
rendered workflows themselves hold none of those authorities either, beyond the
narrow, explicit permissions listed below.
C8-D turns the deterministic C8-A bootstrap file plan into the four thin GitHub Actions wrappers a target repository would commit to run IDKMesh without an always-on server.
The renderer lives in idkmesh/github_bootstrap_workflows.py. It consumes a
validated GitHubBootstrapPlan and emits exactly these files, reusing the C8-C
BootstrapRenderedFile shape (path, ownership, overwrite policy, UTF-8 content,
byte size, SHA-256 digest):
| File | Effect (from the plan) | Trigger |
|---|---|---|
.github/workflows/idkmesh-preview.yml |
none |
issues: labeled gated on the idkmesh:preview label, or manual dispatch |
.github/workflows/idkmesh-dispatch.yml |
candidate_dispatch |
manual dispatch only |
.github/workflows/idkmesh-verify.yml |
verification |
manual dispatch only |
.github/workflows/idkmesh-status.yml |
publication |
manual dispatch only |
All four are idkmesh_managed: a later safe re-run (C8-F) may replace one only
while it still matches its retained generated digest.
A wrapper contains no orchestration logic. Each one:
persist-credentials: false);MSKazemi/idkmesh at the bootstrap plan’s --idkmesh-ref (a
release tag or full SHA) into .idkmesh-runtime;python -m idkmesh.cli github-workflow <phase>, with the
runtime directory as the working directory so a same-named package in the
project checkout cannot shadow the pinned IDKMesh.Event data reaches the runner through IDKMESH_* environment variables only.
No expression is ever interpolated into a shell script, and no workflow reads
issue titles, issue bodies, comment bodies, or head refs.
The runner is idkmesh github-workflow {preview,dispatch,verify,status},
implemented in idkmesh/github_workflow_runner.py and specified in
GitHub Workflow Runner. preview and status
are read-only; dispatch and verify fail closed with dispatch_unavailable
and verify_unavailable. Step 4 above still exists so that a wrapper pinned to
an older ref that predates the runner fails loudly with
The pinned IDKMesh ref does not provide the github-workflow runner. instead
of succeeding vacuously. Because apply mode is still disabled, nothing renders
these files into a repository today; they appear only in dry-run output.
The environment names the wrappers pass are the interface the runner
implements (tests/test_github_workflow_runner.py builds each phase’s
environment from the names the rendered wrapper declares): IDKMESH_PROJECT_ROOT, IDKMESH_REPOSITORY, IDKMESH_BASE_SHA,
IDKMESH_RUN_ID, IDKMESH_GITHUB_TOKEN (preview, dispatch, status),
IDKMESH_ISSUE_NUMBER, IDKMESH_EVENT_PATH (preview), IDKMESH_WORK_UNIT_DIGEST
and IDKMESH_CONNECTOR_ID (dispatch), IDKMESH_WORK_UNIT_DIGEST,
IDKMESH_CANDIDATE_SHA and IDKMESH_CANDIDATE_DIR (verify), and
IDKMESH_RUN_REFERENCE (status). Changing any of them is a coordinated change
to the renderer, this specification, and the runner.
Every property below is asserted by tests/test_github_bootstrap_workflows.py;
most are also enforced by the repository’s own governance linter
(idkmesh.github_governance_preflight.lint_workflow_text, see
GitHub Governance Preflight), which finds
nothing in any rendered wrapper.
uses: is a full 40-hex commit SHA with the
upstream tag in a trailing comment (actions/checkout v4,
actions/setup-python v5). One Action resolves to one SHA across the pack.ref: and a header comment
both carry the explicit bootstrap ref. Floating refs are already rejected by
the C8-A plan.permissions: contents: read; each job
restates its own set. Only the status job holds a write permission
(issues: write, for its status comment). No job has contents: write,
pull-requests: write, id-token, or administration access.pull_request, pull_request_target,
workflow_run, push, or schedule trigger. Dispatch, verify, and status
are manual; preview is read-only and label-gated.github.ref is the
plan’s integration branch, so project policy is read from the protected
branch, never from an arbitrary dispatched ref.idkmesh-dispatch
environment so release depends on the owner’s configured protection. The
secret names are derived from the C8-C connector seed’s env: references, so
the profile and the wrapper cannot drift. No value is ever read or rendered.^[0-9a-f]{40}$ before fetching it, checks it out into a separate
directory with no persisted credentials, and holds read-only permissions, no
token, and no secrets.A governance integration check evaluates the rendered dispatch wrapper against
the committed governance-pass-v0.1.json fixture for the
secret_bearing_dispatch and high_risk_dispatch operations, and the other
three wrappers for read_only; all are allowed.
idkmesh init --github --dry-run now also reports the four wrappers. The JSON
form adds rendered_workflow_files beside rendered_config_files, with exact
content, digest, size, ownership, and overwrite metadata. The human form prints
a rendered C8-D workflow wrappers: list of paths and digests. Zero writes,
zero GitHub mutation, zero secret access; apply mode stays fail-closed.
Rendering fails closed with BootstrapRenderError when:
GitHubBootstrapPlan;workflow_plan_mismatch);env:NAME with an
upper-case name (invalid_secret_reference);A plan/renderer mismatch is never treated as permission to omit or add a workflow.
This slice does not:
github-workflow runner (see the runner specification) or any
preview, dispatch, verification, or status behavior;idkmesh-dispatch environment, labels, secrets, or branch
protection (C8-E owner actions);preview and status; dispatch and verify remain
fail-closed until a stateless authority design exists (see the runner
specification).