@telora/daemon 0.24.8 → 0.24.10

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.
Files changed (94) hide show
  1. package/build-info.json +5 -3
  2. package/dist/ci/candidate-ref.js +1 -1
  3. package/dist/ci/candidate-ref.js.map +1 -1
  4. package/dist/ci/gate-ref.d.ts +150 -0
  5. package/dist/ci/gate-ref.d.ts.map +1 -0
  6. package/dist/ci/gate-ref.js +348 -0
  7. package/dist/ci/gate-ref.js.map +1 -0
  8. package/dist/composition/verification-context.d.ts.map +1 -1
  9. package/dist/composition/verification-context.js +56 -8
  10. package/dist/composition/verification-context.js.map +1 -1
  11. package/dist/nexus/file-escalation.d.ts.map +1 -1
  12. package/dist/nexus/file-escalation.js +1 -0
  13. package/dist/nexus/file-escalation.js.map +1 -1
  14. package/dist/nexus/intake.d.ts +14 -2
  15. package/dist/nexus/intake.d.ts.map +1 -1
  16. package/dist/nexus/intake.js +11 -2
  17. package/dist/nexus/intake.js.map +1 -1
  18. package/dist/nexus/pending-returns.d.ts +1 -1
  19. package/dist/nexus/pending-returns.d.ts.map +1 -1
  20. package/dist/queries/verification/verification.js +1 -1
  21. package/dist/testing/fixtures/index.js +1 -1
  22. package/dist/testing/fixtures/verification-deps.d.ts +8 -67
  23. package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
  24. package/dist/testing/fixtures/verification-deps.js +94 -1
  25. package/dist/testing/fixtures/verification-deps.js.map +1 -1
  26. package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
  27. package/dist/testing/fixtures/vitest-failure-log.js +1 -0
  28. package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
  29. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts +93 -0
  30. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -0
  31. package/dist/verify/ci-gate/ci-gate-dispatch.js +304 -0
  32. package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -0
  33. package/dist/verify/ci-gate/ci-gate-reruns.d.ts +51 -0
  34. package/dist/verify/ci-gate/ci-gate-reruns.d.ts.map +1 -0
  35. package/dist/verify/ci-gate/ci-gate-reruns.js +189 -0
  36. package/dist/verify/ci-gate/ci-gate-reruns.js.map +1 -0
  37. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +33 -0
  38. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -0
  39. package/dist/verify/ci-gate/ci-gate-wait-record.js +89 -0
  40. package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -0
  41. package/dist/verify/deterministic-gate/verification-deterministic.d.ts +6 -0
  42. package/dist/verify/deterministic-gate/verification-deterministic.d.ts.map +1 -1
  43. package/dist/verify/deterministic-gate/verification-deterministic.js +1 -20
  44. package/dist/verify/deterministic-gate/verification-deterministic.js.map +1 -1
  45. package/dist/verify/deterministic-gate/verification-gate-stages.d.ts.map +1 -1
  46. package/dist/verify/deterministic-gate/verification-gate-stages.js +1 -0
  47. package/dist/verify/deterministic-gate/verification-gate-stages.js.map +1 -1
  48. package/dist/verify/engine/verification-commit-sharing.d.ts +24 -0
  49. package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
  50. package/dist/verify/engine/verification-commit-sharing.js +93 -1
  51. package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
  52. package/dist/verify/engine/verification-deps.d.ts +9 -0
  53. package/dist/verify/engine/verification-deps.d.ts.map +1 -1
  54. package/dist/verify/engine/verification-deps.js +1 -1
  55. package/dist/verify/engine/verification-engine.d.ts.map +1 -1
  56. package/dist/verify/engine/verification-engine.js +19 -5
  57. package/dist/verify/engine/verification-engine.js.map +1 -1
  58. package/dist/verify/failing-test-rerun/failing-test-retry.d.ts.map +1 -1
  59. package/dist/verify/failing-test-rerun/failing-test-retry.js +2 -1
  60. package/dist/verify/failing-test-rerun/failing-test-retry.js.map +1 -1
  61. package/dist/verify/gate-config/judged-commit-gate.d.ts +11 -3
  62. package/dist/verify/gate-config/judged-commit-gate.d.ts.map +1 -1
  63. package/dist/verify/gate-config/judged-commit-gate.js +16 -5
  64. package/dist/verify/gate-config/judged-commit-gate.js.map +1 -1
  65. package/dist/verify/gate-config/verification-config.js +1 -1
  66. package/dist/verify/gate-config/verification-manifest.d.ts +18 -1
  67. package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
  68. package/dist/verify/gate-config/verification-manifest.js +21 -21
  69. package/dist/verify/gate-config/verification-manifest.js.map +1 -1
  70. package/dist/verify/gate-verdicts/commit-verdict-record.d.ts +2 -0
  71. package/dist/verify/gate-verdicts/commit-verdict-record.d.ts.map +1 -1
  72. package/dist/verify/gate-verdicts/commit-verdict-record.js +11 -4
  73. package/dist/verify/gate-verdicts/commit-verdict-record.js.map +1 -1
  74. package/dist/verify/gate-verdicts/gate-run-registry.js +1 -1
  75. package/dist/verify/outcome-routing/failing-output-excerpt.d.ts +8 -0
  76. package/dist/verify/outcome-routing/failing-output-excerpt.d.ts.map +1 -0
  77. package/dist/verify/outcome-routing/failing-output-excerpt.js +41 -0
  78. package/dist/verify/outcome-routing/failing-output-excerpt.js.map +1 -0
  79. package/dist/verify/outcome-routing/verification-feedback.d.ts +2 -0
  80. package/dist/verify/outcome-routing/verification-feedback.d.ts.map +1 -1
  81. package/dist/verify/outcome-routing/verification-feedback.js +3 -0
  82. package/dist/verify/outcome-routing/verification-feedback.js.map +1 -1
  83. package/dist/verify/outcome-routing/verification-rework-issue.d.ts +7 -0
  84. package/dist/verify/outcome-routing/verification-rework-issue.d.ts.map +1 -1
  85. package/dist/verify/outcome-routing/verification-rework-issue.js +30 -2
  86. package/dist/verify/outcome-routing/verification-rework-issue.js.map +1 -1
  87. package/dist/verify/run-selection/default-on-guards.js +1 -1
  88. package/dist/verify/run-selection/explicit-rearm.d.ts.map +1 -1
  89. package/dist/verify/run-selection/explicit-rearm.js +1 -0
  90. package/dist/verify/run-selection/explicit-rearm.js.map +1 -1
  91. package/dist/verify/run-selection/verification-default-on.d.ts.map +1 -1
  92. package/dist/verify/run-selection/verification-default-on.js +1 -0
  93. package/dist/verify/run-selection/verification-default-on.js.map +1 -1
  94. package/package.json +2 -2
package/build-info.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "3e3d14322",
3
- "builtAt": "2026-10-16T17:20:54.358Z",
2
+ "commitSha": "dcfa30ae8",
3
+ "builtAt": "2026-10-17T23:02:58.362Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -879,6 +879,8 @@
879
879
  "20261016030625_radar_wait_says_why_it_closed.sql",
880
880
  "20261016145947_arm_readiness_names_unanchored_and_met.sql",
881
881
  "20261016151419_bug_names_falsified_effects.sql",
882
- "20261016163239_falsifying_bug_and_finding_taking_create_are_one_transaction.sql"
882
+ "20261016163239_falsifying_bug_and_finding_taking_create_are_one_transaction.sql",
883
+ "20261017023109_request_answered_without_focus_is_delivered.sql",
884
+ "20261017030437_request_requester_authority.sql"
883
885
  ]
884
886
  }
@@ -1,6 +1,6 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
2
  // Pinned by: packages/daemon/src/ci/candidate-ci-contract.test.ts,
3
- // packages/daemon/src/ci/candidate-ref.test.ts
3
+ // packages/daemon/src/ci/candidate-ref.test.ts, packages/daemon/src/ci/gate-ref.test.ts
4
4
  // PINNED-BY-END
5
5
  /**
6
6
  * The integration CANDIDATE namespace: where the daemon pushes a completed
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-ref.js","sourceRoot":"","sources":["../../src/ci/candidate-ref.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candidate-ref.js","sourceRoot":"","sources":["../../src/ci/candidate-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { type CiRunStatus } from './ci-status.js';
2
+ /** Branch prefix of the gate namespace (under refs/heads/). */
3
+ export declare const GATE_BRANCH_PREFIX = "telora-gate";
4
+ /** The ci.yml `on.push.branches` glob that admits every gate branch. */
5
+ export declare const GATE_BRANCH_TRIGGER_GLOB = "telora-gate/**";
6
+ /** Where the spec of a focus's latest gate push lives. */
7
+ export declare const GATE_SPEC_REF_PREFIX = "refs/telora-gate-spec";
8
+ /** Where CI publishes a gate run's verdict (in the ref name) and log (in the commit it points at). */
9
+ export declare const GATE_STATUS_REF_PREFIX = "refs/telora-gate-status";
10
+ /** The file in a published status commit holding the run's combined output. */
11
+ export declare const GATE_LOG_FILE = "gate.log";
12
+ /** The file in a published status commit holding the run's exit facts (JSON). */
13
+ export declare const GATE_RESULT_FILE = "gate-result.json";
14
+ /** The spec format this daemon writes; the CI script refuses any other. */
15
+ export declare const GATE_SPEC_VERSION = 1;
16
+ /**
17
+ * The git runner the IO below goes through (production: {@link gateGit}, bound at
18
+ * the composition root). `env` is added to git's environment (the harness build
19
+ * points GIT_INDEX_FILE at a scratch index).
20
+ */
21
+ export type GateGit = (args: string[], cwd: string, env?: Record<string, string>) => {
22
+ success: boolean;
23
+ output: string;
24
+ error?: string;
25
+ };
26
+ /** git, synchronously, with room for a whole gate log; never throws. */
27
+ export declare const gateGit: GateGit;
28
+ /** Why a run is asked for: the per-HEAD gate, a re-run of named failing tests, or a run of the base for attribution. */
29
+ export type GateRunPurpose = 'gate' | 'rerun' | 'base';
30
+ /**
31
+ * What the CI job runs: `command` at `sha`, under `timeoutMs`, with `env` added
32
+ * to its environment, publishing under `key`. The daemon writes it; the CI
33
+ * script (scripts/ci-gate-run.sh) reads it and refuses one whose sha is not the
34
+ * commit it was triggered for.
35
+ */
36
+ export interface GateRunSpec {
37
+ version: number;
38
+ purpose: GateRunPurpose;
39
+ focusId: string;
40
+ sha: string;
41
+ key: string;
42
+ command: string;
43
+ timeoutMs: number;
44
+ env: Record<string, string>;
45
+ }
46
+ /**
47
+ * A gate's identity: its command + timeout, hashed (12 hex). The ONE definition
48
+ * the per-commit verdict record keys its files by and CI publishes under.
49
+ */
50
+ export declare function gateRunKey(gate: {
51
+ command: string;
52
+ timeoutMs: number;
53
+ }): string;
54
+ /** The gate branch name for a focus (one per focus; force-pushed per run). */
55
+ export declare function gateBranchForFocus(focusId: string): string;
56
+ /** The spec ref for a focus. */
57
+ export declare function gateSpecRefForFocus(focusId: string): string;
58
+ /** Whether a branch name (or full refs/heads/ ref) is in the gate namespace. */
59
+ export declare function isGateBranch(ref: string): boolean;
60
+ /** Build the spec for one run; its key is the gate identity of `command` + `timeoutMs`. Pure. */
61
+ export declare function buildGateRunSpec(params: {
62
+ purpose: GateRunPurpose;
63
+ focusId: string;
64
+ sha: string;
65
+ command: string;
66
+ timeoutMs: number;
67
+ env?: Record<string, string>;
68
+ }): GateRunSpec;
69
+ /** Parse a spec (the spec commit's message); null when it is not a well-formed spec of this version. Pure. */
70
+ export declare function parseGateRunSpec(text: string): GateRunSpec | null;
71
+ /** The sha the focus's gate branch points at on origin; null when never pushed or git fails. */
72
+ export declare function readPushedGateSha(repoPath: string, focusId: string, git: GateGit): string | null;
73
+ /** Remove the focus's gate branch from origin. Best-effort: false when git refused (e.g. nothing to delete). */
74
+ export declare function deleteGateBranch(repoPath: string, focusId: string, git: GateGit): boolean;
75
+ /**
76
+ * What a CI run needs from the repo besides the code it judges: the workflows that
77
+ * define the gate job, and the script the job runs. A commit from before the
78
+ * product adopted the CI gate (a focus base, for attribution) carries neither, so
79
+ * pushing it alone would start no run at all.
80
+ */
81
+ export declare const GATE_HARNESS_PATHS: readonly [".github/workflows", ".gitea/workflows", "scripts/ci-gate-run.sh"];
82
+ /** The subject a harness commit opens with; scripts/ci-gate-run.sh accepts only a commit carrying it. */
83
+ export declare const GATE_HARNESS_SUBJECT = "telora-gate-harness";
84
+ /**
85
+ * A HARNESS commit for running `sourceSha` on CI with the gate harness of
86
+ * `harnessFrom`: its only parent is `sourceSha`, and its tree is `sourceSha`'s
87
+ * with {@link GATE_HARNESS_PATHS} replaced by `harnessFrom`'s -- so the push
88
+ * triggers the gate job, and the job (scripts/ci-gate-run.sh) checks out
89
+ * `sourceSha` itself before it runs the command: the run executes at the source
90
+ * commit exactly, and only the harness comes from the installed revision. Built
91
+ * in a scratch index, so no working tree or real index is touched. Null when git
92
+ * fails.
93
+ */
94
+ export declare function buildHarnessCommit(repoPath: string, sourceSha: string, harnessFrom: string, git: GateGit): string | null;
95
+ /**
96
+ * Hand `spec` to CI: push the spec commit to the focus's spec ref and `spec.sha`
97
+ * to its gate branch, in ONE push (both refs land before the push triggers the
98
+ * job). When the branch already points at `spec.sha` -- a re-push, or a re-run
99
+ * of the same commit -- it is deleted first, because re-pushing an unchanged sha
100
+ * to an existing branch triggers nothing. With `harnessFrom` naming another commit
101
+ * than `spec.sha` (the judged HEAD, for a run at the focus base), a harness commit
102
+ * over `spec.sha` carrying `harnessFrom`'s gate job and script is pushed instead
103
+ * ({@link buildHarnessCommit}); the job still runs at `spec.sha` and publishes
104
+ * under it. Returns false on any git failure; the caller holds and asks again.
105
+ */
106
+ export declare function pushGateRun(repoPath: string, spec: GateRunSpec, git: GateGit, harnessFrom?: string): boolean;
107
+ /** A published status ref: its name, the commit it points at (the log commit), its run and state. */
108
+ export interface PublishedGateStatus {
109
+ ref: string;
110
+ oid: string;
111
+ runNumber: number;
112
+ state: 'green' | 'red' | 'pending';
113
+ }
114
+ /** Every status CI published for `sha` under `key` (scoped, read-only ls-remote); [] on any failure. */
115
+ export declare function listGateStatus(repoPath: string, sha: string, key: string, git: GateGit): PublishedGateStatus[];
116
+ /** A gate run's verdict as CI published it, and the published run that decided it (null: no decision). */
117
+ export interface GateRunVerdict {
118
+ status: CiRunStatus;
119
+ decidedBy: PublishedGateStatus | null;
120
+ }
121
+ /**
122
+ * Classify the statuses published for one (sha, key) exactly as an integration
123
+ * tip is classified (ci/ci-status.ts classifyGitNativeCiStatus: red wins within a
124
+ * run, any completed green wins across runs, none = unknown), and name the run
125
+ * that decided it: a green run for green, the newest red run for red. Pure.
126
+ */
127
+ export declare function classifyGateStatus(published: readonly PublishedGateStatus[]): GateRunVerdict;
128
+ /** Read the verdict CI published for `sha` under `key`. Fail-closed: anything unreadable is 'unknown'. */
129
+ export declare function readGateRunVerdict(repoPath: string, sha: string, key: string, git: GateGit): GateRunVerdict;
130
+ /** The exit facts a CI run published beside its log. */
131
+ export interface GateRunResultFacts {
132
+ exitCode: number | null;
133
+ timedOut: boolean;
134
+ durationMs: number | null;
135
+ }
136
+ /** Parse gate-result.json; null when it is not well-formed. Pure. */
137
+ export declare function parseGateRunResult(text: string): GateRunResultFacts | null;
138
+ /** A published run's log and exit facts. */
139
+ export interface PublishedGateLog {
140
+ log: string;
141
+ result: GateRunResultFacts | null;
142
+ }
143
+ /**
144
+ * Fetch the log a published status points at: one scoped fetch of that ref
145
+ * (no FETCH_HEAD written, no local ref created), then the blob read out of the
146
+ * commit it named. Null when the fetch fails or the commit carries no log --
147
+ * the caller treats that as unavailable evidence, never as a pass.
148
+ */
149
+ export declare function readGateRunLog(repoPath: string, published: PublishedGateStatus, git: GateGit): PublishedGateLog | null;
150
+ //# sourceMappingURL=gate-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-ref.d.ts","sourceRoot":"","sources":["../../src/ci/gate-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/ci/gate-ci-contract.test.ts, packages/daemon/src/ci/gate-ref.test.ts,
3
+ // packages/daemon/src/verify/ci-gate/ci-gate-dispatch.test.ts,
4
+ // packages/daemon/src/verify/ci-gate/ci-gate-reruns.test.ts
5
+ // PINNED-BY-END
6
+ /**
7
+ * The per-HEAD GATE namespace: where the daemon hands a focus commit to the
8
+ * product's CI to run its gate command, and where CI hands the verdict and the
9
+ * log back -- for a product whose telora.verify.json says `"gateRunner": "ci"`
10
+ * (verify/ci-gate/). Why: docs/runbook-verify-gate-in-ci.md.
11
+ *
12
+ * FOUR names, all git-native, all read and written over the daemon's existing
13
+ * git channel (no Gitea API client, no token):
14
+ *
15
+ * refs/heads/telora-gate/<focusId> the judged commit, force-pushed. A BRANCH
16
+ * because Gitea Actions fires `push` only
17
+ * for branches and tags (as with
18
+ * ci/candidate-ref.ts). One per focus. A
19
+ * run at another commit than the judged
20
+ * HEAD (attribution's base) is pushed as a
21
+ * HARNESS commit over it
22
+ * ({@link buildHarnessCommit}): that commit
23
+ * may predate the gate job and its script.
24
+ * refs/telora-gate-spec/<focusId> a commit whose message is the run's
25
+ * GateRunSpec (JSON): the commit it judges,
26
+ * the command, the timeout, the boundary
27
+ * env (TELORA_VERIFY_BASE_REF,
28
+ * TELORA_VERIFY_RECORDED_COMMIT_COUNT) and
29
+ * the run key. Pushed in the SAME push as
30
+ * the branch, so the job triggered by the
31
+ * branch always finds the spec beside it.
32
+ * refs/telora-gate-status/<sha>/<key>/<run>/<state>
33
+ * what CI publishes: the state in the ref
34
+ * NAME (success | failure), the run number
35
+ * ordering runs, and the ref POINTING AT a
36
+ * commit whose tree holds `gate.log` and
37
+ * `gate-result.json` -- so one ls-remote
38
+ * reads the verdict and names the log.
39
+ *
40
+ * DISTINCT from the candidate namespace on purpose. A completed focus's
41
+ * integration candidate (telora-candidate/**, refs/ci-status) and a focus HEAD's
42
+ * gate are different questions -- the full suite on the combined tree vs the
43
+ * product's per-HEAD gate command -- and can be asked of the same sha. Sharing
44
+ * refs/ci-status would let one answer the other.
45
+ *
46
+ * The run KEY is the gate's identity: the same hash the per-commit verdict record
47
+ * is keyed by (verify/gate-verdicts/commit-verdict-record.ts imports
48
+ * {@link gateRunKey} from here, so the two can never disagree). A verdict under
49
+ * one command or timeout says nothing about another, so a status published under
50
+ * another key is never read as this gate's.
51
+ *
52
+ * NAMED ONCE HERE. `.github/workflows/ci.yml` triggers on
53
+ * {@link GATE_BRANCH_TRIGGER_GLOB}; scripts/ci-gate-run.sh runs the spec and
54
+ * publishes under {@link GATE_STATUS_REF_PREFIX}; ci/gate-ci-contract.test.ts
55
+ * executes that script against a real bare repo and reads its output back
56
+ * through the readers below.
57
+ *
58
+ * Fail-closed throughout: an unreadable remote, an absent ref or a malformed one
59
+ * classifies to 'unknown', and the caller holds.
60
+ *
61
+ * @module ci/gate-ref
62
+ */
63
+ import { execFileSync } from 'node:child_process';
64
+ import { createHash, randomUUID } from 'node:crypto';
65
+ import { rmSync } from 'node:fs';
66
+ import { tmpdir } from 'node:os';
67
+ import { join } from 'node:path';
68
+ import { classifyGitNativeCiStatus } from './ci-status.js';
69
+ /** Branch prefix of the gate namespace (under refs/heads/). */
70
+ export const GATE_BRANCH_PREFIX = 'telora-gate';
71
+ /** The ci.yml `on.push.branches` glob that admits every gate branch. */
72
+ export const GATE_BRANCH_TRIGGER_GLOB = `${GATE_BRANCH_PREFIX}/**`;
73
+ /** Where the spec of a focus's latest gate push lives. */
74
+ export const GATE_SPEC_REF_PREFIX = 'refs/telora-gate-spec';
75
+ /** Where CI publishes a gate run's verdict (in the ref name) and log (in the commit it points at). */
76
+ export const GATE_STATUS_REF_PREFIX = 'refs/telora-gate-status';
77
+ /** The file in a published status commit holding the run's combined output. */
78
+ export const GATE_LOG_FILE = 'gate.log';
79
+ /** The file in a published status commit holding the run's exit facts (JSON). */
80
+ export const GATE_RESULT_FILE = 'gate-result.json';
81
+ /** The spec format this daemon writes; the CI script refuses any other. */
82
+ export const GATE_SPEC_VERSION = 1;
83
+ /** Identity the daemon commits the spec as (a runner or a host may have no git identity). */
84
+ const SPEC_AUTHOR = ['-c', 'user.name=telora-daemon', '-c', 'user.email=telora-daemon@localhost'];
85
+ /** A gate log can run to megabytes; the shared runGit caps output at Node's 1 MiB default. */
86
+ const GIT_MAX_BUFFER = 256 * 1024 * 1024;
87
+ const GIT_TIMEOUT_MS = 120_000;
88
+ /** git, synchronously, with room for a whole gate log; never throws. */
89
+ export const gateGit = (args, cwd, env) => {
90
+ try {
91
+ const output = execFileSync('git', args, {
92
+ cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'pipe'], timeout: GIT_TIMEOUT_MS, maxBuffer: GIT_MAX_BUFFER,
93
+ ...(env ? { env: { ...process.env, ...env } } : {}),
94
+ });
95
+ return { success: true, output: output.trim() };
96
+ }
97
+ catch (err) {
98
+ const e = err;
99
+ return { success: false, output: e.stdout?.toString() ?? '', error: e.stderr?.toString() || e.message || 'git failed' };
100
+ }
101
+ };
102
+ const SHA40 = /^[0-9a-f]{40}$/i;
103
+ const KEY_RE = /^[0-9a-f]{12}$/;
104
+ /**
105
+ * A gate's identity: its command + timeout, hashed (12 hex). The ONE definition
106
+ * the per-commit verdict record keys its files by and CI publishes under.
107
+ */
108
+ export function gateRunKey(gate) {
109
+ return createHash('sha256').update(JSON.stringify([gate.command, gate.timeoutMs])).digest('hex').slice(0, 12);
110
+ }
111
+ /** The gate branch name for a focus (one per focus; force-pushed per run). */
112
+ export function gateBranchForFocus(focusId) {
113
+ return `${GATE_BRANCH_PREFIX}/${focusId}`;
114
+ }
115
+ /** The spec ref for a focus. */
116
+ export function gateSpecRefForFocus(focusId) {
117
+ return `${GATE_SPEC_REF_PREFIX}/${focusId}`;
118
+ }
119
+ /** Whether a branch name (or full refs/heads/ ref) is in the gate namespace. */
120
+ export function isGateBranch(ref) {
121
+ const name = ref.startsWith('refs/heads/') ? ref.slice('refs/heads/'.length) : ref;
122
+ return name.startsWith(`${GATE_BRANCH_PREFIX}/`);
123
+ }
124
+ /** Build the spec for one run; its key is the gate identity of `command` + `timeoutMs`. Pure. */
125
+ export function buildGateRunSpec(params) {
126
+ return {
127
+ version: GATE_SPEC_VERSION,
128
+ purpose: params.purpose,
129
+ focusId: params.focusId,
130
+ sha: params.sha,
131
+ key: gateRunKey(params),
132
+ command: params.command,
133
+ timeoutMs: params.timeoutMs,
134
+ env: { ...(params.env ?? {}) },
135
+ };
136
+ }
137
+ function isStringRecord(value) {
138
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
139
+ && Object.values(value).every((v) => typeof v === 'string');
140
+ }
141
+ /** Parse a spec (the spec commit's message); null when it is not a well-formed spec of this version. Pure. */
142
+ export function parseGateRunSpec(text) {
143
+ let raw;
144
+ try {
145
+ raw = JSON.parse(text.trim());
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ if (typeof raw !== 'object' || raw === null)
151
+ return null;
152
+ const r = raw;
153
+ if (r.version !== GATE_SPEC_VERSION)
154
+ return null;
155
+ if (r.purpose !== 'gate' && r.purpose !== 'rerun' && r.purpose !== 'base')
156
+ return null;
157
+ if (typeof r.focusId !== 'string' || typeof r.sha !== 'string' || !SHA40.test(r.sha))
158
+ return null;
159
+ if (typeof r.key !== 'string' || !KEY_RE.test(r.key))
160
+ return null;
161
+ if (typeof r.command !== 'string' || r.command.trim() === '')
162
+ return null;
163
+ if (typeof r.timeoutMs !== 'number' || !(r.timeoutMs > 0))
164
+ return null;
165
+ if (!isStringRecord(r.env))
166
+ return null;
167
+ return {
168
+ version: r.version, purpose: r.purpose, focusId: r.focusId, sha: r.sha, key: r.key,
169
+ command: r.command, timeoutMs: r.timeoutMs, env: { ...r.env },
170
+ };
171
+ }
172
+ /** The sha a ref points at on origin via a scoped ls-remote; null when absent or git fails. */
173
+ function lsRemoteSha(repoPath, ref, git) {
174
+ const result = git(['ls-remote', 'origin', ref], repoPath);
175
+ if (!result.success || !result.output)
176
+ return null;
177
+ const sha = result.output.split('\n')[0]?.split('\t')[0]?.trim() ?? '';
178
+ return SHA40.test(sha) ? sha : null;
179
+ }
180
+ /** The sha the focus's gate branch points at on origin; null when never pushed or git fails. */
181
+ export function readPushedGateSha(repoPath, focusId, git) {
182
+ return lsRemoteSha(repoPath, `refs/heads/${gateBranchForFocus(focusId)}`, git);
183
+ }
184
+ /** Remove the focus's gate branch from origin. Best-effort: false when git refused (e.g. nothing to delete). */
185
+ export function deleteGateBranch(repoPath, focusId, git) {
186
+ return git(['push', 'origin', '--delete', `refs/heads/${gateBranchForFocus(focusId)}`], repoPath).success;
187
+ }
188
+ /** Write the spec as a commit (empty tree, the JSON as its message); its sha, or null when git failed. */
189
+ function writeSpecCommit(repoPath, spec, git) {
190
+ const tree = git(['hash-object', '-t', 'tree', '-w', '/dev/null'], repoPath);
191
+ const treeSha = tree.output.trim();
192
+ if (!tree.success || !SHA40.test(treeSha))
193
+ return null;
194
+ const commit = git([...SPEC_AUTHOR, 'commit-tree', treeSha, '-m', JSON.stringify(spec)], repoPath);
195
+ const sha = commit.output.trim();
196
+ return commit.success && SHA40.test(sha) ? sha : null;
197
+ }
198
+ /**
199
+ * What a CI run needs from the repo besides the code it judges: the workflows that
200
+ * define the gate job, and the script the job runs. A commit from before the
201
+ * product adopted the CI gate (a focus base, for attribution) carries neither, so
202
+ * pushing it alone would start no run at all.
203
+ */
204
+ export const GATE_HARNESS_PATHS = ['.github/workflows', '.gitea/workflows', 'scripts/ci-gate-run.sh'];
205
+ /** The subject a harness commit opens with; scripts/ci-gate-run.sh accepts only a commit carrying it. */
206
+ export const GATE_HARNESS_SUBJECT = 'telora-gate-harness';
207
+ /**
208
+ * A HARNESS commit for running `sourceSha` on CI with the gate harness of
209
+ * `harnessFrom`: its only parent is `sourceSha`, and its tree is `sourceSha`'s
210
+ * with {@link GATE_HARNESS_PATHS} replaced by `harnessFrom`'s -- so the push
211
+ * triggers the gate job, and the job (scripts/ci-gate-run.sh) checks out
212
+ * `sourceSha` itself before it runs the command: the run executes at the source
213
+ * commit exactly, and only the harness comes from the installed revision. Built
214
+ * in a scratch index, so no working tree or real index is touched. Null when git
215
+ * fails.
216
+ */
217
+ export function buildHarnessCommit(repoPath, sourceSha, harnessFrom, git) {
218
+ const index = join(tmpdir(), `telora-gate-harness-${process.pid}-${randomUUID()}.index`);
219
+ const env = { GIT_INDEX_FILE: index };
220
+ try {
221
+ if (!git(['read-tree', sourceSha], repoPath, env).success)
222
+ return null;
223
+ if (!git(['rm', '-r', '--cached', '--ignore-unmatch', '--quiet', '--', ...GATE_HARNESS_PATHS], repoPath, env).success)
224
+ return null;
225
+ const listed = git(['ls-tree', '-r', harnessFrom, '--', ...GATE_HARNESS_PATHS], repoPath);
226
+ if (!listed.success)
227
+ return null;
228
+ for (const line of listed.output.split('\n').filter(Boolean)) {
229
+ const [meta = '', path = ''] = line.split('\t');
230
+ const [mode = '', , oid = ''] = meta.split(' ');
231
+ if (!git(['update-index', '--add', '--cacheinfo', `${mode},${oid},${path}`], repoPath, env).success)
232
+ return null;
233
+ }
234
+ const tree = git(['write-tree'], repoPath, env);
235
+ if (!tree.success || !SHA40.test(tree.output.trim()))
236
+ return null;
237
+ const subject = `${GATE_HARNESS_SUBJECT}: run ${sourceSha} with the gate harness of ${harnessFrom}`;
238
+ const commit = git([...SPEC_AUTHOR, 'commit-tree', tree.output.trim(), '-p', sourceSha, '-m', subject], repoPath);
239
+ const sha = commit.output.trim();
240
+ return commit.success && SHA40.test(sha) ? sha : null;
241
+ }
242
+ finally {
243
+ rmSync(index, { force: true });
244
+ }
245
+ }
246
+ /**
247
+ * Hand `spec` to CI: push the spec commit to the focus's spec ref and `spec.sha`
248
+ * to its gate branch, in ONE push (both refs land before the push triggers the
249
+ * job). When the branch already points at `spec.sha` -- a re-push, or a re-run
250
+ * of the same commit -- it is deleted first, because re-pushing an unchanged sha
251
+ * to an existing branch triggers nothing. With `harnessFrom` naming another commit
252
+ * than `spec.sha` (the judged HEAD, for a run at the focus base), a harness commit
253
+ * over `spec.sha` carrying `harnessFrom`'s gate job and script is pushed instead
254
+ * ({@link buildHarnessCommit}); the job still runs at `spec.sha` and publishes
255
+ * under it. Returns false on any git failure; the caller holds and asks again.
256
+ */
257
+ export function pushGateRun(repoPath, spec, git, harnessFrom) {
258
+ const specSha = writeSpecCommit(repoPath, spec, git);
259
+ if (specSha === null)
260
+ return false;
261
+ const pushed = harnessFrom !== undefined && harnessFrom !== spec.sha ? buildHarnessCommit(repoPath, spec.sha, harnessFrom, git) : spec.sha;
262
+ if (pushed === null)
263
+ return false;
264
+ const branch = `refs/heads/${gateBranchForFocus(spec.focusId)}`;
265
+ if (lsRemoteSha(repoPath, branch, git) === pushed.toLowerCase())
266
+ deleteGateBranch(repoPath, spec.focusId, git);
267
+ const result = git(['push', '--force', 'origin', `${specSha}:${gateSpecRefForFocus(spec.focusId)}`, `${pushed}:${branch}`], repoPath);
268
+ return result.success;
269
+ }
270
+ /** Parse one ls-remote line under `<prefix>/<sha>/<key>/`; null when it is not a well-formed status ref. */
271
+ function parseStatusLine(line, prefix) {
272
+ const [oid = '', ref = ''] = line.trim().split('\t').map((s) => s.trim());
273
+ if (!SHA40.test(oid) || !ref.startsWith(prefix))
274
+ return null;
275
+ const [run = '', state = '', ...rest] = ref.slice(prefix.length).split('/');
276
+ if (rest.length > 0 || !/^[0-9]+$/.test(run))
277
+ return null;
278
+ const runNumber = Number(run);
279
+ if (!Number.isSafeInteger(runNumber))
280
+ return null;
281
+ const mapped = classifyGitNativeCiStatus([`refs/ci-status/x/${runNumber}/${state}`]);
282
+ if (mapped !== 'green' && mapped !== 'red' && mapped !== 'pending')
283
+ return null;
284
+ return { ref, oid, runNumber, state: mapped };
285
+ }
286
+ /** Every status CI published for `sha` under `key` (scoped, read-only ls-remote); [] on any failure. */
287
+ export function listGateStatus(repoPath, sha, key, git) {
288
+ const prefix = `${GATE_STATUS_REF_PREFIX}/${sha}/${key}/`;
289
+ const result = git(['ls-remote', 'origin', `${prefix}*`], repoPath);
290
+ if (!result.success || !result.output)
291
+ return [];
292
+ return result.output.split('\n').map((line) => parseStatusLine(line, prefix)).filter((s) => s !== null);
293
+ }
294
+ /**
295
+ * Classify the statuses published for one (sha, key) exactly as an integration
296
+ * tip is classified (ci/ci-status.ts classifyGitNativeCiStatus: red wins within a
297
+ * run, any completed green wins across runs, none = unknown), and name the run
298
+ * that decided it: a green run for green, the newest red run for red. Pure.
299
+ */
300
+ export function classifyGateStatus(published) {
301
+ const status = classifyGitNativeCiStatus(published.map((p) => `refs/ci-status/x/${p.runNumber}/${p.state === 'green' ? 'success' : p.state === 'red' ? 'failure' : 'pending'}`));
302
+ if (status !== 'green' && status !== 'red')
303
+ return { status, decidedBy: null };
304
+ const deciding = published.filter((p) => p.state === status).sort((a, b) => b.runNumber - a.runNumber)[0] ?? null;
305
+ return { status, decidedBy: deciding };
306
+ }
307
+ /** Read the verdict CI published for `sha` under `key`. Fail-closed: anything unreadable is 'unknown'. */
308
+ export function readGateRunVerdict(repoPath, sha, key, git) {
309
+ try {
310
+ return classifyGateStatus(listGateStatus(repoPath, sha, key, git));
311
+ }
312
+ catch {
313
+ return { status: 'unknown', decidedBy: null };
314
+ }
315
+ }
316
+ /** Parse gate-result.json; null when it is not well-formed. Pure. */
317
+ export function parseGateRunResult(text) {
318
+ try {
319
+ const raw = JSON.parse(text);
320
+ if (typeof raw !== 'object' || raw === null)
321
+ return null;
322
+ return {
323
+ exitCode: typeof raw.exitCode === 'number' ? raw.exitCode : null,
324
+ timedOut: raw.timedOut === true,
325
+ durationMs: typeof raw.durationMs === 'number' ? raw.durationMs : null,
326
+ };
327
+ }
328
+ catch {
329
+ return null;
330
+ }
331
+ }
332
+ /**
333
+ * Fetch the log a published status points at: one scoped fetch of that ref
334
+ * (no FETCH_HEAD written, no local ref created), then the blob read out of the
335
+ * commit it named. Null when the fetch fails or the commit carries no log --
336
+ * the caller treats that as unavailable evidence, never as a pass.
337
+ */
338
+ export function readGateRunLog(repoPath, published, git) {
339
+ const fetched = git(['fetch', '--no-write-fetch-head', '--no-tags', 'origin', published.ref], repoPath);
340
+ if (!fetched.success)
341
+ return null;
342
+ const log = git(['cat-file', 'blob', `${published.oid}:${GATE_LOG_FILE}`], repoPath);
343
+ if (!log.success)
344
+ return null;
345
+ const result = git(['cat-file', 'blob', `${published.oid}:${GATE_RESULT_FILE}`], repoPath);
346
+ return { log: log.output, result: result.success ? parseGateRunResult(result.output) : null };
347
+ }
348
+ //# sourceMappingURL=gate-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-ref.js","sourceRoot":"","sources":["../../src/ci/gate-ref.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verification-context.d.ts","sourceRoot":"","sources":["../../src/composition/verification-context.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAKhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBtD,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAqD9G,OAAO,KAAK,EAA8B,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAkC1G,0HAA0H;AAC1H,eAAO,MAAM,yBAAyB,EAAE,yBAOvC,CAAC;AAkBF,sHAAsH;AACtH,eAAO,MAAM,aAAa,EAAE,SAO1B,CAAC;AA6IH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,YAAY,KAAG,gBAmG5D,CAAC"}
1
+ {"version":3,"file":"verification-context.d.ts","sourceRoot":"","sources":["../../src/composition/verification-context.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAKhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBtD,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,6CAA6C,CAAC;AA2D9G,OAAO,KAAK,EAA8B,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAkC1G,0HAA0H;AAC1H,eAAO,MAAM,yBAAyB,EAAE,yBAOvC,CAAC;AAkBF,sHAAsH;AACtH,eAAO,MAAM,aAAa,EAAE,SAO1B,CAAC;AAuKH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,YAAY,KAAG,gBAmG5D,CAAC"}