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.
Files changed (40) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +20 -0
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/CodexCliIntelligenceProvider.d.ts +5 -4
  5. package/dist/core/CodexCliIntelligenceProvider.d.ts.map +1 -1
  6. package/dist/core/CodexCliIntelligenceProvider.js +55 -3
  7. package/dist/core/CodexCliIntelligenceProvider.js.map +1 -1
  8. package/dist/core/FeatureRolloutReconciler.d.ts +76 -0
  9. package/dist/core/FeatureRolloutReconciler.d.ts.map +1 -0
  10. package/dist/core/FeatureRolloutReconciler.js +151 -0
  11. package/dist/core/FeatureRolloutReconciler.js.map +1 -0
  12. package/dist/core/InitiativeTracker.d.ts +28 -0
  13. package/dist/core/InitiativeTracker.d.ts.map +1 -1
  14. package/dist/core/InitiativeTracker.js +5 -0
  15. package/dist/core/InitiativeTracker.js.map +1 -1
  16. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  17. package/dist/core/PostUpdateMigrator.js +9 -0
  18. package/dist/core/PostUpdateMigrator.js.map +1 -1
  19. package/dist/core/featureRollout.d.ts +52 -0
  20. package/dist/core/featureRollout.d.ts.map +1 -0
  21. package/dist/core/featureRollout.js +65 -0
  22. package/dist/core/featureRollout.js.map +1 -0
  23. package/dist/core/featureRolloutScan.d.ts +24 -0
  24. package/dist/core/featureRolloutScan.d.ts.map +1 -0
  25. package/dist/core/featureRolloutScan.js +134 -0
  26. package/dist/core/featureRolloutScan.js.map +1 -0
  27. package/dist/scaffold/templates.d.ts.map +1 -1
  28. package/dist/scaffold/templates.js +1 -0
  29. package/dist/scaffold/templates.js.map +1 -1
  30. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  31. package/dist/server/CapabilityIndex.js +26 -1
  32. package/dist/server/CapabilityIndex.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/data/builtin-manifest.json +18 -18
  35. package/src/scaffold/templates/jobs/instar/initiative-digest-review.md +38 -0
  36. package/src/scaffold/templates.ts +1 -0
  37. package/upgrades/1.3.2.md +49 -0
  38. package/upgrades/1.3.3.md +21 -0
  39. package/upgrades/side-effects/fix-codex-intel-clean-call.md +108 -0
  40. 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
- * Working directory for the codex CLI invocation. Defaults to
26
- * process.cwd(). Reviewer / canary calls don't depend on cwd content
27
- * but Codex CLI honors the flag so it's safe to pass.
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;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAM5E,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;;;;OAIG;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;IACrF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,EAAE,mCAAmC;IAMlD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CAkE/E"}
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
- this.workingDirectory = options.workingDirectory ?? process.cwd();
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
- '--cd', this.workingDirectory,
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;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAC;AAEhG,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAmBlC,MAAM,OAAO,4BAA4B;IACtB,SAAS,CAAS;IAClB,WAAW,CAAyD;IACpE,gBAAgB,CAAS;IAE1C,YAAY,OAA4C;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA6B;QAC1D,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAElD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG;gBACX,MAAM;gBACN,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,IAAI,CAAC,gBAAgB;gBAC7B,iEAAiE;gBACjE,+DAA+D;gBAC/D,iEAAiE;gBACjE,sCAAsC;gBACtC,kFAAkF;gBAClF,6DAA6D;gBAC7D,iEAAiE;gBACjE,4BAA4B;gBAC5B,uBAAuB;gBACvB,6DAA6D;gBAC7D,gEAAgE;gBAChE,gEAAgE;gBAChE,YAAY;gBACZ,MAAM;aACP,CAAC;YAEF,mEAAmE;YACnE,uEAAuE;YACvE,mEAAmE;YACnE,oEAAoE;YACpE,mEAAmE;YACnE,qEAAqE;YACrE,2DAA2D;YAC3D,EAAE;YACF,kEAAkE;YAClE,iEAAiE;YACjE,kEAAkE;YAClE,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAEtC,MAAM,KAAK,GAAG,QAAQ,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,EACJ;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,SAAS,EAAE,IAAI,GAAG,IAAI;gBACtB,GAAG,EAAE,QAAQ;aACd,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CACJ,IAAI,KAAK,CACP,oBAAoB,KAAK,CAAC,OAAO,EAAE;wBACjC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/C,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC,CACF,CAAC;YAEF,iEAAiE;YACjE,kEAAkE;YAClE,kEAAkE;YAClE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
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)