openplanr 1.16.2 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/cli/commands/operate.d.ts.map +1 -1
  2. package/dist/cli/commands/operate.js +185 -6
  3. package/dist/cli/commands/operate.js.map +1 -1
  4. package/dist/services/operate/advisors.d.ts +46 -1
  5. package/dist/services/operate/advisors.d.ts.map +1 -1
  6. package/dist/services/operate/advisors.js +124 -13
  7. package/dist/services/operate/advisors.js.map +1 -1
  8. package/dist/services/operate/artifacts.d.ts +27 -1
  9. package/dist/services/operate/artifacts.d.ts.map +1 -1
  10. package/dist/services/operate/artifacts.js +103 -1
  11. package/dist/services/operate/artifacts.js.map +1 -1
  12. package/dist/services/operate/cadence.d.ts +50 -0
  13. package/dist/services/operate/cadence.d.ts.map +1 -0
  14. package/dist/services/operate/cadence.js +56 -0
  15. package/dist/services/operate/cadence.js.map +1 -0
  16. package/dist/services/operate/citation-resolution.d.ts +101 -0
  17. package/dist/services/operate/citation-resolution.d.ts.map +1 -0
  18. package/dist/services/operate/citation-resolution.js +308 -0
  19. package/dist/services/operate/citation-resolution.js.map +1 -0
  20. package/dist/services/operate/config.d.ts +67 -1
  21. package/dist/services/operate/config.d.ts.map +1 -1
  22. package/dist/services/operate/config.js +158 -9
  23. package/dist/services/operate/config.js.map +1 -1
  24. package/dist/services/operate/decision-brief.d.ts +148 -0
  25. package/dist/services/operate/decision-brief.d.ts.map +1 -0
  26. package/dist/services/operate/decision-brief.js +194 -0
  27. package/dist/services/operate/decision-brief.js.map +1 -0
  28. package/dist/services/operate/doctor.d.ts.map +1 -1
  29. package/dist/services/operate/doctor.js +151 -3
  30. package/dist/services/operate/doctor.js.map +1 -1
  31. package/dist/services/operate/engine.d.ts +66 -2
  32. package/dist/services/operate/engine.d.ts.map +1 -1
  33. package/dist/services/operate/engine.js +219 -7
  34. package/dist/services/operate/engine.js.map +1 -1
  35. package/dist/services/operate/event-store.d.ts +35 -1
  36. package/dist/services/operate/event-store.d.ts.map +1 -1
  37. package/dist/services/operate/event-store.js +142 -29
  38. package/dist/services/operate/event-store.js.map +1 -1
  39. package/dist/services/operate/evidence-cache.d.ts +25 -1
  40. package/dist/services/operate/evidence-cache.d.ts.map +1 -1
  41. package/dist/services/operate/evidence-cache.js +62 -1
  42. package/dist/services/operate/evidence-cache.js.map +1 -1
  43. package/dist/services/operate/evidence.d.ts +20 -1
  44. package/dist/services/operate/evidence.d.ts.map +1 -1
  45. package/dist/services/operate/evidence.js +119 -0
  46. package/dist/services/operate/evidence.js.map +1 -1
  47. package/dist/services/operate/index.d.ts.map +1 -1
  48. package/dist/services/operate/index.js +72 -5
  49. package/dist/services/operate/index.js.map +1 -1
  50. package/dist/services/operate/interaction/action-service.d.ts +17 -0
  51. package/dist/services/operate/interaction/action-service.d.ts.map +1 -1
  52. package/dist/services/operate/interaction/action-service.js +19 -0
  53. package/dist/services/operate/interaction/action-service.js.map +1 -1
  54. package/dist/services/operate/journal.d.ts.map +1 -1
  55. package/dist/services/operate/journal.js +11 -5
  56. package/dist/services/operate/journal.js.map +1 -1
  57. package/dist/services/operate/maintenance.d.ts.map +1 -1
  58. package/dist/services/operate/maintenance.js +9 -2
  59. package/dist/services/operate/maintenance.js.map +1 -1
  60. package/dist/services/operate/migration.d.ts +68 -0
  61. package/dist/services/operate/migration.d.ts.map +1 -0
  62. package/dist/services/operate/migration.js +235 -0
  63. package/dist/services/operate/migration.js.map +1 -0
  64. package/dist/services/operate/mission-dispatch.d.ts +193 -0
  65. package/dist/services/operate/mission-dispatch.d.ts.map +1 -0
  66. package/dist/services/operate/mission-dispatch.js +444 -0
  67. package/dist/services/operate/mission-dispatch.js.map +1 -0
  68. package/dist/services/operate/projection-persistence.d.ts +6 -0
  69. package/dist/services/operate/projection-persistence.d.ts.map +1 -1
  70. package/dist/services/operate/projection-persistence.js +87 -11
  71. package/dist/services/operate/projection-persistence.js.map +1 -1
  72. package/dist/services/operate/projection.d.ts +26 -1
  73. package/dist/services/operate/projection.d.ts.map +1 -1
  74. package/dist/services/operate/projection.js +62 -0
  75. package/dist/services/operate/projection.js.map +1 -1
  76. package/dist/services/operate/protocol.d.ts +46 -2
  77. package/dist/services/operate/protocol.d.ts.map +1 -1
  78. package/dist/services/operate/protocol.js +57 -5
  79. package/dist/services/operate/protocol.js.map +1 -1
  80. package/dist/services/operate/read-only-providers.d.ts +37 -0
  81. package/dist/services/operate/read-only-providers.d.ts.map +1 -1
  82. package/dist/services/operate/read-only-providers.js +130 -0
  83. package/dist/services/operate/read-only-providers.js.map +1 -1
  84. package/dist/services/operate/reports.d.ts +13 -0
  85. package/dist/services/operate/reports.d.ts.map +1 -1
  86. package/dist/services/operate/reports.js +217 -1
  87. package/dist/services/operate/reports.js.map +1 -1
  88. package/dist/services/operate/routes.d.ts.map +1 -1
  89. package/dist/services/operate/routes.js +79 -5
  90. package/dist/services/operate/routes.js.map +1 -1
  91. package/dist/services/operate/types.d.ts +120 -4
  92. package/dist/services/operate/types.d.ts.map +1 -1
  93. package/dist/services/operate/types.js +13 -0
  94. package/dist/services/operate/types.js.map +1 -1
  95. package/dist/services/operate/workspace.d.ts +7 -0
  96. package/dist/services/operate/workspace.d.ts.map +1 -1
  97. package/dist/services/operate/workspace.js +14 -5
  98. package/dist/services/operate/workspace.js.map +1 -1
  99. package/package.json +2 -2
@@ -0,0 +1,56 @@
1
+ import path from 'node:path';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { recordOperatingLastRunAt } from './config.js';
4
+ import { resolveOperatingPipelineRoot } from './protocol.js';
5
+ import { OperateError } from './types.js';
6
+ let cachedCadenceModule = null;
7
+ async function loadCadenceModule() {
8
+ cachedCadenceModule ??= (async () => {
9
+ const root = resolveOperatingPipelineRoot();
10
+ if (!root) {
11
+ throw new OperateError('E_PIPELINE_NOT_INSTALLED', 'Operating cadence status requires the planr-pipeline cadence calculator.');
12
+ }
13
+ const module = (await import(pathToFileURL(path.join(root, 'lib', 'operate', 'cadence.mjs')).href));
14
+ if (typeof module.computeNextDueDate !== 'function' ||
15
+ typeof module.assertCadenceCannotMutate !== 'function') {
16
+ throw new OperateError('E_PIPELINE_NOT_INSTALLED', 'The installed pipeline does not expose the Protocol v1.3 cadence calculator.');
17
+ }
18
+ return module;
19
+ })();
20
+ return cachedCadenceModule;
21
+ }
22
+ /**
23
+ * Compute the surfaced next-due instant for a cadence via the pipeline's pure
24
+ * calculator (FR8 / E-008). `clock` is the injected `now` supplied by the CLI
25
+ * boundary — the computation reads no wall clock. `manual` yields `null`;
26
+ * `weekly` / `monthly` yield the calculator's RFC 3339 UTC instant (due
27
+ * immediately when `lastRunAt` is absent).
28
+ */
29
+ export async function computeNextDueAt(cadence, lastRunAt, clock) {
30
+ const module = await loadCadenceModule();
31
+ return module.computeNextDueDate(cadence, lastRunAt, clock).nextDueAt;
32
+ }
33
+ /**
34
+ * Record the cadence `lastRunAt` marker when a cycle reaches a terminal
35
+ * reviewable/blocked/closed state (FR8 / E-008). Delegates the atomic
36
+ * machine-local preferences write to `config.ts`, keeping cadence policy in one
37
+ * module while persistence stays with the preferences owner. `runAt` is the
38
+ * injected cycle instant (RFC 3339 UTC), never a wall-clock read here.
39
+ */
40
+ export async function recordOperatingCadenceRun(input) {
41
+ await recordOperatingLastRunAt({
42
+ projectRoot: input.projectRoot,
43
+ localRoot: input.localRoot,
44
+ lastRunAt: input.runAt,
45
+ });
46
+ }
47
+ /**
48
+ * FR8 never-acts anchor. Re-exposes the pipeline's structural guarantee that the
49
+ * cadence path cannot accept a finding, apply a route, or invoke PLAN/SHIP. The
50
+ * guarantee is the SHAPE of `computeNextDueAt` (no action parameter exists);
51
+ * this returns `true` purely as an explicit review anchor.
52
+ */
53
+ export async function assertOperatingCadenceCannotMutate() {
54
+ return (await loadCadenceModule()).assertCadenceCannotMutate();
55
+ }
56
+ //# sourceMappingURL=cadence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cadence.js","sourceRoot":"","sources":["../../../src/services/operate/cadence.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAwB,MAAM,YAAY,CAAC;AAyChE,IAAI,mBAAmB,GAA0C,IAAI,CAAC;AAEtE,KAAK,UAAU,iBAAiB;IAC9B,mBAAmB,KAAK,CAAC,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,GAAG,4BAA4B,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CACrE,CAA8C,CAAC;QAChD,IACE,OAAO,MAAM,CAAC,kBAAkB,KAAK,UAAU;YAC/C,OAAO,MAAM,CAAC,yBAAyB,KAAK,UAAU,EACtD,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QACD,OAAO,MAA+B,CAAC;IACzC,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,SAAwB,EACxB,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAI/C;IACC,MAAM,wBAAwB,CAAC;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,KAAK;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC;IACtD,OAAO,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC,yBAAyB,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,101 @@
1
+ import type { OperatingEvidenceCache } from './evidence-cache.js';
2
+ import { type OperatingSensitivity, type OperatingWorkspaceComponent } from './types.js';
3
+ export type CitationRejectionReason = 'fabricated-path' | 'wrong-line-range' | 'stale-revision' | 'unresolvable' | 'dirty-working-tree';
4
+ /** The canonical `operating-citation@1.3.0` anchor shape (exactly one locator). */
5
+ export interface OperatingCitation {
6
+ citationKey?: string;
7
+ repositoryPath?: string;
8
+ lineRange?: {
9
+ start: number;
10
+ end: number;
11
+ };
12
+ gitRevision?: string;
13
+ planrArtifactId?: string;
14
+ pinnedRevision: string;
15
+ }
16
+ /** A Protocol v1.3 `operating-data-gap` (`category: 'unresolvable-citation'`). */
17
+ export interface OperatingCitationGap {
18
+ kind: 'operating-data-gap';
19
+ schemaVersion: '1.0.0';
20
+ protocolVersion: '1.3.0';
21
+ id: string;
22
+ cycleId: string;
23
+ category: 'unresolvable-citation';
24
+ question: string;
25
+ reason: string;
26
+ unblocks: string[];
27
+ affectedRoles?: string[];
28
+ status: 'open';
29
+ owner: string;
30
+ evidenceRefs: string[];
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ }
34
+ export interface CitationResolutionContext {
35
+ projectRoot: string;
36
+ /** Must match `^CYCLE-[0-9]{3,}$` so an unresolvable-citation gap validates. */
37
+ cycleId: string;
38
+ /** The control repository descriptor: the frozen pinned revision and the dirty fingerprint. */
39
+ descriptor: OperatingWorkspaceComponent;
40
+ cache: OperatingEvidenceCache;
41
+ owner?: string;
42
+ affectedRoles?: string[];
43
+ snapshotTtlMs?: number;
44
+ now?: Date;
45
+ /** Sensitivity a snapshot inherits when the cited source declares none (defaults to `internal`). */
46
+ defaultSensitivity?: OperatingSensitivity;
47
+ /** Per-citation sensitivity inherited from the cited file (T-002's evidence-item sensitivity). */
48
+ sensitivityFor?(citation: OperatingCitation): OperatingSensitivity | undefined;
49
+ }
50
+ export interface ResolvedCitation {
51
+ citation: OperatingCitation;
52
+ citationKey: string;
53
+ outcome: 'resolved' | 'rejected';
54
+ reason?: CitationRejectionReason;
55
+ evidenceId?: string;
56
+ snapshotDigest?: `sha256:${string}`;
57
+ gap?: OperatingCitationGap;
58
+ sensitivity: OperatingSensitivity;
59
+ }
60
+ /**
61
+ * Resolve one citation against the cycle's pinned revision. Never throws for a
62
+ * resolvable/unresolvable outcome: a resolved citation carries an `evidenceId`
63
+ * whose snapshot has been persisted to machine-local evidence; a rejected one
64
+ * carries a distinct `reason` and a single unresolvable-citation `gap`.
65
+ */
66
+ export declare function resolveOperatingCitationAtPin(citation: OperatingCitation, context: CitationResolutionContext): Promise<ResolvedCitation>;
67
+ /** A proposal that carries the citations an advisor returned instead of pre-loaded evidence IDs. */
68
+ export interface CitationBearingProposal {
69
+ proposalKey: string;
70
+ citations: OperatingCitation[];
71
+ }
72
+ export interface RejectedProposalCitation {
73
+ proposalKey: string;
74
+ /** The primary rejection reason (the single gap opened for this proposal). */
75
+ reason: CitationRejectionReason;
76
+ /** Every distinct rejection reason across the proposal's citations. */
77
+ reasons: CitationRejectionReason[];
78
+ gapId: string;
79
+ }
80
+ export interface ProposalCitationEnforcement<P extends CitationBearingProposal> {
81
+ /** Proposals whose every citation resolved, with the minted evidence IDs attached. */
82
+ accepted: Array<{
83
+ proposal: P;
84
+ evidenceRefs: string[];
85
+ }>;
86
+ /** Proposals dropped before consolidation because a citation could not be resolved. */
87
+ rejected: RejectedProposalCitation[];
88
+ /** Exactly one unresolvable-citation gap per rejected proposal. */
89
+ gaps: OperatingCitationGap[];
90
+ evidenceIds: string[];
91
+ resolutions: ResolvedCitation[];
92
+ }
93
+ /**
94
+ * Resolve and enforce every proposal's citations before consolidation. A
95
+ * proposal whose citations all resolve is accepted with its minted evidence IDs
96
+ * attached; a proposal with ANY unresolvable citation is dropped and a single
97
+ * unresolvable-citation gap is opened in its place. Nothing with an unresolved
98
+ * citation is ever returned in `accepted`, so it can never reach consolidation.
99
+ */
100
+ export declare function enforceProposalCitations<P extends CitationBearingProposal>(proposals: readonly P[], context: CitationResolutionContext): Promise<ProposalCitationEnforcement<P>>;
101
+ //# sourceMappingURL=citation-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citation-resolution.d.ts","sourceRoot":"","sources":["../../../src/services/operate/citation-resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,308 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { resolvePipelinePackage } from '../pipeline-package-service.js';
5
+ import { resolvePlanrArtifactCitation } from './artifacts.js';
6
+ import { canonicalDigest } from './canonical.js';
7
+ import { assertOperatingArtifact } from './protocol.js';
8
+ import { gitRevisionResolves, readGitCommitSummary, readGitPathAtRevision, } from './read-only-providers.js';
9
+ import { redactSensitiveText } from './redaction.js';
10
+ import { OperateError, } from './types.js';
11
+ import { isPathInside } from './workspace.js';
12
+ /**
13
+ * FR3 (E-003) — resolve every citation an advisor returns against the cycle's
14
+ * pinned revision and snapshot the cited content into machine-local evidence.
15
+ *
16
+ * This module owns NO precedence and NO citation/gap shape. Every fact/reason
17
+ * mapping (path → line → revision → artifact) and the canonical resolution and
18
+ * unresolvable-citation gap records come from the installed pipeline's
19
+ * `lib/operate/citation.mjs` (`operating-citation@1.3.0`). This module supplies
20
+ * the facts — computed honestly against live git/`.planr/` state at the pinned
21
+ * revision — and, on a resolved outcome, snapshots the cited bytes through the
22
+ * standard redaction + secret-scan path before attaching the resulting evidence
23
+ * ID to the proposal. A citation with any unresolvable component NEVER produces
24
+ * an evidence ID: it fails closed into a gap, and its proposal never reaches
25
+ * consolidation.
26
+ *
27
+ * The one classification this module adds beyond the library — which by design
28
+ * has no repo access and cannot make it — is the DISTINCT dirty-working-tree
29
+ * rejection. The pin is frozen at cycle start; a citation into content that is
30
+ * present in the working tree but not committed at the pin would otherwise be
31
+ * indistinguishable from a fabricated path. Naming it distinctly keeps a
32
+ * legitimate finding that points at in-flight work from being silently
33
+ * discarded as a fabrication.
34
+ */
35
+ const DEFAULT_SNAPSHOT_TTL_MS = 24 * 60 * 60 * 1_000;
36
+ let cachedModule = null;
37
+ async function loadCitationModule() {
38
+ cachedModule ??= (async () => {
39
+ const pkg = resolvePipelinePackage(false);
40
+ if (!pkg) {
41
+ throw new OperateError('E_PIPELINE_NOT_INSTALLED', 'Citation resolution requires the pipeline package with Protocol v1.3 (operating-citation@1.3.0).');
42
+ }
43
+ const modulePath = path.join(pkg.root, 'lib', 'operate', 'citation.mjs');
44
+ const loaded = (await import(pathToFileURL(modulePath).href));
45
+ if (typeof loaded.resolveOperatingCitation !== 'function' ||
46
+ typeof loaded.validateOperatingCitation !== 'function' ||
47
+ typeof loaded.buildUnresolvableCitationGap !== 'function') {
48
+ throw new OperateError('E_PIPELINE_VERSION_INCOMPATIBLE', `Installed planr-pipeline ${pkg.version} does not export the Protocol v1.3 citation resolver.`);
49
+ }
50
+ return loaded;
51
+ })();
52
+ return cachedModule;
53
+ }
54
+ function citationKind(citation) {
55
+ if (typeof citation.repositoryPath === 'string')
56
+ return 'repo-path';
57
+ if (typeof citation.gitRevision === 'string')
58
+ return 'git-revision';
59
+ if (typeof citation.planrArtifactId === 'string')
60
+ return 'planr-artifact';
61
+ return null;
62
+ }
63
+ function stableCitationKey(citation) {
64
+ if (typeof citation.citationKey === 'string' && /^[A-Za-z0-9._-]+$/.test(citation.citationKey)) {
65
+ return citation.citationKey;
66
+ }
67
+ return `cite-${canonicalDigest(citation).slice('sha256:'.length, 34)}`;
68
+ }
69
+ function lineRangeWithin(range, lineCount) {
70
+ return (Number.isInteger(range.start) &&
71
+ Number.isInteger(range.end) &&
72
+ range.start >= 1 &&
73
+ range.end >= range.start &&
74
+ range.end <= lineCount);
75
+ }
76
+ async function workingTreeHasFile(projectRoot, relativePath) {
77
+ const root = path.resolve(projectRoot);
78
+ const target = path.resolve(root, relativePath);
79
+ if (!isPathInside(root, target))
80
+ return false;
81
+ try {
82
+ return (await stat(target)).isFile();
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ function dirtyWorkingTreeGap(citation, context, now) {
89
+ const range = citation.lineRange
90
+ ? ` lines ${citation.lineRange.start}-${citation.lineRange.end}`
91
+ : '';
92
+ const createdAt = now.toISOString();
93
+ const gap = {
94
+ kind: 'operating-data-gap',
95
+ schemaVersion: '1.0.0',
96
+ protocolVersion: '1.3.0',
97
+ id: `GAP-${canonicalDigest({ citation, reason: 'dirty-working-tree' }).slice('sha256:'.length)}`,
98
+ cycleId: context.cycleId,
99
+ category: 'unresolvable-citation',
100
+ question: `The repository path "${citation.repositoryPath}"${range} cites uncommitted working-tree ` +
101
+ `content that is not present at pinned revision ${citation.pinnedRevision}; commit the change ` +
102
+ 'or cite the pinned revision before this proposal can be accepted.',
103
+ reason: 'dirty-working-tree',
104
+ unblocks: [],
105
+ status: 'open',
106
+ owner: context.owner && context.owner.length > 0 ? context.owner : 'chair',
107
+ evidenceRefs: [],
108
+ createdAt,
109
+ updatedAt: createdAt,
110
+ };
111
+ return gap;
112
+ }
113
+ async function observeCitation(citation, context, sensitivity) {
114
+ const kind = citationKind(citation);
115
+ if (kind === 'repo-path' && citation.repositoryPath) {
116
+ const blob = await readGitPathAtRevision(context.projectRoot, citation.pinnedRevision, citation.repositoryPath);
117
+ const inWorkingTree = blob.exists
118
+ ? true
119
+ : await workingTreeHasFile(context.projectRoot, citation.repositoryPath);
120
+ return {
121
+ kind,
122
+ pathExistsAtRevision: blob.exists,
123
+ inWorkingTree,
124
+ content: blob.content,
125
+ lineCount: blob.lineCount,
126
+ location: citation.repositoryPath,
127
+ };
128
+ }
129
+ if (kind === 'git-revision' && citation.gitRevision) {
130
+ const resolves = await gitRevisionResolves(context.projectRoot, citation.gitRevision);
131
+ const summary = resolves
132
+ ? await readGitCommitSummary(context.projectRoot, citation.gitRevision)
133
+ : null;
134
+ return {
135
+ kind,
136
+ revisionResolves: resolves,
137
+ content: summary ?? `commit ${citation.gitRevision}`,
138
+ location: `git:${citation.gitRevision}`,
139
+ };
140
+ }
141
+ // planr-artifact
142
+ const resolution = await resolvePlanrArtifactCitation({
143
+ projectRoot: context.projectRoot,
144
+ pinnedRevision: citation.pinnedRevision,
145
+ artifactId: citation.planrArtifactId,
146
+ sensitivity,
147
+ });
148
+ return {
149
+ kind: 'planr-artifact',
150
+ artifactExists: resolution.artifactExists,
151
+ content: resolution.content,
152
+ location: resolution.location,
153
+ preRedacted: true,
154
+ };
155
+ }
156
+ function factsFor(citation, observation, cyclePinnedRevision, sensitivity) {
157
+ const facts = { sensitivity };
158
+ if (observation.kind === 'repo-path') {
159
+ facts.pathExistsAtRevision = observation.pathExistsAtRevision === true;
160
+ if (citation.lineRange) {
161
+ facts.lineRangeInBounds =
162
+ observation.pathExistsAtRevision === true &&
163
+ lineRangeWithin(citation.lineRange, observation.lineCount ?? 0);
164
+ }
165
+ facts.revisionIsCurrent = citation.pinnedRevision === cyclePinnedRevision;
166
+ }
167
+ else if (observation.kind === 'git-revision') {
168
+ facts.revisionIsCurrent =
169
+ citation.pinnedRevision === cyclePinnedRevision && observation.revisionResolves === true;
170
+ }
171
+ else {
172
+ facts.artifactExists = observation.artifactExists === true;
173
+ }
174
+ return facts;
175
+ }
176
+ /**
177
+ * Resolve one citation against the cycle's pinned revision. Never throws for a
178
+ * resolvable/unresolvable outcome: a resolved citation carries an `evidenceId`
179
+ * whose snapshot has been persisted to machine-local evidence; a rejected one
180
+ * carries a distinct `reason` and a single unresolvable-citation `gap`.
181
+ */
182
+ export async function resolveOperatingCitationAtPin(citation, context) {
183
+ const module = await loadCitationModule();
184
+ try {
185
+ module.validateOperatingCitation(citation);
186
+ }
187
+ catch (error) {
188
+ throw new OperateError('E_OPERATE_STATE_INVALID', `Citation is not a valid operating-citation@1.3.0 anchor: ${error instanceof Error ? error.message : String(error)}.`);
189
+ }
190
+ const now = context.now ?? new Date();
191
+ const citationKey = stableCitationKey(citation);
192
+ const keyed = { ...citation, citationKey };
193
+ const sensitivity = context.sensitivityFor?.(citation) ?? context.defaultSensitivity ?? 'internal';
194
+ const observation = await observeCitation(keyed, context, sensitivity);
195
+ // Distinct dirty-working-tree classification, ahead of the library's
196
+ // path-existence precedence: a cited path absent at the pin but present and
197
+ // uncommitted in a dirty working tree is named separately from a fabrication.
198
+ if (observation.kind === 'repo-path' &&
199
+ observation.pathExistsAtRevision === false &&
200
+ observation.inWorkingTree === true &&
201
+ context.descriptor.dirtyFingerprint !== null) {
202
+ const gap = await assertOperatingArtifact('operating-data-gap', dirtyWorkingTreeGap(keyed, context, now));
203
+ return {
204
+ citation: keyed,
205
+ citationKey,
206
+ outcome: 'rejected',
207
+ reason: 'dirty-working-tree',
208
+ gap,
209
+ sensitivity,
210
+ };
211
+ }
212
+ const facts = factsFor(keyed, observation, context.descriptor.pinnedRevision, sensitivity);
213
+ const resolution = module.resolveOperatingCitation(keyed, facts);
214
+ if (resolution.outcome === 'rejected') {
215
+ const gap = module.buildUnresolvableCitationGap(keyed, resolution, {
216
+ cycleId: context.cycleId,
217
+ createdAt: now.toISOString(),
218
+ owner: context.owner,
219
+ affectedRoles: context.affectedRoles,
220
+ });
221
+ return {
222
+ citation: keyed,
223
+ citationKey,
224
+ outcome: 'rejected',
225
+ reason: resolution.reason,
226
+ gap,
227
+ sensitivity,
228
+ };
229
+ }
230
+ // Resolved: snapshot the cited bytes through the standard redaction path and
231
+ // persist them as machine-local evidence under the resolver-minted id.
232
+ const rawContent = observation.content ?? '';
233
+ const content = observation.preRedacted ? rawContent : redactSensitiveText(rawContent).value;
234
+ await context.cache.putCitationSnapshot({
235
+ evidenceId: resolution.evidenceId,
236
+ citationKey,
237
+ snapshotDigest: resolution.snapshotDigest,
238
+ sourceLocation: observation.location ?? citationKey,
239
+ sensitivity,
240
+ content,
241
+ }, context.snapshotTtlMs ?? DEFAULT_SNAPSHOT_TTL_MS, now);
242
+ return {
243
+ citation: keyed,
244
+ citationKey,
245
+ outcome: 'resolved',
246
+ evidenceId: resolution.evidenceId,
247
+ snapshotDigest: resolution.snapshotDigest,
248
+ sensitivity,
249
+ };
250
+ }
251
+ /**
252
+ * Resolve and enforce every proposal's citations before consolidation. A
253
+ * proposal whose citations all resolve is accepted with its minted evidence IDs
254
+ * attached; a proposal with ANY unresolvable citation is dropped and a single
255
+ * unresolvable-citation gap is opened in its place. Nothing with an unresolved
256
+ * citation is ever returned in `accepted`, so it can never reach consolidation.
257
+ */
258
+ export async function enforceProposalCitations(proposals, context) {
259
+ const accepted = [];
260
+ const rejected = [];
261
+ const gapsById = new Map();
262
+ const evidenceIds = new Set();
263
+ const resolutions = [];
264
+ for (const proposal of proposals) {
265
+ const citations = Array.isArray(proposal.citations) ? proposal.citations : [];
266
+ const proposalResolutions = [];
267
+ for (const citation of citations) {
268
+ const resolved = await resolveOperatingCitationAtPin(citation, context);
269
+ proposalResolutions.push(resolved);
270
+ resolutions.push(resolved);
271
+ }
272
+ const rejectedCitations = proposalResolutions.filter((resolution) => resolution.outcome === 'rejected');
273
+ if (rejectedCitations.length > 0) {
274
+ // Exactly one gap per rejected proposal: the first rejected citation is the
275
+ // representative cause and owns the opened gap.
276
+ const primary = rejectedCitations[0];
277
+ if (primary.gap)
278
+ gapsById.set(primary.gap.id, primary.gap);
279
+ rejected.push({
280
+ proposalKey: proposal.proposalKey,
281
+ reason: primary.reason,
282
+ reasons: [
283
+ ...new Set(rejectedCitations
284
+ .map((resolution) => resolution.reason)
285
+ .filter((reason) => Boolean(reason))),
286
+ ].sort(),
287
+ gapId: primary.gap?.id ?? '',
288
+ });
289
+ continue;
290
+ }
291
+ const evidenceRefs = [
292
+ ...new Set(proposalResolutions
293
+ .map((resolution) => resolution.evidenceId)
294
+ .filter((id) => Boolean(id))),
295
+ ].sort();
296
+ for (const id of evidenceRefs)
297
+ evidenceIds.add(id);
298
+ accepted.push({ proposal, evidenceRefs });
299
+ }
300
+ return {
301
+ accepted,
302
+ rejected,
303
+ gaps: [...gapsById.values()].sort((left, right) => left.id.localeCompare(right.id)),
304
+ evidenceIds: [...evidenceIds].sort(),
305
+ resolutions,
306
+ };
307
+ }
308
+ //# sourceMappingURL=citation-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citation-resolution.js","sourceRoot":"","sources":["../../../src/services/operate/citation-resolution.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type JournalWrite } from './journal.js';
2
- import { type OperatingCharter, type OperatingConfig, type OperatingEventHead, type OperatingInitAnswers, type OperatingLocalPreferences, type OperatingProfile, type OperatingWorkspaceManifest } from './types.js';
2
+ import type { OperatingDispatchMode } from './mission-dispatch.js';
3
+ import { type OperatingCharter, type OperatingConfig, type OperatingEventHead, type OperatingInitAnswers, type OperatingLocalPreferences, type OperatingProfile, type OperatingRoleId, type OperatingWorkspaceManifest } from './types.js';
3
4
  export declare const OPERATING_PROFILES: readonly OperatingProfile[];
4
5
  export declare function listOperatingProfiles(): OperatingProfile[];
5
6
  export declare function getOperatingProfile(id: OperatingProfile['id']): OperatingProfile;
@@ -9,6 +10,70 @@ export declare function getOperatingProfile(id: OperatingProfile['id']): Operati
9
10
  * (including accidental secrets) never reach command results.
10
11
  */
11
12
  export declare function normalizeCustomOperatingProfile(value: unknown): Partial<OperatingProfile>;
13
+ /**
14
+ * Per-project dispatch-mode overrides (FR4 / E-004). A map of role IDs to a
15
+ * `pack | mission` selection that overrides the derived v1.3 registry default.
16
+ *
17
+ * These live in the machine-local `preferences.json`, NOT the schema-frozen
18
+ * `operating-config` artifact: the v1.2 on-disk config surface is frozen
19
+ * (`additionalProperties: false`), so v1.3 dispatch policy is carried in the
20
+ * local operating preferences alongside `sensitivityCeiling` and `runtime`.
21
+ */
22
+ export type OperatingDispatchModeOverrides = Record<OperatingRoleId, OperatingDispatchMode>;
23
+ /**
24
+ * Strictly allowlist per-project dispatch-mode overrides before they are echoed,
25
+ * persisted, or consumed by dispatch — mirroring the `normalizeCustomOperatingProfile`
26
+ * pattern. Keys must be known registry role IDs; values must be exactly `pack`
27
+ * or `mission`. Unknown roles or values fail closed with `E_OPERATE_CONFIG_INVALID`.
28
+ */
29
+ export declare function normalizeOperatingDispatchModeOverrides(value: unknown): OperatingDispatchModeOverrides;
30
+ /**
31
+ * Parse repeatable `--dispatch-mode-override <roleId>=<pack|mission>` CLI tokens
32
+ * into a validated override map. Each token must be exactly `roleId=mode`.
33
+ */
34
+ export declare function parseOperatingDispatchModeOverrideFlags(flags?: readonly string[]): OperatingDispatchModeOverrides;
35
+ /** Read the validated per-project dispatch-mode overrides, or `{}` when none set. */
36
+ export declare function readOperatingDispatchModeOverrides(projectRoot: string, options?: {
37
+ localRoot?: string;
38
+ }): Promise<OperatingDispatchModeOverrides>;
39
+ /**
40
+ * Merge validated dispatch-mode overrides into the machine-local preferences and
41
+ * persist atomically (temp + rename, mode 0o600), matching how initialization
42
+ * writes preferences.json. An override set to the registry default can be
43
+ * cleared by omitting it. Requires the project to have been initialized.
44
+ */
45
+ export declare function applyOperatingDispatchModeOverrides(input: {
46
+ projectRoot: string;
47
+ localRoot?: string;
48
+ overrides: OperatingDispatchModeOverrides;
49
+ }): Promise<{
50
+ dispatchModeOverrides: OperatingDispatchModeOverrides;
51
+ changed: boolean;
52
+ }>;
53
+ /**
54
+ * Read the persisted per-project cadence `lastRunAt` marker (FR8 / E-008), or
55
+ * `null` when no cycle has completed yet. Machine-local, alongside
56
+ * `dispatchModeOverrides`.
57
+ */
58
+ export declare function readOperatingLastRunAt(projectRoot: string, options?: {
59
+ localRoot?: string;
60
+ }): Promise<string | null>;
61
+ /**
62
+ * Persist the per-project cadence `lastRunAt` marker into the machine-local
63
+ * preferences atomically (temp + rename, mode 0o600), matching how dispatch-mode
64
+ * overrides are written. FR8 / E-008: recorded whenever a cycle reaches
65
+ * reviewable/blocked/closed so `operate status` can surface the pipeline's
66
+ * `nextDueAt` under an injected clock. `lastRunAt` is the injected cycle instant,
67
+ * never a wall-clock read here. Requires an initialized project.
68
+ */
69
+ export declare function recordOperatingLastRunAt(input: {
70
+ projectRoot: string;
71
+ localRoot?: string;
72
+ lastRunAt: string;
73
+ }): Promise<{
74
+ lastRunAt: string;
75
+ changed: boolean;
76
+ }>;
12
77
  export declare function normalizeCharter(input?: Partial<OperatingCharter>): OperatingCharter;
13
78
  /** Normalize already-validated questionnaire or explicit CLI answers once. */
14
79
  export declare function normalizeOperatingInitializationAnswers(input: OperatingInitAnswers): OperatingInitAnswers;
@@ -41,6 +106,7 @@ export declare function prepareOperatingInitialization(input: {
41
106
  charter?: Partial<OperatingCharter>;
42
107
  customProfile?: Partial<OperatingProfile>;
43
108
  componentRoots?: string[];
109
+ dispatchModeOverrides?: OperatingDispatchModeOverrides;
44
110
  localRoot?: string;
45
111
  now?: string;
46
112
  }): Promise<OperatingInitializationPreview>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/operate/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/operate/config.ts"],"names":[],"mappings":"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"}