dorfl 0.14.2 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advance-ci-template.d.ts +17 -16
- package/dist/advance-ci-template.d.ts.map +1 -1
- package/dist/advance-ci-template.js +42 -53
- package/dist/advance-ci-template.js.map +1 -1
- package/dist/advance-drivers.d.ts +8 -0
- package/dist/advance-drivers.d.ts.map +1 -1
- package/dist/advance-drivers.js +28 -4
- package/dist/advance-drivers.js.map +1 -1
- package/dist/advance-isolated.d.ts.map +1 -1
- package/dist/advance-isolated.js +3 -2
- package/dist/advance-isolated.js.map +1 -1
- package/dist/advance-lifecycle-template.d.ts +41 -40
- package/dist/advance-lifecycle-template.d.ts.map +1 -1
- package/dist/advance-lifecycle-template.js +309 -489
- package/dist/advance-lifecycle-template.js.map +1 -1
- package/dist/advance-loop-driver.d.ts.map +1 -1
- package/dist/advance-loop-driver.js +3 -2
- package/dist/advance-loop-driver.js.map +1 -1
- package/dist/advance-treeless-publish.d.ts +31 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -1
- package/dist/advance-treeless-publish.js +40 -0
- package/dist/advance-treeless-publish.js.map +1 -1
- package/dist/advance.d.ts +63 -3
- package/dist/advance.d.ts.map +1 -1
- package/dist/advance.js +80 -12
- package/dist/advance.js.map +1 -1
- package/dist/advancing-lock.d.ts +9 -0
- package/dist/advancing-lock.d.ts.map +1 -1
- package/dist/advancing-lock.js +21 -1
- package/dist/advancing-lock.js.map +1 -1
- package/dist/agent-env.d.ts +61 -0
- package/dist/agent-env.d.ts.map +1 -0
- package/dist/agent-env.js +144 -0
- package/dist/agent-env.js.map +1 -0
- package/dist/agent-stop.d.ts +35 -0
- package/dist/agent-stop.d.ts.map +1 -1
- package/dist/agent-stop.js +62 -0
- package/dist/agent-stop.js.map +1 -1
- package/dist/apply-merge-action.d.ts +76 -34
- package/dist/apply-merge-action.d.ts.map +1 -1
- package/dist/apply-merge-action.js +339 -129
- package/dist/apply-merge-action.js.map +1 -1
- package/dist/apply-stuck-action.js +2 -2
- package/dist/apply-stuck-action.js.map +1 -1
- package/dist/ci-agent-result.d.ts +151 -0
- package/dist/ci-agent-result.d.ts.map +1 -0
- package/dist/ci-agent-result.js +314 -0
- package/dist/ci-agent-result.js.map +1 -0
- package/dist/ci-handoff-apply.d.ts +162 -0
- package/dist/ci-handoff-apply.d.ts.map +1 -0
- package/dist/ci-handoff-apply.js +497 -0
- package/dist/ci-handoff-apply.js.map +1 -0
- package/dist/ci-handoff-format.d.ts +369 -0
- package/dist/ci-handoff-format.d.ts.map +1 -0
- package/dist/ci-handoff-format.js +646 -0
- package/dist/ci-handoff-format.js.map +1 -0
- package/dist/ci-handoff-lfs.d.ts +146 -0
- package/dist/ci-handoff-lfs.d.ts.map +1 -0
- package/dist/ci-handoff-lfs.js +397 -0
- package/dist/ci-handoff-lfs.js.map +1 -0
- package/dist/ci-handoff.d.ts +99 -0
- package/dist/ci-handoff.d.ts.map +1 -0
- package/dist/ci-handoff.js +277 -0
- package/dist/ci-handoff.js.map +1 -0
- package/dist/ci-lock-outputs.d.ts +93 -0
- package/dist/ci-lock-outputs.d.ts.map +1 -0
- package/dist/ci-lock-outputs.js +223 -0
- package/dist/ci-lock-outputs.js.map +1 -0
- package/dist/ci-phase-build.d.ts +178 -0
- package/dist/ci-phase-build.d.ts.map +1 -0
- package/dist/ci-phase-build.js +989 -0
- package/dist/ci-phase-build.js.map +1 -0
- package/dist/ci-phase-driver.d.ts +247 -0
- package/dist/ci-phase-driver.d.ts.map +1 -0
- package/dist/ci-phase-driver.js +370 -0
- package/dist/ci-phase-driver.js.map +1 -0
- package/dist/ci-phase-intake.d.ts +172 -0
- package/dist/ci-phase-intake.d.ts.map +1 -0
- package/dist/ci-phase-intake.js +555 -0
- package/dist/ci-phase-intake.js.map +1 -0
- package/dist/ci-phase-tasking.d.ts +205 -0
- package/dist/ci-phase-tasking.d.ts.map +1 -0
- package/dist/ci-phase-tasking.js +906 -0
- package/dist/ci-phase-tasking.js.map +1 -0
- package/dist/ci-phase-treeless.d.ts +224 -0
- package/dist/ci-phase-treeless.d.ts.map +1 -0
- package/dist/ci-phase-treeless.js +1482 -0
- package/dist/ci-phase-treeless.js.map +1 -0
- package/dist/ci-read-token.d.ts +47 -0
- package/dist/ci-read-token.d.ts.map +1 -0
- package/dist/ci-read-token.js +80 -0
- package/dist/ci-read-token.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +447 -22
- package/dist/cli.js.map +1 -1
- package/dist/close-job-template.d.ts +10 -1
- package/dist/close-job-template.d.ts.map +1 -1
- package/dist/close-job-template.js +46 -14
- package/dist/close-job-template.js.map +1 -1
- package/dist/close-job.d.ts +20 -5
- package/dist/close-job.d.ts.map +1 -1
- package/dist/close-job.js +65 -12
- package/dist/close-job.js.map +1 -1
- package/dist/complete.d.ts.map +1 -1
- package/dist/complete.js +20 -1
- package/dist/complete.js.map +1 -1
- package/dist/config.d.ts +41 -44
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -4
- package/dist/config.js.map +1 -1
- package/dist/continue-branch.d.ts +63 -15
- package/dist/continue-branch.d.ts.map +1 -1
- package/dist/continue-branch.js +75 -8
- package/dist/continue-branch.js.map +1 -1
- package/dist/crashed-run-save.d.ts +73 -0
- package/dist/crashed-run-save.d.ts.map +1 -0
- package/dist/crashed-run-save.js +86 -0
- package/dist/crashed-run-save.js.map +1 -0
- package/dist/cwd-section.d.ts.map +1 -1
- package/dist/cwd-section.js +10 -2
- package/dist/cwd-section.js.map +1 -1
- package/dist/decision-engine.d.ts +10 -0
- package/dist/decision-engine.d.ts.map +1 -1
- package/dist/decision-engine.js.map +1 -1
- package/dist/do-config.d.ts +2 -24
- package/dist/do-config.d.ts.map +1 -1
- package/dist/do-config.js +1 -33
- package/dist/do-config.js.map +1 -1
- package/dist/do.d.ts +149 -1
- package/dist/do.d.ts.map +1 -1
- package/dist/do.js +115 -25
- package/dist/do.js.map +1 -1
- package/dist/dorfl-item-template.d.ts +98 -0
- package/dist/dorfl-item-template.d.ts.map +1 -0
- package/dist/dorfl-item-template.js +504 -0
- package/dist/dorfl-item-template.js.map +1 -0
- package/dist/env-config.d.ts.map +1 -1
- package/dist/env-config.js +7 -5
- package/dist/env-config.js.map +1 -1
- package/dist/frontmatter.d.ts +52 -0
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +136 -2
- package/dist/frontmatter.js.map +1 -1
- package/dist/gc.d.ts +13 -0
- package/dist/gc.d.ts.map +1 -1
- package/dist/gc.js +16 -2
- package/dist/gc.js.map +1 -1
- package/dist/git.d.ts +18 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +70 -5
- package/dist/git.js.map +1 -1
- package/dist/harness.d.ts +44 -5
- package/dist/harness.d.ts.map +1 -1
- package/dist/harness.js +24 -1
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/install-ci-action-pins.d.ts +123 -0
- package/dist/install-ci-action-pins.d.ts.map +1 -0
- package/dist/install-ci-action-pins.js +190 -0
- package/dist/install-ci-action-pins.js.map +1 -0
- package/dist/install-ci-actions-pr-creation.d.ts +70 -0
- package/dist/install-ci-actions-pr-creation.d.ts.map +1 -0
- package/dist/install-ci-actions-pr-creation.js +106 -0
- package/dist/install-ci-actions-pr-creation.js.map +1 -0
- package/dist/install-ci-capabilities/dorfl-item.d.ts +12 -0
- package/dist/install-ci-capabilities/dorfl-item.d.ts.map +1 -0
- package/dist/install-ci-capabilities/dorfl-item.js +26 -0
- package/dist/install-ci-capabilities/dorfl-item.js.map +1 -0
- package/dist/install-ci-core.d.ts +155 -37
- package/dist/install-ci-core.d.ts.map +1 -1
- package/dist/install-ci-core.js +304 -200
- package/dist/install-ci-core.js.map +1 -1
- package/dist/install-ci-github.d.ts +47 -2
- package/dist/install-ci-github.d.ts.map +1 -1
- package/dist/install-ci-github.js +113 -1
- package/dist/install-ci-github.js.map +1 -1
- package/dist/install-ci.d.ts +25 -6
- package/dist/install-ci.d.ts.map +1 -1
- package/dist/install-ci.js +72 -36
- package/dist/install-ci.js.map +1 -1
- package/dist/intake-marker.d.ts +6 -1
- package/dist/intake-marker.d.ts.map +1 -1
- package/dist/intake-marker.js.map +1 -1
- package/dist/intake-triage.d.ts.map +1 -1
- package/dist/intake-triage.js +6 -2
- package/dist/intake-triage.js.map +1 -1
- package/dist/intake-trigger-template.d.ts +31 -25
- package/dist/intake-trigger-template.d.ts.map +1 -1
- package/dist/intake-trigger-template.js +107 -292
- package/dist/intake-trigger-template.js.map +1 -1
- package/dist/intake.d.ts +186 -4
- package/dist/intake.d.ts.map +1 -1
- package/dist/intake.js +533 -416
- package/dist/intake.js.map +1 -1
- package/dist/integration-core.d.ts +154 -1
- package/dist/integration-core.d.ts.map +1 -1
- package/dist/integration-core.js +759 -486
- package/dist/integration-core.js.map +1 -1
- package/dist/integrator.d.ts +12 -0
- package/dist/integrator.d.ts.map +1 -1
- package/dist/integrator.js +21 -0
- package/dist/integrator.js.map +1 -1
- package/dist/isolation.d.ts +12 -2
- package/dist/isolation.d.ts.map +1 -1
- package/dist/isolation.js +19 -8
- package/dist/isolation.js.map +1 -1
- package/dist/item-lock.d.ts +93 -11
- package/dist/item-lock.d.ts.map +1 -1
- package/dist/item-lock.js +233 -65
- package/dist/item-lock.js.map +1 -1
- package/dist/land-question-residue.d.ts +58 -0
- package/dist/land-question-residue.d.ts.map +1 -0
- package/dist/land-question-residue.js +95 -0
- package/dist/land-question-residue.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +16 -0
- package/dist/lifecycle-gather.d.ts.map +1 -1
- package/dist/lifecycle-gather.js +54 -6
- package/dist/lifecycle-gather.js.map +1 -1
- package/dist/merge-answer.d.ts +41 -0
- package/dist/merge-answer.d.ts.map +1 -0
- package/dist/merge-answer.js +60 -0
- package/dist/merge-answer.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +105 -30
- package/dist/merge-question-surfacer.d.ts.map +1 -1
- package/dist/merge-question-surfacer.js +202 -91
- package/dist/merge-question-surfacer.js.map +1 -1
- package/dist/merge-question-tick.d.ts +64 -0
- package/dist/merge-question-tick.d.ts.map +1 -0
- package/dist/merge-question-tick.js +96 -0
- package/dist/merge-question-tick.js.map +1 -0
- package/dist/mint-adr.d.ts.map +1 -1
- package/dist/mint-adr.js +20 -2
- package/dist/mint-adr.js.map +1 -1
- package/dist/needs-attention.d.ts +72 -2
- package/dist/needs-attention.d.ts.map +1 -1
- package/dist/needs-attention.js +275 -38
- package/dist/needs-attention.js.map +1 -1
- package/dist/phase-recorder.d.ts +168 -0
- package/dist/phase-recorder.d.ts.map +1 -0
- package/dist/phase-recorder.js +218 -0
- package/dist/phase-recorder.js.map +1 -0
- package/dist/phase.d.ts +94 -0
- package/dist/phase.d.ts.map +1 -0
- package/dist/phase.js +148 -0
- package/dist/phase.js.map +1 -0
- package/dist/pi-harness.d.ts.map +1 -1
- package/dist/pi-harness.js +19 -6
- package/dist/pi-harness.js.map +1 -1
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +4 -0
- package/dist/prepare.js.map +1 -1
- package/dist/prompt.d.ts +4 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +48 -1
- package/dist/prompt.js.map +1 -1
- package/dist/protocol/CLAIM-PROTOCOL.md +3 -1
- package/dist/protocol/WORK-CONTRACT.md +1 -1
- package/dist/reap-branches.d.ts +48 -0
- package/dist/reap-branches.d.ts.map +1 -1
- package/dist/reap-branches.js +64 -0
- package/dist/reap-branches.js.map +1 -1
- package/dist/ref-write.d.ts +198 -0
- package/dist/ref-write.d.ts.map +1 -0
- package/dist/ref-write.js +79 -0
- package/dist/ref-write.js.map +1 -0
- package/dist/repo-config.js +8 -8
- package/dist/repo-config.js.map +1 -1
- package/dist/repo-mirror.d.ts +36 -0
- package/dist/repo-mirror.d.ts.map +1 -1
- package/dist/repo-mirror.js +91 -1
- package/dist/repo-mirror.js.map +1 -1
- package/dist/review-verdict.d.ts +1 -1
- package/dist/review-verdict.js +1 -1
- package/dist/run.d.ts +7 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +28 -4
- package/dist/run.js.map +1 -1
- package/dist/scan.d.ts +19 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +21 -8
- package/dist/scan.js.map +1 -1
- package/dist/sidecar.d.ts +14 -0
- package/dist/sidecar.d.ts.map +1 -1
- package/dist/sidecar.js +21 -0
- package/dist/sidecar.js.map +1 -1
- package/dist/single-job-warning.d.ts +63 -0
- package/dist/single-job-warning.d.ts.map +1 -0
- package/dist/single-job-warning.js +110 -0
- package/dist/single-job-warning.js.map +1 -0
- package/dist/skills/setup/protocol/CLAIM-PROTOCOL.md +3 -1
- package/dist/skills/setup/protocol/WORK-CONTRACT.md +1 -1
- package/dist/spec-complete.d.ts +13 -6
- package/dist/spec-complete.d.ts.map +1 -1
- package/dist/spec-complete.js +23 -11
- package/dist/spec-complete.js.map +1 -1
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +47 -14
- package/dist/start.js.map +1 -1
- package/dist/status.d.ts +12 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +11 -3
- package/dist/status.js.map +1 -1
- package/dist/tasking.d.ts +246 -1
- package/dist/tasking.d.ts.map +1 -1
- package/dist/tasking.js +452 -358
- package/dist/tasking.js.map +1 -1
- package/dist/triage-persist.d.ts.map +1 -1
- package/dist/triage-persist.js +21 -2
- package/dist/triage-persist.js.map +1 -1
- package/dist/verify-workflow-template.d.ts.map +1 -1
- package/dist/verify-workflow-template.js +8 -4
- package/dist/verify-workflow-template.js.map +1 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +4 -0
- package/dist/verify.js.map +1 -1
- package/dist/watch-session.d.ts +42 -13
- package/dist/watch-session.d.ts.map +1 -1
- package/dist/watch-session.js +52 -23
- package/dist/watch-session.js.map +1 -1
- package/dist/work-layout.d.ts +10 -4
- package/dist/work-layout.d.ts.map +1 -1
- package/dist/work-layout.js +11 -3
- package/dist/work-layout.js.map +1 -1
- package/dist/workspace.d.ts +65 -4
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +159 -11
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
- package/src/advance-ci-template.ts +80 -81
- package/src/advance-drivers.ts +45 -6
- package/src/advance-isolated.ts +3 -5
- package/src/advance-lifecycle-template.ts +375 -538
- package/src/advance-loop-driver.ts +3 -5
- package/src/advance-treeless-publish.ts +61 -0
- package/src/advance.ts +145 -15
- package/src/advancing-lock.ts +36 -1
- package/src/agent-env.ts +174 -0
- package/src/agent-stop.ts +81 -0
- package/src/apply-merge-action.ts +401 -154
- package/src/apply-stuck-action.ts +2 -2
- package/src/ci-agent-result.ts +421 -0
- package/src/ci-handoff-apply.ts +737 -0
- package/src/ci-handoff-format.ts +926 -0
- package/src/ci-handoff-lfs.ts +519 -0
- package/src/ci-handoff.ts +392 -0
- package/src/ci-lock-outputs.ts +273 -0
- package/src/ci-phase-build.ts +1328 -0
- package/src/ci-phase-driver.ts +548 -0
- package/src/ci-phase-intake.ts +861 -0
- package/src/ci-phase-tasking.ts +1255 -0
- package/src/ci-phase-treeless.ts +2028 -0
- package/src/ci-read-token.ts +90 -0
- package/src/cli.ts +591 -29
- package/src/close-job-template.ts +52 -15
- package/src/close-job.ts +77 -12
- package/src/complete.ts +19 -1
- package/src/config.ts +43 -48
- package/src/continue-branch.ts +121 -16
- package/src/crashed-run-save.ts +162 -0
- package/src/cwd-section.ts +10 -0
- package/src/decision-engine.ts +10 -0
- package/src/do-config.ts +2 -57
- package/src/do.ts +170 -28
- package/src/dorfl-item-template.ts +556 -0
- package/src/env-config.ts +7 -5
- package/src/frontmatter.ts +155 -2
- package/src/gc.ts +27 -2
- package/src/git.ts +83 -5
- package/src/harness.ts +58 -6
- package/src/index.ts +50 -1
- package/src/install-ci-action-pins.ts +209 -0
- package/src/install-ci-actions-pr-creation.ts +186 -0
- package/src/install-ci-capabilities/dorfl-item.ts +33 -0
- package/src/install-ci-core.ts +388 -233
- package/src/install-ci-github.ts +149 -1
- package/src/install-ci.ts +83 -37
- package/src/intake-marker.ts +6 -1
- package/src/intake-triage.ts +7 -3
- package/src/intake-trigger-template.ts +126 -327
- package/src/intake.ts +725 -544
- package/src/integration-core.ts +975 -523
- package/src/integrator.ts +28 -0
- package/src/isolation.ts +29 -10
- package/src/item-lock.ts +308 -92
- package/src/land-question-residue.ts +122 -0
- package/src/lifecycle-gather.ts +82 -10
- package/src/merge-answer.ts +82 -0
- package/src/merge-question-surfacer.ts +320 -112
- package/src/merge-question-tick.ts +182 -0
- package/src/mint-adr.ts +28 -2
- package/src/needs-attention.ts +350 -42
- package/src/phase-recorder.ts +350 -0
- package/src/phase.ts +177 -0
- package/src/pi-harness.ts +25 -5
- package/src/prepare.ts +4 -0
- package/src/prompt.ts +68 -1
- package/src/reap-branches.ts +107 -0
- package/src/ref-write.ts +324 -0
- package/src/repo-config.ts +8 -8
- package/src/repo-mirror.ts +107 -1
- package/src/review-verdict.ts +1 -1
- package/src/run.ts +47 -6
- package/src/scan.ts +37 -7
- package/src/sidecar.ts +36 -0
- package/src/single-job-warning.ts +135 -0
- package/src/spec-complete.ts +36 -14
- package/src/start.ts +55 -16
- package/src/status.ts +29 -3
- package/src/tasking.ts +593 -378
- package/src/triage-persist.ts +24 -2
- package/src/verify-workflow-template.ts +8 -4
- package/src/verify.ts +4 -0
- package/src/watch-session.ts +86 -28
- package/src/work-layout.ts +11 -3
- package/src/workspace.ts +210 -14
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
* `advance-lifecycle-template.ts` / `advance-ci-template.ts` (the package depends on
|
|
8
8
|
* NO YAML lib, so the checks are presence/shape assertions over the raw text). It
|
|
9
9
|
* ALSO carries the PURE intake-flags DERIVATION ({@link deriveIntakeFlags}) —
|
|
10
|
-
* CI's merge-vs-propose POLICY
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* CI's merge-vs-propose POLICY. Since the CI split (task
|
|
11
|
+
* `ci-split-generate-workflows`) the workflow no longer derives it in a shell
|
|
12
|
+
* step: the called `dorfl-item.yml` lock job derives the same rule from trusted
|
|
13
|
+
* inputs (`ci-phase-intake.ts`: the event's author association, `dorfl.json`
|
|
14
|
+
* at the base). The DOCUMENT mode is the resolved `intakeIntegration`
|
|
15
|
+
* (operator/config); author-trust drives ONLY the origin-trust stamp +
|
|
13
16
|
* placement, never the mode.
|
|
14
17
|
*
|
|
15
18
|
* SCOPE FENCE (spec Out-of-Scope): the issue→artifact TRANSFORM engine is
|
|
@@ -22,8 +25,10 @@
|
|
|
22
25
|
* RESOLVED design decisions in the task):
|
|
23
26
|
*
|
|
24
27
|
* - TRIGGERS: `issues` opened, `issue_comment` created, and a label
|
|
25
|
-
* (`dorfl:intake`).
|
|
26
|
-
*
|
|
28
|
+
* (`dorfl:intake`). Its one job calls `dorfl-item.yml` with
|
|
29
|
+
* `item: issue:<N>` (lock, agent, apply; decision 10 of ADR
|
|
30
|
+
* `ci-agent-job-holds-no-write-token`), which runs `intake <N>` (EXPLICIT,
|
|
31
|
+
* four-outcome dispatch) — never a bare slug.
|
|
27
32
|
* - EVENT→`IntakeEventKind` MAPPING (Decision 2: no edit-detection): only a
|
|
28
33
|
* CREATED `issue_comment` (and an opened issue / the label) drives
|
|
29
34
|
* (re-)evaluation; an EDITED comment is NOT a trigger (the ID-based
|
|
@@ -58,16 +63,18 @@
|
|
|
58
63
|
* overlapping ticks on the SAME issue; the `processing` lock / claim CAS is the
|
|
59
64
|
* real cross-run serialiser.
|
|
60
65
|
* - The running CI job NEVER edits `.github/workflows/**` (US #9): it requests NO
|
|
61
|
-
* `workflows` permission and cannot rewrite its own triggers. It
|
|
66
|
+
* `workflows` permission and cannot rewrite its own triggers. It grants
|
|
62
67
|
* `contents: write` + `pull-requests: write` (emit/propose the artifact) +
|
|
63
|
-
* `issues: write` (post the clarifying/review comment back)
|
|
68
|
+
* `issues: write` (post the clarifying/review comment back) + `actions` and
|
|
69
|
+
* `checks: read` (the apply job tells a timed-out agent job from a
|
|
70
|
+
* cancelled one), which the called workflow's jobs narrow per job.
|
|
64
71
|
*
|
|
65
72
|
* The structural validator is the dependency-free counterpart of "the workflow
|
|
66
73
|
* parses + carries the right discipline" the task's acceptance criteria require;
|
|
67
74
|
* the test generates this artifact under `--fake` and asserts every invariant.
|
|
68
75
|
*/
|
|
69
76
|
import { brand } from './brand.js';
|
|
70
|
-
import {
|
|
77
|
+
import { ITEM_WORKFLOW_CALLER_PERMISSIONS, itemCallSecrets, } from './dorfl-item-template.js';
|
|
71
78
|
/** The capability id (the registry key + the emitted workflow file stem). */
|
|
72
79
|
export const INTAKE_TRIGGER_CAPABILITY_ID = 'intake';
|
|
73
80
|
/** The wizard-facing label for the issue-intake capability. */
|
|
@@ -99,9 +106,10 @@ export const TRUSTED_AUTHOR_ASSOCIATIONS = [
|
|
|
99
106
|
* DERIVE the per-outcome file-emit modes + the origin-trust stamp — CI's intake
|
|
100
107
|
* POLICY (ADR `untrusted-origin-carries-via-stamp-not-forced-staging`; spec
|
|
101
108
|
* `intake-integration-knob-and-specs-land-in-proposed-rename` US #1/#2). This is
|
|
102
|
-
* the load-bearing pure
|
|
103
|
-
* resolved `intakeIntegration ?? integration`
|
|
104
|
-
* MODE, and `author_association` off the event payload for the STAMP
|
|
109
|
+
* the load-bearing pure rule the intake lock job applies at runtime (it reads
|
|
110
|
+
* the resolved `intakeIntegration ?? integration` from `dorfl.json` at the base
|
|
111
|
+
* for the MODE, and `author_association` off the event payload for the STAMP;
|
|
112
|
+
* `ci-phase-intake.ts`):
|
|
105
113
|
*
|
|
106
114
|
* - **DOCUMENT mode (spec = task)** — the resolved `intakeIntegration` value, a
|
|
107
115
|
* SINGLE mode applied to BOTH the spec and task document: `merge` ⇒
|
|
@@ -162,27 +170,22 @@ export function isAuthorTrusted(authorAssociation) {
|
|
|
162
170
|
// ─── The workflow generator ──────────────────────────────────────────────────
|
|
163
171
|
/**
|
|
164
172
|
* Generate the intake-trigger workflow YAML. Deterministic: the same config
|
|
165
|
-
* produces byte-identical output.
|
|
166
|
-
* policy is env/config, so the artifact carries no config-derived policy beyond
|
|
167
|
-
* the env-block scaffolding) — `config` is accepted for parity with the
|
|
168
|
-
* `CapabilityEmitter` seam and future per-config wiring, but the intake-trigger
|
|
169
|
-
* shape itself is config-independent.
|
|
173
|
+
* produces byte-identical output.
|
|
170
174
|
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
175
|
+
* THE SPLIT (spec `ci-agent-job-without-write-token`, decision 10 of ADR
|
|
176
|
+
* `ci-agent-job-holds-no-write-token`; task `ci-split-generate-workflows`): the
|
|
177
|
+
* one job CALLS the per-item workflow `dorfl-item.yml` with
|
|
178
|
+
* `item: issue:<N>`, under this workflow's per-issue concurrency group. Its lock
|
|
179
|
+
* job (write token, no agent) takes the `processing` label and DERIVES the
|
|
180
|
+
* intake policy itself: the origin-trust stamp from this run's event
|
|
181
|
+
* (`comment.author_association`, else `issue.author_association`; a called
|
|
182
|
+
* workflow sees its caller's event) and the document mode from
|
|
183
|
+
* `intakeIntegration ?? integration` in `dorfl.json` at the base, the same rule
|
|
184
|
+
* {@link deriveIntakeFlags} states. The decision agent runs in the agent job
|
|
185
|
+
* (read-only token), and the apply job (write token, no agent) posts the
|
|
186
|
+
* comment or integrates the document.
|
|
181
187
|
*/
|
|
182
188
|
export function generateIntakeWorkflow(config) {
|
|
183
|
-
// `intake <N>` runs the prompt→verdict decision (the agent), so it needs the
|
|
184
|
-
// provider secret(s) forwarded to `$GITHUB_ENV` by the setup action.
|
|
185
|
-
const setupWith = providerSecretsWithBlock(config);
|
|
186
189
|
return `\
|
|
187
190
|
# dorfl — the ISSUE INTAKE trigger in CI (capability D: consider incoming
|
|
188
191
|
# issues → task/spec, PLUS insertion point E: surface the review verdict into the
|
|
@@ -197,6 +200,14 @@ export function generateIntakeWorkflow(config) {
|
|
|
197
200
|
# findings as questions back into THIS issue thread via the issue-comment seam (insertion
|
|
198
201
|
# point E) — REUSED, not a new review mechanism.
|
|
199
202
|
#
|
|
203
|
+
# THE SPLIT (ADR ci-agent-job-holds-no-write-token): ANY GitHub user can write
|
|
204
|
+
# the issue text the decision agent reads, so the agent never shares a job with
|
|
205
|
+
# a write token. The one job below calls dorfl-item.yml with
|
|
206
|
+
# \`item: issue:<N>\`: a LOCK job (write token, no agent: takes the \`processing\`
|
|
207
|
+
# label), an AGENT job (read-only token, no persisted credential: runs the
|
|
208
|
+
# decision) and an APPLY job (write token, no agent: validates the agent's
|
|
209
|
+
# handoff as hostile, then comments or integrates the document).
|
|
210
|
+
#
|
|
200
211
|
# TRIGGERS (capability D): an OPENED issue, a CREATED issue comment, and the
|
|
201
212
|
# \`${INTAKE_TRIGGER_LABEL}\` label. A CREATED comment is the (re-)evaluation
|
|
202
213
|
# trigger; an EDITED comment is deliberately NOT a trigger (the ID-based
|
|
@@ -206,31 +217,29 @@ export function generateIntakeWorkflow(config) {
|
|
|
206
217
|
# re-evaluation (a fresh id the watermark catches). There is NO edit-detection /
|
|
207
218
|
# \`updated_at\` / body-hash tracking.
|
|
208
219
|
#
|
|
209
|
-
# THE DOCUMENT MODE is \`intakeIntegration\`; AUTHOR-TRUST → PLACEMENT + the STAMP
|
|
210
|
-
# the
|
|
211
|
-
#
|
|
212
|
-
#
|
|
213
|
-
#
|
|
214
|
-
#
|
|
215
|
-
#
|
|
216
|
-
#
|
|
217
|
-
#
|
|
218
|
-
#
|
|
219
|
-
#
|
|
220
|
-
# \`
|
|
221
|
-
#
|
|
222
|
-
#
|
|
223
|
-
#
|
|
224
|
-
# AND of who filed the issue — so a repo can have autonomy AND merged documents.
|
|
220
|
+
# THE DOCUMENT MODE is \`intakeIntegration\`; AUTHOR-TRUST → PLACEMENT + the STAMP.
|
|
221
|
+
# Both are derived by the item's LOCK job from trusted inputs, never from the
|
|
222
|
+
# agent: the document merge-vs-propose mode is the resolved
|
|
223
|
+
# \`intakeIntegration ?? integration\` in dorfl.json at the base (an
|
|
224
|
+
# operator/config choice, a SINGLE value applied to BOTH the task and spec
|
|
225
|
+
# document, DECOUPLED from the autonomy gates; spec
|
|
226
|
+
# intake-integration-knob-and-specs-land-in-proposed-rename), and the
|
|
227
|
+
# origin-trust stamp comes from THIS run's event: an author outside
|
|
228
|
+
# OWNER/MEMBER/COLLABORATOR (\`comment.author_association\`, else
|
|
229
|
+
# \`issue.author_association\`) is untrusted (ADR
|
|
230
|
+
# untrusted-origin-carries-via-stamp-not-forced-staging). Author-trust drives
|
|
231
|
+
# only (1) the \`originTrust\` STAMP on the emitted document and (2), via that
|
|
232
|
+
# stamp, which PLACEMENT default the document lands in; the untrusted safety is
|
|
233
|
+
# the CARRIED stamp (it forces the later BUILD to a code PR) plus the placement
|
|
234
|
+
# default, not a forced document PR.
|
|
225
235
|
#
|
|
226
236
|
# CI runs IN-PLACE (the CI container IS the isolation): NO --isolated/--remote/
|
|
227
237
|
# registry (laptop-only affordances). The PER-ISSUE concurrency group below
|
|
228
238
|
# serialises overlapping ticks on the SAME issue; the \`processing\` lock / claim
|
|
229
239
|
# CAS is the real cross-run serialiser.
|
|
230
240
|
#
|
|
231
|
-
# SAFETY (US #9):
|
|
232
|
-
#
|
|
233
|
-
# its own triggers.
|
|
241
|
+
# SAFETY (US #9): no job requests a \`workflows\` permission, so none can
|
|
242
|
+
# rewrite its own triggers.
|
|
234
243
|
|
|
235
244
|
name: intake
|
|
236
245
|
|
|
@@ -253,39 +262,14 @@ on:
|
|
|
253
262
|
# triggers landing close together must not run intake on one issue twice at once).
|
|
254
263
|
# The \`processing\` lock / claim CAS is the real cross-run serialiser; this just
|
|
255
264
|
# avoids redundant concurrent ticks. Keyed by the issue number so DIFFERENT issues
|
|
256
|
-
# still run in parallel.
|
|
265
|
+
# still run in parallel. One intake run carries exactly one issue, so no
|
|
266
|
+
# parallelism slot applies here.
|
|
257
267
|
concurrency:
|
|
258
268
|
group: intake-\${{ github.event.issue.number }}
|
|
259
269
|
cancel-in-progress: false
|
|
260
270
|
|
|
261
|
-
#
|
|
262
|
-
|
|
263
|
-
# the artifact; \`issues: write\` posts the clarifying/review comment back into the
|
|
264
|
-
# thread (insertion point E). It never rewrites its triggers.
|
|
265
|
-
permissions:
|
|
266
|
-
contents: write
|
|
267
|
-
pull-requests: write
|
|
268
|
-
issues: write
|
|
269
|
-
|
|
270
|
-
# ── The intake DOCUMENT mode is resolved FROM CONFIG, not carried here ───────
|
|
271
|
-
# CI is NOT a special policy surface (ADR ci-config-policy-and-gate-family §5):
|
|
272
|
-
# it runs the SAME engine config, resolved through flag > env > per-repo > global
|
|
273
|
-
# > default. The SAME dorfl.json the laptop uses applies here. This workflow emits
|
|
274
|
-
# NO DORFL_AUTO_BUILD / DORFL_AUTO_TASK line (ADR
|
|
275
|
-
# untrusted-origin-carries-via-stamp-not-forced-staging: hardcoding them here made
|
|
276
|
-
# the env layer OUTRANK the committed dorfl.json — the shadowing bug). So the env
|
|
277
|
-
# layer carries NO config default; the policy step below READS the resolved intake
|
|
278
|
-
# DOCUMENT mode \`intakeIntegration ?? integration\` via \`dorfl config --json\` (the
|
|
279
|
-
# mechanism \`advance\` already uses), so your committed dorfl.json wins (then the
|
|
280
|
-
# global config, then the built-in default \`propose\`). To land intake documents on
|
|
281
|
-
# main, set \`intakeIntegration: merge\` (or \`integration: merge\`) in dorfl.json
|
|
282
|
-
# (applies everywhere) — NOT by re-running install-ci (ADR §6: install-ci is
|
|
283
|
-
# one-time). The autonomy gates \`autoBuild\`/\`autoTask\` are DECOUPLED from the
|
|
284
|
-
# document mode (spec intake-integration-knob-and-specs-land-in-proposed-rename):
|
|
285
|
-
# they gate autonomy only and are NOT read here. \`intake\` itself is GATE-FREE (the
|
|
286
|
-
# explicit invocation is its own authorization); CI READS only the resolved
|
|
287
|
-
# \`intakeIntegration\`/\`integration\` to DERIVE the merge-vs-propose document flags
|
|
288
|
-
# below (the merge-vs-propose POLICY).
|
|
271
|
+
# Nothing at workflow level: the calling job grants what dorfl-item.yml needs.
|
|
272
|
+
permissions: {}
|
|
289
273
|
|
|
290
274
|
jobs:
|
|
291
275
|
intake:
|
|
@@ -293,124 +277,15 @@ jobs:
|
|
|
293
277
|
# comment on a PR also fires \`issue_comment\`; skip those — there is no issue to
|
|
294
278
|
# intake). \`pull_request\` is absent on a real issue comment.
|
|
295
279
|
if: \${{ github.event.issue.number && !github.event.issue.pull_request }}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
# The intake POLICY, executed at runtime — the SAME rule
|
|
306
|
-
# \`deriveIntakeFlags\` unit-tests (they cannot desync; the test asserts this
|
|
307
|
-
# shell matches the function). The DOCUMENT mode is the resolved
|
|
308
|
-
# \`intakeIntegration ?? integration\` (operator/config), DECOUPLED from the
|
|
309
|
-
# autonomy gates; author-trust drives ONLY the stamp + placement (ADR
|
|
310
|
-
# untrusted-origin-carries-via-stamp-not-forced-staging; spec
|
|
311
|
-
# intake-integration-knob-and-specs-land-in-proposed-rename):
|
|
312
|
-
# * DOCUMENT mode (spec = task) — config-derived: --merge-* iff the
|
|
313
|
-
# resolved intakeIntegration is merge, else --propose-*. A SINGLE
|
|
314
|
-
# value applied to BOTH the spec and task document. autoBuild/
|
|
315
|
-
# autoTask are NOT read (they gate autonomy only).
|
|
316
|
-
# * ORIGIN-TRUST stamp — the ONLY thing author-trust drives: --origin-trust
|
|
317
|
-
# untrusted iff the author is not OWNER/MEMBER/COLLABORATOR, which
|
|
318
|
-
# \`intake\`'s dispatch reads to select the untrusted PLACEMENT
|
|
319
|
-
# default and to force the later BUILD to a code PR.
|
|
320
|
-
# author_association comes from the COMMENT on an \`issue_comment\` event,
|
|
321
|
-
# else the ISSUE on an \`issues\` event — read straight off the payload, no
|
|
322
|
-
# extra API call.
|
|
323
|
-
env:
|
|
324
|
-
AUTHOR_ASSOCIATION: \${{ github.event.comment.author_association || github.event.issue.author_association }}
|
|
325
|
-
run: |
|
|
326
|
-
set -euo pipefail
|
|
327
|
-
|
|
328
|
-
# Read the RESOLVED intake DOCUMENT mode from the committed config via
|
|
329
|
-
# \`dorfl config --json\` (the mechanism \`advance\` already uses), NOT a
|
|
330
|
-
# hardcoded DORFL_* env (ADR
|
|
331
|
-
# untrusted-origin-carries-via-stamp-not-forced-staging: an env default
|
|
332
|
-
# would OUTRANK dorfl.json — the shadowing bug). In-place, so the
|
|
333
|
-
# resolution chain reads THIS repo's dorfl.json exactly like the laptop.
|
|
334
|
-
# \`intakeIntegration\` is OPTIONAL (unset ⇒ falls back to \`integration\`),
|
|
335
|
-
# so read \`.intakeIntegration // .integration\` in ONE jq expression — the
|
|
336
|
-
# shell twin of the \`intakeIntegration ?? integration\` the CLI applies.
|
|
337
|
-
# The autonomy gates (autoBuild/autoTask) are DECOUPLED from the document
|
|
338
|
-
# mode (spec intake-integration-knob-and-specs-land-in-proposed-rename):
|
|
339
|
-
# they gate autonomy only and are NOT read here.
|
|
340
|
-
config_json="$(dorfl config --json)"
|
|
341
|
-
intake_integration="$(echo "\${config_json}" | jq -r '.intakeIntegration // .integration')"
|
|
342
|
-
|
|
343
|
-
# DOCUMENT mode: config-derived from the single \`intakeIntegration ??
|
|
344
|
-
# integration\` value, applied to BOTH the spec and task document (US #1
|
|
345
|
-
# chose one intake knob, not a per-type split). merge ⇒ --merge-*,
|
|
346
|
-
# else --propose-*. Author-trust does NOT bite the mode (ADR
|
|
347
|
-
# untrusted-origin-carries-via-stamp-not-forced-staging): an untrusted
|
|
348
|
-
# author's DOCUMENT merges just like a trusted one; the untrusted safety
|
|
349
|
-
# is the stamp + placement below, not a document PR.
|
|
350
|
-
if [ "\${intake_integration}" = "merge" ]; then
|
|
351
|
-
spec_flag="--merge-spec"
|
|
352
|
-
task_flag="--merge-task"
|
|
353
|
-
else
|
|
354
|
-
spec_flag="--propose-spec"
|
|
355
|
-
task_flag="--propose-task"
|
|
356
|
-
fi
|
|
357
|
-
|
|
358
|
-
# Author-trust: TRUSTED iff OWNER/MEMBER/COLLABORATOR (admin / write-
|
|
359
|
-
# collaborator — the whole signal). Anything else (incl. empty) is
|
|
360
|
-
# UNTRUSTED. It drives ONLY the origin-trust stamp below (NOT the modes).
|
|
361
|
-
trusted="false"
|
|
362
|
-
case "\${AUTHOR_ASSOCIATION:-}" in
|
|
363
|
-
OWNER|MEMBER|COLLABORATOR) trusted="true" ;;
|
|
364
|
-
esac
|
|
365
|
-
|
|
366
|
-
# ORIGIN-TRUST stamp — the SOLE thing author-trust drives on the wire
|
|
367
|
-
# (task untrusted-origin-forces-build-propose). \`intake\` STAMPS this
|
|
368
|
-
# onto the emitted spec/task frontmatter (origin: issue + originTrust:
|
|
369
|
-
# <value>); its dispatch reads the stamp to (1) select the untrusted-side
|
|
370
|
-
# PLACEMENT default (\`untrusted*LandIn\`) and (2) force the later BUILD of
|
|
371
|
-
# an untrusted task to a code PR. It does NOT re-resolve trust (that is
|
|
372
|
-
# CI's policy, passed IN). The stamp SURVIVES the merge boundary so a
|
|
373
|
-
# later auto-task/auto-build of an untrusted-origin artifact still forces
|
|
374
|
-
# a human becomes-code checkpoint (the laundering gap is closed).
|
|
375
|
-
if [ "\${trusted}" = "true" ]; then
|
|
376
|
-
origin_trust_flag="--origin-trust=trusted"
|
|
377
|
-
else
|
|
378
|
-
origin_trust_flag="--origin-trust=untrusted"
|
|
379
|
-
fi
|
|
380
|
-
|
|
381
|
-
echo "spec_flag=\${spec_flag}" >> "\$GITHUB_OUTPUT"
|
|
382
|
-
echo "task_flag=\${task_flag}" >> "\$GITHUB_OUTPUT"
|
|
383
|
-
echo "origin_trust_flag=\${origin_trust_flag}" >> "\$GITHUB_OUTPUT"
|
|
384
|
-
echo "intake policy: intakeIntegration='\${intake_integration}' author_association='\${AUTHOR_ASSOCIATION:-}' trusted=\${trusted} → \${spec_flag} \${task_flag} \${origin_trust_flag}"
|
|
385
|
-
|
|
386
|
-
- name: intake the issue (four-outcome dispatch; surfaces the review verdict into the thread)
|
|
387
|
-
# In-place in this checkout (no --isolated/--remote): the CI container IS
|
|
388
|
-
# the isolation. EXPLICIT \`intake <N>\`, never a bare slug. The per-outcome
|
|
389
|
-
# flags carry the (intakeIntegration-derived) document modes + the
|
|
390
|
-
# origin-trust stamp derived above (author-trust drives only the stamp +
|
|
391
|
-
# placement, not the document merge-vs-propose; the autonomy gates drive
|
|
392
|
-
# neither). \`intake\` runs the
|
|
393
|
-
# lone-task review/edit loop and posts its findings as questions back into
|
|
394
|
-
# THIS issue thread (insertion point E) through the issue-comment seam —
|
|
395
|
-
# CI surfaces E by invoking intake; it adds no new review mechanism.
|
|
396
|
-
#
|
|
397
|
-
# Every value reaches the shell through \`env:\` as DATA and is read back as a
|
|
398
|
-
# quoted variable, never as \`\${{ }}\` text spliced into the script
|
|
399
|
-
# (GitHub's script-injection guidance). The issue number is an integer and
|
|
400
|
-
# the policy outputs are fixed flags today; routing them through env anyway
|
|
401
|
-
# keeps "no \`\${{ }}\` inside \`run:\`" a rule with no exceptions.
|
|
402
|
-
env:
|
|
403
|
-
GH_TOKEN: \${{ secrets.GITHUB_TOKEN }}
|
|
404
|
-
ISSUE_NUMBER: \${{ github.event.issue.number }}
|
|
405
|
-
SPEC_FLAG: \${{ steps.policy.outputs.spec_flag }}
|
|
406
|
-
TASK_FLAG: \${{ steps.policy.outputs.task_flag }}
|
|
407
|
-
ORIGIN_TRUST_FLAG: \${{ steps.policy.outputs.origin_trust_flag }}
|
|
408
|
-
run: |
|
|
409
|
-
dorfl intake "\${ISSUE_NUMBER}" \\
|
|
410
|
-
"\${SPEC_FLAG}" \\
|
|
411
|
-
"\${TASK_FLAG}" \\
|
|
412
|
-
"\${ORIGIN_TRUST_FLAG}" \\
|
|
413
|
-
--arbiter origin
|
|
280
|
+
# The union of what dorfl-item.yml's jobs request (a called workflow can
|
|
281
|
+
# only narrow this): the lock and apply jobs write (the \`processing\` label,
|
|
282
|
+
# the comment back into the thread = insertion point E, the document PR or
|
|
283
|
+
# merge); apply reads the agent job's check runs (a timeout vs a cancel).
|
|
284
|
+
permissions:
|
|
285
|
+
${ITEM_WORKFLOW_CALLER_PERMISSIONS}
|
|
286
|
+
uses: ./.github/workflows/dorfl-item.yml
|
|
287
|
+
with:
|
|
288
|
+
item: issue:\${{ github.event.issue.number }}${itemCallSecrets(config, false)}
|
|
414
289
|
`;
|
|
415
290
|
}
|
|
416
291
|
/**
|
|
@@ -435,114 +310,52 @@ export function validateIntakeWorkflow(text) {
|
|
|
435
310
|
.split('\n')
|
|
436
311
|
.filter((line) => !/^\s*#/.test(line))
|
|
437
312
|
.join('\n');
|
|
438
|
-
// ---
|
|
439
|
-
require('
|
|
440
|
-
'
|
|
441
|
-
// The issue number rides the explicit
|
|
442
|
-
//
|
|
443
|
-
require('intake-explicit-issue-number',
|
|
444
|
-
'(`github.event.issue.number
|
|
445
|
-
// No
|
|
446
|
-
//
|
|
447
|
-
require('
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
require('
|
|
454
|
-
|
|
313
|
+
// --- CALLS the per-item workflow with `item: issue:<N>` (decision 10) -------
|
|
314
|
+
require('calls-item-workflow', /\n {4}uses: \.\/\.github\/workflows\/dorfl-item\.yml\n/.test(operative), 'the intake job must call the per-item workflow ' +
|
|
315
|
+
'(`uses: ./.github/workflows/dorfl-item.yml`: lock, agent, apply).');
|
|
316
|
+
// The issue number rides the explicit `issue:<N>` item id from the event
|
|
317
|
+
// payload (the issue under intake) — never a bare slug.
|
|
318
|
+
require('intake-explicit-issue-number', /\n {6}item: issue:\$\{\{ github\.event\.issue\.number \}\}\n/.test(operative), 'the item must be the explicit `issue:<N>` id ' +
|
|
319
|
+
'(`item: issue:${{ github.event.issue.number }}`).');
|
|
320
|
+
// No agent verb runs in THIS workflow: the decision agent runs in the called
|
|
321
|
+
// workflow's agent job (read-only token).
|
|
322
|
+
require('no-agent-verbs', !/dorfl (?:do|advance|intake|run)\b/.test(operative), 'the intake workflow must run no dorfl verb itself: `intake` runs in the ' +
|
|
323
|
+
"called workflow's lock, agent and apply jobs.");
|
|
324
|
+
// The caller grants the union of what the called jobs request.
|
|
325
|
+
require('caller-grants-item-scopes', /\n {4}permissions:\n {6}contents: write\n {6}issues: write\n {6}pull-requests: write\n {6}actions: read\n {6}checks: read\n/.test(operative), 'the calling job must grant every scope a job of dorfl-item.yml requests ' +
|
|
326
|
+
'(`contents`, `issues`, `pull-requests: write`; `actions`, `checks: read`).');
|
|
327
|
+
require('workflow-permissions-empty', /^permissions: \{\}$/m.test(text), 'the workflow must grant nothing at workflow level (`permissions: {}`).');
|
|
328
|
+
require('secrets-explicit', !/secrets:\s*inherit\b/.test(operative), 'secrets reach the called workflow explicitly, never `secrets: inherit`.');
|
|
329
|
+
require('no-pr-identity-token', !/DORFL_GH_TOKEN/.test(operative), 'intake keeps the built-in token for its writes (no DORFL_GH_TOKEN is ' +
|
|
330
|
+
'passed to the called workflow).');
|
|
455
331
|
// --- TRIGGERS: issues opened + issue_comment created + the label ------------
|
|
456
332
|
require('trigger-issues-opened', /\bissues:\s*[\s\S]*?types:\s*[\s\S]*?-\s*opened\b/.test(text), 'must trigger on an OPENED issue (`on.issues.types: [opened]`).');
|
|
457
333
|
require('trigger-issue-comment-created', /\bissue_comment:\s*[\s\S]*?types:\s*[\s\S]*?-\s*created\b/.test(text), 'must trigger on a CREATED issue comment ' +
|
|
458
334
|
'(`on.issue_comment.types: [created]`) — the (re-)evaluation trigger.');
|
|
459
335
|
require('trigger-label', /\bissues:\s*[\s\S]*?types:\s*[\s\S]*?-\s*labeled\b/.test(text), 'must trigger on a label (`on.issues.types: [labeled]`).');
|
|
336
|
+
// A comment on a PR also fires `issue_comment`: there is no issue to intake.
|
|
337
|
+
require('skips-pull-request-comments', /if: \$\{\{ github\.event\.issue\.number && !github\.event\.issue\.pull_request \}\}/.test(operative), 'the intake job must skip a comment on a pull request (no issue to intake).');
|
|
460
338
|
// --- Decision 2: a CREATED comment triggers; an EDITED comment does NOT ------
|
|
461
|
-
// The `issue_comment` trigger must NOT list `edited` (no edit-detection); and
|
|
462
|
-
// there must be no `updated_at`/body-hash edit-tracking wiring.
|
|
463
339
|
require('no-comment-edited-trigger', !/issue_comment:\s*[\s\S]*?types:\s*[\s\S]*?-\s*edited\b/.test(text), 'the `issue_comment` trigger must NOT include `edited` (Decision 2: no ' +
|
|
464
340
|
'edit-detection; a CREATED comment is the (re-)evaluation trigger).');
|
|
465
341
|
require('no-edit-tracking', !/updated_at|body-hash|bodyHash/.test(operative), 'must NOT implement `updated_at` / body-hash edit-tracking (Decision 2).');
|
|
466
|
-
// The "post a NEW comment to signal an edit" CONVENTION must be documented in
|
|
467
|
-
// the workflow so a human knows how to re-trigger after editing a comment.
|
|
468
342
|
require('documents-new-comment-convention', /post a NEW comment/i.test(text), 'must DOCUMENT the "post a new comment to signal an edit" convention ' +
|
|
469
343
|
'(Decision 2) so a human knows how to drive re-evaluation.');
|
|
470
|
-
// ---
|
|
471
|
-
// The
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
// Trust = OWNER/MEMBER/COLLABORATOR (the whole signal).
|
|
475
|
-
require('trust-owner-member-collaborator', /OWNER\|MEMBER\|COLLABORATOR|OWNER[\s\S]{0,40}MEMBER[\s\S]{0,40}COLLABORATOR/.test(text), 'author-trust must be OWNER/MEMBER/COLLABORATOR (admin / write-collaborator ' +
|
|
476
|
-
'— the whole signal; Decision 1).');
|
|
477
|
-
// The DOCUMENT mode is intakeIntegration-DERIVED (spec
|
|
478
|
-
// intake-integration-knob-and-specs-land-in-proposed-rename; the autonomy gates
|
|
479
|
-
// no longer bite it): the derivation must be able to emit both task modes
|
|
480
|
-
// (merge iff the resolved intakeIntegration is merge, else propose).
|
|
481
|
-
require('derives-propose-task', /--propose-task\b/.test(operative), 'the policy derivation must be able to emit `--propose-task` (the ' +
|
|
482
|
-
'intakeIntegration-propose path).');
|
|
483
|
-
require('derives-merge-task', /--merge-task\b/.test(operative), 'the policy derivation must be able to emit `--merge-task` (the ' +
|
|
484
|
-
'intakeIntegration-merge path; a task DOCUMENT merges regardless of the ' +
|
|
485
|
-
'autonomy gates or author-trust).');
|
|
486
|
-
// --merge-spec is emitted when the resolved intakeIntegration is merge (the
|
|
487
|
-
// SAME single value as the task; the gates do not bite it).
|
|
488
|
-
require('derives-merge-spec', /--merge-spec\b/.test(operative), 'the policy derivation must be able to emit `--merge-spec` (the ' +
|
|
489
|
-
'intakeIntegration-merge path).');
|
|
490
|
-
require('derives-propose-spec', /--propose-spec\b/.test(operative), 'the policy derivation must be able to emit `--propose-spec` (the ' +
|
|
491
|
-
'intakeIntegration-propose path).');
|
|
492
|
-
// ORIGIN-TRUST stamp (task untrusted-origin-forces-build-propose): the shell
|
|
493
|
-
// must derive `--origin-trust <trusted|untrusted>` from the author-trust case
|
|
494
|
-
// (independent of the document mode) and pass it to `intake` so the emitted
|
|
495
|
-
// artifact is stamped (the stamp is the SOLE thing author-trust drives).
|
|
496
|
-
require('derives-origin-trust-untrusted', /--origin-trust=untrusted\b/.test(operative), 'the policy derivation must emit `--origin-trust=untrusted` for a non-trusted ' +
|
|
497
|
-
'author (so the emitted artifact is stamped untrusted; task ' +
|
|
498
|
-
'untrusted-origin-forces-build-propose).');
|
|
499
|
-
require('derives-origin-trust-trusted', /--origin-trust=trusted\b/.test(operative), 'the policy derivation must emit `--origin-trust=trusted` for a trusted author.');
|
|
500
|
-
require('passes-origin-trust-to-intake', /steps\.policy\.outputs\.origin_trust_flag/.test(operative), 'the intake invocation must pass the derived `--origin-trust` flag (the ' +
|
|
501
|
-
'stamp must reach `dorfl intake`).');
|
|
502
|
-
// The derivation must read the RESOLVED intake DOCUMENT mode via `dorfl config
|
|
503
|
-
// --json` (the mechanism `advance` uses), NOT a hardcoded DORFL_* env (ADR
|
|
504
|
-
// untrusted-origin-carries-via-stamp-not-forced-staging — the shadowing bug).
|
|
505
|
-
require('reads-config-json', /dorfl config --json/.test(operative), 'the policy derivation must read the resolved config via ' +
|
|
506
|
-
'`dorfl config --json` (as `advance` does), so a committed `dorfl.json` ' +
|
|
507
|
-
'mode is honored in CI (not shadowed by a hardcoded env).');
|
|
508
|
-
// The DOCUMENT mode is the resolved `intakeIntegration ?? integration` (spec
|
|
509
|
-
// intake-integration-knob-and-specs-land-in-proposed-rename): the derivation
|
|
510
|
-
// must read `.intakeIntegration` with a `.integration` FALLBACK (the shell twin
|
|
511
|
-
// of `intakeIntegration ?? integration`), NOT the autonomy gates. Pin BOTH the
|
|
512
|
-
// key and the fallback so a regression to a gate-derived mode is caught.
|
|
513
|
-
require('reads-intake-integration', /\.intakeIntegration\b/.test(operative), 'the policy derivation must read the resolved `intakeIntegration` mode (jq ' +
|
|
514
|
-
'`.intakeIntegration` off `dorfl config --json`) for the document mode.');
|
|
515
|
-
require('intake-integration-falls-back-to-integration', /\.intakeIntegration\s*\/\/\s*\.integration/.test(operative), 'the policy derivation must fall back to `.integration` when ' +
|
|
516
|
-
'`intakeIntegration` is unset (jq `.intakeIntegration // .integration`, the ' +
|
|
517
|
-
'shell twin of `intakeIntegration ?? integration`).');
|
|
518
|
-
// The DOCUMENT mode must NOT be derived from the autonomy gates (spec
|
|
519
|
-
// intake-integration-knob-and-specs-land-in-proposed-rename: autoBuild/autoTask
|
|
520
|
-
// gate autonomy ONLY, never the document PR-mode). The mode branch must not read
|
|
521
|
-
// `.autoBuild` / `.autoTask` off the config json.
|
|
522
|
-
require('mode-not-gate-derived', !/\.auto(?:Build|Task)\b/.test(operative), 'the intake DOCUMENT mode must be derived from `intakeIntegration ?? ' +
|
|
523
|
-
'integration`, NOT the autonomy gates — the derivation must not read ' +
|
|
524
|
-
'`.autoBuild` / `.autoTask` (they gate autonomy only; spec ' +
|
|
525
|
-
'intake-integration-knob-and-specs-land-in-proposed-rename).');
|
|
526
|
-
// ANTI-REGRESSION (ADR untrusted-origin-carries-via-stamp-not-forced-staging;
|
|
527
|
-
// spec US #12): the workflow must NOT emit a `DORFL_AUTO_BUILD:` /
|
|
528
|
-
// `DORFL_AUTO_TASK:` env ASSIGNMENT. The env layer OUTRANKS per-repo config, so
|
|
529
|
-
// a hardcoded default here SHADOWS the committed `dorfl.json` gates (the bug this
|
|
530
|
-
// task fixes). Mirrors `advance-lifecycle-template.ts`'s `no-gate-env-auto-build`
|
|
531
|
-
// / `no-gate-env-auto-task`. Checked over the OPERATIVE (non-comment) lines so
|
|
532
|
-
// the header comment that NAMES these keys is not a false positive.
|
|
344
|
+
// --- The policy is derived in the lock job, from trusted inputs --------------
|
|
345
|
+
// The document mode and the origin-trust stamp are derived by the called
|
|
346
|
+
// workflow's LOCK job (`ci-phase-intake.ts`), never by the agent: this
|
|
347
|
+
// workflow must not derive them itself any more, nor carry a gate env.
|
|
533
348
|
require('no-gate-env-auto-build', !/DORFL_AUTO_BUILD\s*:/.test(operative), 'the workflow must NOT emit a `DORFL_AUTO_BUILD:` env assignment (env ' +
|
|
534
|
-
'carries no defaults
|
|
535
|
-
'default — else the env SHADOWS the committed dorfl.json).');
|
|
349
|
+
'carries no defaults — else the env SHADOWS the committed dorfl.json).');
|
|
536
350
|
require('no-gate-env-auto-task', !/DORFL_AUTO_TASK\s*:/.test(operative), 'the workflow must NOT emit a `DORFL_AUTO_TASK:` env assignment (env ' +
|
|
537
|
-
'carries no defaults
|
|
538
|
-
|
|
351
|
+
'carries no defaults — else the env SHADOWS the committed dorfl.json).');
|
|
352
|
+
require('documents-policy-derivation', /OWNER\/MEMBER\/COLLABORATOR/.test(text) &&
|
|
353
|
+
/intakeIntegration \?\? integration/.test(text), "must DOCUMENT where the policy comes from: the lock job's origin trust " +
|
|
354
|
+
'(OWNER/MEMBER/COLLABORATOR, from the event) and document mode ' +
|
|
355
|
+
'(`intakeIntegration ?? integration`, from dorfl.json at the base).');
|
|
539
356
|
// --- Insertion point E: the issue-thread review surface ---------------------
|
|
540
|
-
|
|
541
|
-
// thread). The workflow must request `issues: write` so that comment can land.
|
|
542
|
-
require('issues-write-permission', /\bissues:\s*write\b/.test(operative), 'must request `issues: write` so the review verdict / clarifying question ' +
|
|
357
|
+
require('issues-write-permission', /\bissues:\s*write\b/.test(operative), 'must grant `issues: write` so the review verdict / clarifying question ' +
|
|
543
358
|
'can be posted back into the issue thread (insertion point E).');
|
|
544
|
-
// It must NOT route the review verdict through the PR-comment seam — E posts to
|
|
545
|
-
// the ISSUE (postIssueComment by number), NOT the PR (postPRComment by url).
|
|
546
359
|
require('no-pr-comment-seam', !/postPRComment\b/.test(operative), 'insertion point E posts to the ISSUE thread (postIssueComment by number), ' +
|
|
547
360
|
'NOT the PR seam `postPRComment` (by url) — do not use the PR seam.');
|
|
548
361
|
// --- CI runs IN-PLACE: no isolation machinery ------------------------------
|
|
@@ -555,10 +368,12 @@ export function validateIntakeWorkflow(text) {
|
|
|
555
368
|
// --- US #9: NO `workflows` permission; cannot self-edit triggers ------------
|
|
556
369
|
require('no-workflows-permission', !/\bworkflows:\s*write\b/.test(text), 'the running job must request NO `workflows` permission (US #9: it can ' +
|
|
557
370
|
'never edit `.github/workflows/**` / rewrite its own triggers).');
|
|
558
|
-
|
|
559
|
-
//
|
|
560
|
-
require('
|
|
561
|
-
|
|
371
|
+
// Calling a reusable workflow (`uses: ./.github/workflows/...`) is not a
|
|
372
|
+
// step touching the tree; anything else naming it is.
|
|
373
|
+
require('never-edits-dot-github-workflows', !/\.github\/workflows\//.test(operative
|
|
374
|
+
.split('\n')
|
|
375
|
+
.filter((line) => !/^\s*uses: \.\/\.github\/workflows\//.test(line))
|
|
376
|
+
.join('\n')), 'no emitted job step may touch `.github/workflows/**` (US #9).');
|
|
562
377
|
return { ok: problems.length === 0, problems };
|
|
563
378
|
}
|
|
564
379
|
//# sourceMappingURL=intake-trigger-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intake-trigger-template.js","sourceRoot":"","sources":["../src/intake-trigger-template.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"intake-trigger-template.js","sourceRoot":"","sources":["../src/intake-trigger-template.ts"],"names":[],"mappings":"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"}
|