instar 1.3.1 → 1.3.3
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +20 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.d.ts +5 -4
- package/dist/core/CodexCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.js +55 -3
- package/dist/core/CodexCliIntelligenceProvider.js.map +1 -1
- package/dist/core/FeatureRolloutReconciler.d.ts +76 -0
- package/dist/core/FeatureRolloutReconciler.d.ts.map +1 -0
- package/dist/core/FeatureRolloutReconciler.js +151 -0
- package/dist/core/FeatureRolloutReconciler.js.map +1 -0
- package/dist/core/InitiativeTracker.d.ts +28 -0
- package/dist/core/InitiativeTracker.d.ts.map +1 -1
- package/dist/core/InitiativeTracker.js +5 -0
- package/dist/core/InitiativeTracker.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +9 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/featureRollout.d.ts +52 -0
- package/dist/core/featureRollout.d.ts.map +1 -0
- package/dist/core/featureRollout.js +65 -0
- package/dist/core/featureRollout.js.map +1 -0
- package/dist/core/featureRolloutScan.d.ts +24 -0
- package/dist/core/featureRolloutScan.d.ts.map +1 -0
- package/dist/core/featureRolloutScan.js +134 -0
- package/dist/core/featureRolloutScan.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +26 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +18 -18
- package/src/scaffold/templates/jobs/instar/initiative-digest-review.md +38 -0
- package/src/scaffold/templates.ts +1 -0
- package/upgrades/1.3.2.md +49 -0
- package/upgrades/1.3.3.md +21 -0
- package/upgrades/side-effects/fix-codex-intel-clean-call.md +108 -0
- package/upgrades/side-effects/graduated-feature-rollout.md +43 -0
|
@@ -22,16 +22,17 @@ export interface CodexCliIntelligenceProviderOptions {
|
|
|
22
22
|
*/
|
|
23
23
|
sandboxMode?: 'read-only' | 'workspace-write' | 'danger-full-access';
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* Retained for API compatibility. NOTE: this is intentionally NOT used as
|
|
26
|
+
* the `codex exec --cd` for judgment calls. Those always run in an empty
|
|
27
|
+
* instar-managed scratch dir (see `resolveIntelligenceScratchDir`) so the
|
|
28
|
+
* agent's project identity + hooks never load. These calls don't depend on
|
|
29
|
+
* cwd content, so ignoring this value is safe.
|
|
28
30
|
*/
|
|
29
31
|
workingDirectory?: string;
|
|
30
32
|
}
|
|
31
33
|
export declare class CodexCliIntelligenceProvider implements IntelligenceProvider {
|
|
32
34
|
private readonly codexPath;
|
|
33
35
|
private readonly sandboxMode;
|
|
34
|
-
private readonly workingDirectory;
|
|
35
36
|
constructor(options: CodexCliIntelligenceProviderOptions);
|
|
36
37
|
evaluate(prompt: string, options?: IntelligenceOptions): Promise<string>;
|
|
37
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexCliIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CodexCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"CodexCliIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CodexCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA6C5E,MAAM,WAAW,mCAAmC;IAClD,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IACrE;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,4BAA6B,YAAW,oBAAoB;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyD;gBAEzE,OAAO,EAAE,mCAAmC;IASlD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6E/E"}
|
|
@@ -12,26 +12,78 @@
|
|
|
12
12
|
* implementation based on the agent's configured framework.
|
|
13
13
|
*/
|
|
14
14
|
import { execFile } from 'node:child_process';
|
|
15
|
+
import { mkdtempSync, existsSync } from 'node:fs';
|
|
16
|
+
import { tmpdir } from 'node:os';
|
|
17
|
+
import { join } from 'node:path';
|
|
15
18
|
import { resolveCliModelFlag } from '../providers/adapters/openai-codex/models.js';
|
|
16
19
|
import { buildCodexChildEnv } from '../providers/adapters/openai-codex/transport/codexSpawn.js';
|
|
17
20
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
21
|
+
const INTELLIGENCE_SCRATCH_DIR_PREFIX = 'instar-codex-intel-scratch-';
|
|
22
|
+
let cachedScratchDir = null;
|
|
23
|
+
/**
|
|
24
|
+
* Lazily create and return an EMPTY scratch directory used as the `--cd`
|
|
25
|
+
* for every judgment call.
|
|
26
|
+
*
|
|
27
|
+
* Running `codex exec` in the agent's project directory loads the full
|
|
28
|
+
* ~26 KB `AGENTS.md` identity AND fires the project's `.codex/hooks.json`
|
|
29
|
+
* hooks (session_start / user_prompt_submit / stop) on every call — turning
|
|
30
|
+
* a one-word classification into a full agent boot. An empty, hook-free
|
|
31
|
+
* scratch dir gives these calls the clean-notepad guarantee that
|
|
32
|
+
* `ClaudeCliIntelligenceProvider` gets via `--setting-sources user`:
|
|
33
|
+
* no project doc, and no project hooks.
|
|
34
|
+
*
|
|
35
|
+
* SECURITY (why mkdtemp, not a fixed name): Codex discovers hooks by walking
|
|
36
|
+
* UP from the cwd and fires any `.codex/hooks.json` it finds — and
|
|
37
|
+
* `project_doc_max_bytes=0` does NOT cover hooks. On Linux `os.tmpdir()` is
|
|
38
|
+
* the world-writable `/tmp`, so a fixed, guessable dir name could be
|
|
39
|
+
* pre-created (or symlinked) by another local user with a planted
|
|
40
|
+
* `.codex/hooks.json`, re-introducing hook execution under our identity.
|
|
41
|
+
* `mkdtempSync` defeats this: it appends an unguessable random suffix, creates
|
|
42
|
+
* the dir with mode 0700 owned by this process, and refuses to follow a
|
|
43
|
+
* pre-existing path — so nothing can be planted in the cwd these calls run in.
|
|
44
|
+
*
|
|
45
|
+
* The dir is re-verified each call: a tmp-reaper may delete it during a
|
|
46
|
+
* long-lived process, so we recreate it if it has gone missing.
|
|
47
|
+
*
|
|
48
|
+
* Bug (2026-05-26): ~1,550 such judgment spawns/day were re-injecting the
|
|
49
|
+
* identity + firing session_start, causing notification spam and spawn-storm
|
|
50
|
+
* delivery failures. Spec: CODEX-INTELLIGENCE-PROVIDER-CLEAN-CALL-SPEC.md.
|
|
51
|
+
*/
|
|
52
|
+
function resolveIntelligenceScratchDir() {
|
|
53
|
+
if (cachedScratchDir && existsSync(cachedScratchDir))
|
|
54
|
+
return cachedScratchDir;
|
|
55
|
+
cachedScratchDir = mkdtempSync(join(tmpdir(), INTELLIGENCE_SCRATCH_DIR_PREFIX));
|
|
56
|
+
return cachedScratchDir;
|
|
57
|
+
}
|
|
18
58
|
export class CodexCliIntelligenceProvider {
|
|
19
59
|
codexPath;
|
|
20
60
|
sandboxMode;
|
|
21
|
-
workingDirectory;
|
|
22
61
|
constructor(options) {
|
|
23
62
|
this.codexPath = options.codexPath;
|
|
24
63
|
this.sandboxMode = options.sandboxMode ?? 'read-only';
|
|
25
|
-
|
|
64
|
+
// options.workingDirectory is intentionally NOT stored: judgment calls
|
|
65
|
+
// always run in an empty scratch dir (resolveIntelligenceScratchDir), so
|
|
66
|
+
// the agent's project identity + hooks never load. The option is retained
|
|
67
|
+
// on the type for API compatibility (the factory still forwards it).
|
|
26
68
|
}
|
|
27
69
|
async evaluate(prompt, options) {
|
|
28
70
|
const model = resolveCliModelFlag(options?.model);
|
|
71
|
+
const scratchDir = resolveIntelligenceScratchDir();
|
|
29
72
|
return new Promise((resolve, reject) => {
|
|
30
73
|
const args = [
|
|
31
74
|
'exec',
|
|
32
75
|
'--model', model,
|
|
33
76
|
'--sandbox', this.sandboxMode,
|
|
34
|
-
|
|
77
|
+
// Run judgment calls in an empty scratch dir, NOT the agent's project
|
|
78
|
+
// dir. The project dir loads the full ~26 KB AGENTS.md identity AND
|
|
79
|
+
// fires the project's .codex/hooks.json (session_start /
|
|
80
|
+
// user_prompt_submit / stop) on every call. The scratch dir is the
|
|
81
|
+
// Codex analog of ClaudeCliIntelligenceProvider's `--setting-sources
|
|
82
|
+
// user`. See resolveIntelligenceScratchDir + the spec.
|
|
83
|
+
'--cd', scratchDir,
|
|
84
|
+
// Belt-and-suspenders: hard-disable project-doc (AGENTS.md) loading
|
|
85
|
+
// even if a stray doc ever lands at or above the scratch path.
|
|
86
|
+
'-c', 'project_doc_max_bytes=0',
|
|
35
87
|
// Reviewer/sentinel/canary calls are deterministic short prompts
|
|
36
88
|
// that don't depend on the cwd being a trusted git repo. Codex
|
|
37
89
|
// CLI's default behavior is to refuse to run when --cd points at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexCliIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CodexCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"CodexCliIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CodexCliIntelligenceProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeatureRolloutReconciler — makes the InitiativeTracker self-populating
|
|
3
|
+
* (GRADUATED-FEATURE-ROLLOUT-SPEC §4.1). Runs IN-PROCESS against the tracker
|
|
4
|
+
* (the HTTP create surface drops kind/pipelineStage/parentProjectId), upserting
|
|
5
|
+
* a kind:'task' initiative per spec from artifacts that already exist — approved
|
|
6
|
+
* spec frontmatter, instar-dev trace (specPath/prNumber), and git merge state —
|
|
7
|
+
* and attaching a rollout track for ships-staged features whose stage is DERIVED
|
|
8
|
+
* from observing the config flag.
|
|
9
|
+
*
|
|
10
|
+
* The fs/git scanning is injected (`SpecArtifact[]`) so this reconciliation logic
|
|
11
|
+
* is fully unit-testable without a repo. Every tracker write passes `ifMatch`
|
|
12
|
+
* (OCC). Idempotent: re-running upserts, never duplicates. Bounded backfill:
|
|
13
|
+
* historical merged specs register terminal (provenance); only recently-merged
|
|
14
|
+
* or ships-staged specs become `active` tracks (anti-flood).
|
|
15
|
+
*/
|
|
16
|
+
import type { InitiativeTracker, PipelineStage } from './InitiativeTracker.js';
|
|
17
|
+
import { type RolloutFlagObservation } from './featureRollout.js';
|
|
18
|
+
/** One spec's artifact state, as discovered by the (injected) scanner. */
|
|
19
|
+
export interface SpecArtifact {
|
|
20
|
+
/** Normalized, ≤63-char, kebab id derived from the spec filename. */
|
|
21
|
+
id: string;
|
|
22
|
+
/** Repo-relative spec path (identity for rename detection). */
|
|
23
|
+
specPath: string;
|
|
24
|
+
title: string;
|
|
25
|
+
/** Frontmatter signals. */
|
|
26
|
+
approved: boolean;
|
|
27
|
+
reviewConverged: boolean;
|
|
28
|
+
shipsStaged: boolean;
|
|
29
|
+
/** flagPath + criteria from the spec's `rollout:` frontmatter (ships-staged). */
|
|
30
|
+
flagPath?: string;
|
|
31
|
+
evidenceSource?: {
|
|
32
|
+
type: 'log-filter' | 'endpoint';
|
|
33
|
+
ref: string;
|
|
34
|
+
filter?: string;
|
|
35
|
+
};
|
|
36
|
+
promotionCriteria?: string;
|
|
37
|
+
/** An instar-dev trace exists referencing this spec (⇒ at least building). */
|
|
38
|
+
traceExists: boolean;
|
|
39
|
+
prNumber?: number;
|
|
40
|
+
/** Merge commit reachable from main for this spec's change. */
|
|
41
|
+
merged: boolean;
|
|
42
|
+
/** Merge within the recent window (⇒ active track; else terminal provenance). */
|
|
43
|
+
mergedRecently: boolean;
|
|
44
|
+
/** Spec file no longer on disk (abandoned) — §4.7. */
|
|
45
|
+
abandoned?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface ReconcilerDeps {
|
|
48
|
+
tracker: Pick<InitiativeTracker, 'list' | 'get' | 'create' | 'update' | 'setPhaseStatus'>;
|
|
49
|
+
/** Discover spec artifacts (fs + git). Injected for testability. */
|
|
50
|
+
listSpecArtifacts: () => SpecArtifact[];
|
|
51
|
+
/** Observe a feature's flag (live config + shipped default). Read-only. */
|
|
52
|
+
observeFlag: (flagPath: string) => RolloutFlagObservation;
|
|
53
|
+
now?: () => number;
|
|
54
|
+
}
|
|
55
|
+
/** Map artifact state → the dev pipelineStage (no rollout). */
|
|
56
|
+
export declare function derivePipelineStage(a: SpecArtifact): PipelineStage;
|
|
57
|
+
export interface ReconcileSummary {
|
|
58
|
+
created: string[];
|
|
59
|
+
advanced: string[];
|
|
60
|
+
archived: string[];
|
|
61
|
+
regressed: string[];
|
|
62
|
+
skipped: string[];
|
|
63
|
+
unchanged: string[];
|
|
64
|
+
}
|
|
65
|
+
export declare class FeatureRolloutReconciler {
|
|
66
|
+
private readonly deps;
|
|
67
|
+
private readonly now;
|
|
68
|
+
constructor(deps: ReconcilerDeps);
|
|
69
|
+
/** One reconciliation pass over all discovered specs. Idempotent. */
|
|
70
|
+
reconcile(): Promise<ReconcileSummary>;
|
|
71
|
+
private reconcileOne;
|
|
72
|
+
/** Apply a rollout stage: sync phase statuses + the rollout block; archive
|
|
73
|
+
* (reopenable) at default-on rather than completing. */
|
|
74
|
+
private applyRolloutStage;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=FeatureRolloutReconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureRolloutReconciler.d.ts","sourceRoot":"","sources":["../../src/core/FeatureRolloutReconciler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAc,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAML,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8EAA8E;IAC9E,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,cAAc,EAAE,OAAO,CAAC;IACxB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAC,CAAC;IAC1F,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,YAAY,EAAE,CAAC;IACxC,2EAA2E;IAC3E,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,YAAY,GAAG,aAAa,CAOlE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,EAAE,cAAc;IAKhC,qEAAqE;IAC/D,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAoB9B,YAAY;IAqE1B;6DACyD;YAC3C,iBAAiB;CAoBhC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeatureRolloutReconciler — makes the InitiativeTracker self-populating
|
|
3
|
+
* (GRADUATED-FEATURE-ROLLOUT-SPEC §4.1). Runs IN-PROCESS against the tracker
|
|
4
|
+
* (the HTTP create surface drops kind/pipelineStage/parentProjectId), upserting
|
|
5
|
+
* a kind:'task' initiative per spec from artifacts that already exist — approved
|
|
6
|
+
* spec frontmatter, instar-dev trace (specPath/prNumber), and git merge state —
|
|
7
|
+
* and attaching a rollout track for ships-staged features whose stage is DERIVED
|
|
8
|
+
* from observing the config flag.
|
|
9
|
+
*
|
|
10
|
+
* The fs/git scanning is injected (`SpecArtifact[]`) so this reconciliation logic
|
|
11
|
+
* is fully unit-testable without a repo. Every tracker write passes `ifMatch`
|
|
12
|
+
* (OCC). Idempotent: re-running upserts, never duplicates. Bounded backfill:
|
|
13
|
+
* historical merged specs register terminal (provenance); only recently-merged
|
|
14
|
+
* or ships-staged specs become `active` tracks (anti-flood).
|
|
15
|
+
*/
|
|
16
|
+
import { deriveRolloutStage, rolloutPhaseStatuses, shouldArchiveAtStage, isRegression, ROLLOUT_PHASE_IDS, } from './featureRollout.js';
|
|
17
|
+
/** Map artifact state → the dev pipelineStage (no rollout). */
|
|
18
|
+
export function derivePipelineStage(a) {
|
|
19
|
+
if (a.abandoned)
|
|
20
|
+
return 'skipped';
|
|
21
|
+
if (a.merged)
|
|
22
|
+
return 'merged';
|
|
23
|
+
if (a.traceExists || a.prNumber != null)
|
|
24
|
+
return 'building';
|
|
25
|
+
if (a.approved)
|
|
26
|
+
return 'approved';
|
|
27
|
+
if (a.reviewConverged)
|
|
28
|
+
return 'spec-converged';
|
|
29
|
+
return 'spec-drafted';
|
|
30
|
+
}
|
|
31
|
+
export class FeatureRolloutReconciler {
|
|
32
|
+
deps;
|
|
33
|
+
now;
|
|
34
|
+
constructor(deps) {
|
|
35
|
+
this.deps = deps;
|
|
36
|
+
this.now = deps.now ?? (() => Date.now());
|
|
37
|
+
}
|
|
38
|
+
/** One reconciliation pass over all discovered specs. Idempotent. */
|
|
39
|
+
async reconcile() {
|
|
40
|
+
const summary = { created: [], advanced: [], archived: [], regressed: [], skipped: [], unchanged: [] };
|
|
41
|
+
// Index existing tasks by specPath for rename detection.
|
|
42
|
+
const bySpecPath = new Map();
|
|
43
|
+
for (const init of this.deps.tracker.list()) {
|
|
44
|
+
if (init.kind === 'project')
|
|
45
|
+
continue;
|
|
46
|
+
if (init.specPath)
|
|
47
|
+
bySpecPath.set(init.specPath, init);
|
|
48
|
+
}
|
|
49
|
+
for (const art of this.deps.listSpecArtifacts()) {
|
|
50
|
+
try {
|
|
51
|
+
await this.reconcileOne(art, bySpecPath, summary);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// A single bad spec must not abort the whole pass.
|
|
55
|
+
summary.skipped.push(art.id);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return summary;
|
|
59
|
+
}
|
|
60
|
+
async reconcileOne(art, bySpecPath, summary) {
|
|
61
|
+
const stage = derivePipelineStage(art);
|
|
62
|
+
// Rename detection: an existing record with this specPath wins over id match.
|
|
63
|
+
const existing = bySpecPath.get(art.specPath) ?? this.deps.tracker.get(art.id);
|
|
64
|
+
// Rollout observation (ships-staged + merged only).
|
|
65
|
+
const rolloutEligible = Boolean(art.shipsStaged && art.merged && art.flagPath);
|
|
66
|
+
const observedStage = rolloutEligible ? deriveRolloutStage(this.deps.observeFlag(art.flagPath)) : undefined;
|
|
67
|
+
if (!existing) {
|
|
68
|
+
// ── CREATE ──
|
|
69
|
+
// Bounded backfill: a historical (not-recent) merged spec without a live
|
|
70
|
+
// rollout registers TERMINAL (archived, provenance) — not an active card.
|
|
71
|
+
const isActive = !art.merged || art.mergedRecently || rolloutEligible;
|
|
72
|
+
const phaseStatuses = observedStage ? rolloutPhaseStatuses(observedStage) : undefined;
|
|
73
|
+
const phases = rolloutEligible && phaseStatuses
|
|
74
|
+
? ROLLOUT_PHASE_IDS.map(id => ({ id, name: id, status: phaseStatuses[id] }))
|
|
75
|
+
: [{ id: 'lifecycle', name: stage }];
|
|
76
|
+
await this.deps.tracker.create({
|
|
77
|
+
id: art.id, title: art.title, description: `Auto-registered from ${art.specPath}`,
|
|
78
|
+
phases, kind: 'task', pipelineStage: stage, specPath: art.specPath,
|
|
79
|
+
prNumber: art.prNumber,
|
|
80
|
+
rollout: rolloutEligible
|
|
81
|
+
? { flagPath: art.flagPath, stage: observedStage, evidenceSource: art.evidenceSource, promotionCriteria: art.promotionCriteria }
|
|
82
|
+
: undefined,
|
|
83
|
+
});
|
|
84
|
+
// default-on parks the track as 'paused' (NON-terminal → reopenable on a
|
|
85
|
+
// later regression; 'archived' maps to TaskFlow's terminal `cancelled`
|
|
86
|
+
// which would seal it). Historical non-rollout backfill uses 'archived'
|
|
87
|
+
// (genuinely terminal provenance, never reopened).
|
|
88
|
+
if (observedStage && shouldArchiveAtStage(observedStage)) {
|
|
89
|
+
await this.deps.tracker.update(art.id, { status: 'paused', ifMatch: this.deps.tracker.get(art.id)?.version });
|
|
90
|
+
}
|
|
91
|
+
else if (!isActive) {
|
|
92
|
+
await this.deps.tracker.update(art.id, { status: 'archived', ifMatch: this.deps.tracker.get(art.id)?.version });
|
|
93
|
+
}
|
|
94
|
+
summary.created.push(art.id);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// ── UPDATE (idempotent + OCC) ──
|
|
98
|
+
const id = existing.id;
|
|
99
|
+
let touched = false;
|
|
100
|
+
// Advance dev pipelineStage when artifacts moved it forward.
|
|
101
|
+
if (existing.pipelineStage !== stage) {
|
|
102
|
+
await this.deps.tracker.update(id, { pipelineStage: stage, prNumber: art.prNumber, ifMatch: this.deps.tracker.get(id)?.version });
|
|
103
|
+
touched = true;
|
|
104
|
+
}
|
|
105
|
+
if (rolloutEligible && observedStage) {
|
|
106
|
+
const prevStage = existing.rollout?.stage;
|
|
107
|
+
if (prevStage && isRegression(prevStage, observedStage)) {
|
|
108
|
+
await this.deps.tracker.update(id, { pipelineStage: 'regressed', status: 'active', ifMatch: this.deps.tracker.get(id)?.version });
|
|
109
|
+
await this.applyRolloutStage(id, observedStage);
|
|
110
|
+
summary.regressed.push(id);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (prevStage !== observedStage) {
|
|
114
|
+
await this.applyRolloutStage(id, observedStage);
|
|
115
|
+
if (shouldArchiveAtStage(observedStage))
|
|
116
|
+
summary.archived.push(id);
|
|
117
|
+
else
|
|
118
|
+
summary.advanced.push(id);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (touched)
|
|
123
|
+
summary.advanced.push(id);
|
|
124
|
+
else
|
|
125
|
+
summary.unchanged.push(id);
|
|
126
|
+
}
|
|
127
|
+
/** Apply a rollout stage: sync phase statuses + the rollout block; archive
|
|
128
|
+
* (reopenable) at default-on rather than completing. */
|
|
129
|
+
async applyRolloutStage(id, stage) {
|
|
130
|
+
const cur = this.deps.tracker.get(id);
|
|
131
|
+
if (!cur)
|
|
132
|
+
return;
|
|
133
|
+
const statuses = rolloutPhaseStatuses(stage);
|
|
134
|
+
for (const pid of ROLLOUT_PHASE_IDS) {
|
|
135
|
+
const phase = cur.phases.find(p => p.id === pid);
|
|
136
|
+
if (phase && phase.status !== statuses[pid]) {
|
|
137
|
+
await this.deps.tracker.setPhaseStatus(id, pid, statuses[pid]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const fresh = this.deps.tracker.get(id);
|
|
141
|
+
await this.deps.tracker.update(id, {
|
|
142
|
+
rollout: { flagPath: fresh?.rollout?.flagPath ?? '', stage: stage, evidenceSource: fresh?.rollout?.evidenceSource, promotionCriteria: fresh?.rollout?.promotionCriteria, lastDigestNotifiedAt: fresh?.rollout?.lastDigestNotifiedAt },
|
|
143
|
+
// 'paused' (non-terminal, reopenable) at default-on — NOT 'archived'
|
|
144
|
+
// (which maps to TaskFlow's terminal `cancelled` and would seal the
|
|
145
|
+
// record against a later regression). 'active' for live/dry-run.
|
|
146
|
+
status: shouldArchiveAtStage(stage) ? 'paused' : 'active',
|
|
147
|
+
ifMatch: fresh?.version,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=FeatureRolloutReconciler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureRolloutReconciler.js","sourceRoot":"","sources":["../../src/core/FeatureRolloutReconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,29 @@ export interface InitiativePhase {
|
|
|
16
16
|
}
|
|
17
17
|
export type InitiativeStatus = 'active' | 'completed' | 'archived' | 'abandoned' | 'paused' | 'halted' | 'awaiting-user';
|
|
18
18
|
export type InitiativeKind = 'task' | 'project';
|
|
19
|
+
/** Post-ship rollout stages for a ships-staged feature. The stage is DERIVED
|
|
20
|
+
* from observing the feature's config flag (never written by the driver) —
|
|
21
|
+
* GRADUATED-FEATURE-ROLLOUT-SPEC §4.2-4.3. */
|
|
22
|
+
export type RolloutStage = 'dark' | 'dry-run' | 'live' | 'default-on';
|
|
23
|
+
/** Typed rollout metadata for a ships-staged feature task. Operational criteria
|
|
24
|
+
* live here (typed), NOT in free-form phase summaries. */
|
|
25
|
+
export interface RolloutInfo {
|
|
26
|
+
/** Dotted config key whose observed value derives the stage, e.g.
|
|
27
|
+
* 'monitoring.sessionReaper'. The driver NEVER writes this. */
|
|
28
|
+
flagPath: string;
|
|
29
|
+
/** Stage derived from the last observed flag value. */
|
|
30
|
+
stage: RolloutStage;
|
|
31
|
+
/** Where the twice-weekly driver gathers promotion evidence. */
|
|
32
|
+
evidenceSource?: {
|
|
33
|
+
type: 'log-filter' | 'endpoint';
|
|
34
|
+
ref: string;
|
|
35
|
+
filter?: string;
|
|
36
|
+
};
|
|
37
|
+
/** Human-readable promotion gate (e.g. "≥2wk + ≥3 genuinely-idle would-reaps"). */
|
|
38
|
+
promotionCriteria?: string;
|
|
39
|
+
/** Near-silent edge dedupe: last time a needs-user line was surfaced for this track. */
|
|
40
|
+
lastDigestNotifiedAt?: string;
|
|
41
|
+
}
|
|
19
42
|
export type PipelineStage = 'outline' | 'spec-drafted' | 'spec-converged' | 'approved' | 'building' | 'merged' | 'regressed' | 'skipped';
|
|
20
43
|
export type RoundStatus = 'pending' | 'ready' | 'in-progress' | 'partially-complete' | 'complete' | 'complete-with-skips' | 'failed' | 'regressed';
|
|
21
44
|
export interface InitiativeRound {
|
|
@@ -102,6 +125,9 @@ export interface Initiative {
|
|
|
102
125
|
unskippedAt?: string;
|
|
103
126
|
/** Default true at runtime; false marks infrastructure-of-tracker specs. */
|
|
104
127
|
driftCheck?: boolean;
|
|
128
|
+
/** Post-ship rollout track (ships-staged features). Present only when the
|
|
129
|
+
* feature matures behind a flag. Stage is derived from observing flagPath. */
|
|
130
|
+
rollout?: RolloutInfo;
|
|
105
131
|
rounds?: InitiativeRound[];
|
|
106
132
|
/** Paths jailed to project-root allowlist. */
|
|
107
133
|
sourceDocs?: string[];
|
|
@@ -148,6 +174,7 @@ export interface InitiativeCreateInput {
|
|
|
148
174
|
mergeCommitOid?: string;
|
|
149
175
|
ciCheckedAt?: string;
|
|
150
176
|
driftCheck?: boolean;
|
|
177
|
+
rollout?: RolloutInfo;
|
|
151
178
|
rounds?: InitiativeRound[];
|
|
152
179
|
sourceDocs?: string[];
|
|
153
180
|
autoAdvance?: boolean;
|
|
@@ -185,6 +212,7 @@ export interface InitiativeUpdateInput {
|
|
|
185
212
|
skippedReason?: string | null;
|
|
186
213
|
unskippedAt?: string | null;
|
|
187
214
|
driftCheck?: boolean;
|
|
215
|
+
rollout?: RolloutInfo | null;
|
|
188
216
|
rounds?: InitiativeRound[];
|
|
189
217
|
sourceDocs?: string[];
|
|
190
218
|
autoAdvance?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitiativeTracker.d.ts","sourceRoot":"","sources":["../../src/core/InitiativeTracker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"InitiativeTracker.d.ts","sourceRoot":"","sources":["../../src/core/InitiativeTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -645,6 +645,8 @@ export class InitiativeTracker {
|
|
|
645
645
|
initiative.ciCheckedAt = input.ciCheckedAt;
|
|
646
646
|
if (input.driftCheck !== undefined)
|
|
647
647
|
initiative.driftCheck = input.driftCheck;
|
|
648
|
+
if (input.rollout !== undefined)
|
|
649
|
+
initiative.rollout = input.rollout;
|
|
648
650
|
if (input.rounds !== undefined)
|
|
649
651
|
initiative.rounds = input.rounds;
|
|
650
652
|
if (input.sourceDocs !== undefined)
|
|
@@ -753,6 +755,9 @@ export class InitiativeTracker {
|
|
|
753
755
|
}
|
|
754
756
|
if (input.driftCheck !== undefined)
|
|
755
757
|
next.driftCheck = input.driftCheck;
|
|
758
|
+
if (input.rollout !== undefined) {
|
|
759
|
+
next.rollout = input.rollout === null ? undefined : input.rollout;
|
|
760
|
+
}
|
|
756
761
|
if (input.rounds !== undefined)
|
|
757
762
|
next.rounds = input.rounds;
|
|
758
763
|
if (input.sourceDocs !== undefined)
|