@cat-factory/kernel 0.327.0 → 0.329.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domain/environment-reachability.logic.d.ts +34 -0
- package/dist/domain/environment-reachability.logic.d.ts.map +1 -1
- package/dist/domain/environment-reachability.logic.js +75 -3
- package/dist/domain/environment-reachability.logic.js.map +1 -1
- package/dist/domain/monorepo-adoption.logic.d.ts +87 -0
- package/dist/domain/monorepo-adoption.logic.d.ts.map +1 -0
- package/dist/domain/monorepo-adoption.logic.js +323 -0
- package/dist/domain/monorepo-adoption.logic.js.map +1 -0
- package/dist/domain/pr-report.d.ts +27 -3
- package/dist/domain/pr-report.d.ts.map +1 -1
- package/dist/domain/pr-report.js +28 -10
- package/dist/domain/pr-report.js.map +1 -1
- package/dist/domain/service-registration.d.ts +11 -3
- package/dist/domain/service-registration.d.ts.map +1 -1
- package/dist/domain/service-registration.js +9 -1
- package/dist/domain/service-registration.js.map +1 -1
- package/dist/domain/types.d.ts +1 -1
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/ports/agent-runs.d.ts +4 -1
- package/dist/ports/agent-runs.d.ts.map +1 -1
- package/dist/ports/bootstrap-repositories.d.ts +49 -2
- package/dist/ports/bootstrap-repositories.d.ts.map +1 -1
- package/dist/ports/bootstrap-runner.d.ts +15 -8
- package/dist/ports/bootstrap-runner.d.ts.map +1 -1
- package/dist/ports/bootstrap-runner.js.map +1 -1
- package/dist/ports/environment-investigation.d.ts +51 -1
- package/dist/ports/environment-investigation.d.ts.map +1 -1
- package/dist/ports/environment-provider.d.ts +22 -2
- package/dist/ports/environment-provider.d.ts.map +1 -1
- package/dist/ports/environment-repositories.d.ts +27 -1
- package/dist/ports/environment-repositories.d.ts.map +1 -1
- package/dist/ports/index.d.ts +4 -3
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/monorepo-adoption.d.ts +37 -0
- package/dist/ports/monorepo-adoption.d.ts.map +1 -0
- package/dist/ports/monorepo-adoption.js +2 -0
- package/dist/ports/monorepo-adoption.js.map +1 -0
- package/dist/ports/repo-bootstrapper.d.ts +89 -3
- package/dist/ports/repo-bootstrapper.d.ts.map +1 -1
- package/dist/ports/repo-files.d.ts +16 -0
- package/dist/ports/repo-files.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -114,6 +114,40 @@ export declare function describeUnreachableEnvironment(url: string | null, proof
|
|
|
114
114
|
* than merely harmless.
|
|
115
115
|
*/
|
|
116
116
|
export declare function describeInconclusiveRoute(url: string | null, proof: EnvironmentRouteProof): string;
|
|
117
|
+
/**
|
|
118
|
+
* `<target> (<outcome>: <detail>), …` for every target a proof tried, or the empty string when it
|
|
119
|
+
* tried none.
|
|
120
|
+
*
|
|
121
|
+
* Exported because THREE surfaces render this same list from the same field, and they had drifted
|
|
122
|
+
* into three copies of the template: the two operator sentences below, the investigation's
|
|
123
|
+
* timeline entry, and the investigation prompt's own route section. A change to the attempt shape
|
|
124
|
+
* that has to be found in three packages is a change that gets made in two, which is how one of
|
|
125
|
+
* them came to ship the detail unscrubbed while its neighbour scrubbed it.
|
|
126
|
+
*
|
|
127
|
+
* Renders whatever it is handed. Redaction and capping belong to whoever owns the BOUNDARY the
|
|
128
|
+
* string is crossing (the diagnostics gatherer does both for the prompt and the telemetry store),
|
|
129
|
+
* because an operator reading a failed deploy and a model reading a prompt are owed different
|
|
130
|
+
* amounts of the probe's own words.
|
|
131
|
+
*/
|
|
132
|
+
export declare function describeRouteTargets(attempts: readonly EnvironmentRouteAttempt[]): string;
|
|
133
|
+
/**
|
|
134
|
+
* The cause an unreachable environment's own route evidence SETTLES, or null when it settles none.
|
|
135
|
+
*
|
|
136
|
+
* The platform computing what it can compute, so a reader is not left to rank a determinate cause
|
|
137
|
+
* against an inferred one. Both members here name an owner and a concrete fix, and both were
|
|
138
|
+
* SUBORDINATED to a wrong headline in the failure that filed this: the investigation found "no
|
|
139
|
+
* balancer or address field was captured at all" and filed it as one bullet under a verdict
|
|
140
|
+
* blaming a platform readiness gate that had in fact worked, sending a human to change three
|
|
141
|
+
* behaviours that were already correct.
|
|
142
|
+
*
|
|
143
|
+
* Deliberately narrow. It answers only where NOTHING was available to dial, which is a fact about
|
|
144
|
+
* the platform's own inputs rather than a judgement about the environment: whether the workload is
|
|
145
|
+
* healthy, whether the provider is lying and whether anything is worth retrying all stay the
|
|
146
|
+
* model's to settle. `reached` and `inconclusive` therefore settle nothing here, the second
|
|
147
|
+
* because it is an admission about the platform and naming it a cause is how "we could not tell"
|
|
148
|
+
* comes to read as a verdict.
|
|
149
|
+
*/
|
|
150
|
+
export declare function determinateRouteCause(candidates: readonly EnvironmentAddress[], proof: EnvironmentRouteProof | null): string | null;
|
|
117
151
|
/**
|
|
118
152
|
* The proof recorded when nothing was wired to open a socket.
|
|
119
153
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-reachability.logic.d.ts","sourceRoot":"","sources":["../../src/domain/environment-reachability.logic.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAMnF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB;AAC1B,yFAAyF;AACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrF,0FAA0F;GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAA;AAE7F;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,UAAU,GAAE,SAAS,kBAAkB,EAAO,EAC9C,SAAS,GAAE,MAA+B,GACzC,gBAAgB,EAAE,CA4BpB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnD,OAAO,EAAE,iBAAiB,GACzB,uBAAuB,CAQzB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GACrD,uBAAuB,CAEzB;AAwCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,EAAE,MAAM,GAChB,qBAAqB,CA6BvB;AAcD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,EAAE,qBAAqB,GAC3B,MAAM,CAKR;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,EAAE,qBAAqB,GAC3B,MAAM,CAKR;
|
|
1
|
+
{"version":3,"file":"environment-reachability.logic.d.ts","sourceRoot":"","sources":["../../src/domain/environment-reachability.logic.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAMnF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB;AAC1B,yFAAyF;AACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrF,0FAA0F;GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAA;AAE7F;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,UAAU,GAAE,SAAS,kBAAkB,EAAO,EAC9C,SAAS,GAAE,MAA+B,GACzC,gBAAgB,EAAE,CA4BpB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnD,OAAO,EAAE,iBAAiB,GACzB,uBAAuB,CAQzB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GACrD,uBAAuB,CAEzB;AAwCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,EAAE,MAAM,GAChB,qBAAqB,CA6BvB;AAcD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,EAAE,qBAAqB,GAC3B,MAAM,CAKR;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,EAAE,qBAAqB,GAC3B,MAAM,CAKR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,GAAG,MAAM,CAOzF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,SAAS,kBAAkB,EAAE,EACzC,KAAK,EAAE,qBAAqB,GAAG,IAAI,GAClC,MAAM,GAAG,IAAI,CAwCf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAEtE"}
|
|
@@ -251,13 +251,85 @@ export function describeInconclusiveRoute(url, proof) {
|
|
|
251
251
|
const where = url ? `The route to the environment at ${url}` : 'The route to the environment';
|
|
252
252
|
return `${where} could not be established either way: ${cause}.${describeRouteAttempts(proof)}`;
|
|
253
253
|
}
|
|
254
|
-
/**
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
/**
|
|
255
|
+
* `<target> (<outcome>: <detail>), …` for every target a proof tried, or the empty string when it
|
|
256
|
+
* tried none.
|
|
257
|
+
*
|
|
258
|
+
* Exported because THREE surfaces render this same list from the same field, and they had drifted
|
|
259
|
+
* into three copies of the template: the two operator sentences below, the investigation's
|
|
260
|
+
* timeline entry, and the investigation prompt's own route section. A change to the attempt shape
|
|
261
|
+
* that has to be found in three packages is a change that gets made in two, which is how one of
|
|
262
|
+
* them came to ship the detail unscrubbed while its neighbour scrubbed it.
|
|
263
|
+
*
|
|
264
|
+
* Renders whatever it is handed. Redaction and capping belong to whoever owns the BOUNDARY the
|
|
265
|
+
* string is crossing (the diagnostics gatherer does both for the prompt and the telemetry store),
|
|
266
|
+
* because an operator reading a failed deploy and a model reading a prompt are owed different
|
|
267
|
+
* amounts of the probe's own words.
|
|
268
|
+
*/
|
|
269
|
+
export function describeRouteTargets(attempts) {
|
|
270
|
+
return attempts
|
|
257
271
|
.map((attempt) => `${attempt.target} (${attempt.outcome}${attempt.detail ? `: ${attempt.detail}` : ''})`)
|
|
258
272
|
.join(', ');
|
|
273
|
+
}
|
|
274
|
+
/** ` Tried: <target> (<outcome>: <detail>), ….`, or empty when nothing was tried. */
|
|
275
|
+
function describeRouteAttempts(proof) {
|
|
276
|
+
const tried = describeRouteTargets(proof.attempts);
|
|
259
277
|
return tried ? ` Tried: ${tried}.` : '';
|
|
260
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* The cause an unreachable environment's own route evidence SETTLES, or null when it settles none.
|
|
281
|
+
*
|
|
282
|
+
* The platform computing what it can compute, so a reader is not left to rank a determinate cause
|
|
283
|
+
* against an inferred one. Both members here name an owner and a concrete fix, and both were
|
|
284
|
+
* SUBORDINATED to a wrong headline in the failure that filed this: the investigation found "no
|
|
285
|
+
* balancer or address field was captured at all" and filed it as one bullet under a verdict
|
|
286
|
+
* blaming a platform readiness gate that had in fact worked, sending a human to change three
|
|
287
|
+
* behaviours that were already correct.
|
|
288
|
+
*
|
|
289
|
+
* Deliberately narrow. It answers only where NOTHING was available to dial, which is a fact about
|
|
290
|
+
* the platform's own inputs rather than a judgement about the environment: whether the workload is
|
|
291
|
+
* healthy, whether the provider is lying and whether anything is worth retrying all stay the
|
|
292
|
+
* model's to settle. `reached` and `inconclusive` therefore settle nothing here, the second
|
|
293
|
+
* because it is an admission about the platform and naming it a cause is how "we could not tell"
|
|
294
|
+
* comes to read as a verdict.
|
|
295
|
+
*/
|
|
296
|
+
export function determinateRouteCause(candidates, proof) {
|
|
297
|
+
if (!proof)
|
|
298
|
+
return null;
|
|
299
|
+
// `no_candidate` arrives as `inconclusive` from {@link reduceRouteProof} (nothing was tried, so
|
|
300
|
+
// nothing was established) and is checked ahead of the state for exactly that reason: it is the
|
|
301
|
+
// one reason whose cause is determinate WITHOUT a verdict about the environment, because the
|
|
302
|
+
// environment published no host and port to dial in the first place.
|
|
303
|
+
if (proof.reason === 'no_candidate') {
|
|
304
|
+
if (candidates.length === 0) {
|
|
305
|
+
return ('This environment carries no address to dial at all: no URL with a host and port, and no ' +
|
|
306
|
+
'address stated for one. Nothing was tried because there was nothing to try, so this is a ' +
|
|
307
|
+
'fact about what the provider published, never a verdict about the environment. Whoever ' +
|
|
308
|
+
'maps this provider onto a URL (and onto stated addresses, if the name is not resolvable ' +
|
|
309
|
+
'from this deployment) owns the fix.');
|
|
310
|
+
}
|
|
311
|
+
// The SAME reason, a different fact, and telling a reader the provider stated no addresses
|
|
312
|
+
// when it stated several is the misdirection this whole function exists to prevent. A stated
|
|
313
|
+
// address is dialled on the port the URL names (`planRouteProbes` needs a host AND a port
|
|
314
|
+
// before it will plan anything), so an environment with addresses and no parseable URL had
|
|
315
|
+
// nothing to dial them ON, and the fix is one field over from where the empty-list wording
|
|
316
|
+
// would send someone.
|
|
317
|
+
const count = candidates.length === 1 ? '1 address' : `${candidates.length} addresses`;
|
|
318
|
+
return (`This environment published no URL with a host and port, so the ${count} its provider DID ` +
|
|
319
|
+
'state could not be dialled either: an address is tried on the port the URL names, and ' +
|
|
320
|
+
'there was none. Nothing was tried because there was nothing to try it on, so this is a ' +
|
|
321
|
+
'fact about what the provider published, never a verdict about the environment. Whoever ' +
|
|
322
|
+
"maps this provider onto the environment's URL owns the fix; the stated addresses are not " +
|
|
323
|
+
'the gap here.');
|
|
324
|
+
}
|
|
325
|
+
if (proof.state !== 'not_reached' || candidates.length > 0)
|
|
326
|
+
return null;
|
|
327
|
+
return ("The only target that ever existed was the environment's own name, because the provider " +
|
|
328
|
+
'stated no addresses for it. Nothing else was tried because there was nothing else to try: ' +
|
|
329
|
+
'the empty candidate list means addresses were never STATED, not that stated addresses were ' +
|
|
330
|
+
'tried and failed. Whoever maps this provider onto stated addresses owns the fix, and this ' +
|
|
331
|
+
'ranks ahead of any fault inferred from the ORDER platform events appear to have happened in.');
|
|
332
|
+
}
|
|
261
333
|
/**
|
|
262
334
|
* The proof recorded when nothing was wired to open a socket.
|
|
263
335
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-reachability.logic.js","sourceRoot":"","sources":["../../src/domain/environment-reachability.logic.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"environment-reachability.logic.js","sourceRoot":"","sources":["../../src/domain/environment-reachability.logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type AdoptionArea, type AdoptionChoice, type AdoptionDecision, type AdoptionPlan, type AdoptionSource, type AdoptionSurvey, type ResolvedAdoption } from '@cat-factory/contracts';
|
|
2
|
+
/** Cap on how many decisions one plan may carry, so a runaway reply can't produce a wall of them. */
|
|
3
|
+
export declare const MAX_ADOPTION_DECISIONS = 24;
|
|
4
|
+
/**
|
|
5
|
+
* One convention area, in the words the review UI and the agent brief both use.
|
|
6
|
+
*
|
|
7
|
+
* The `default` is unreachable while the type is honoured, which is the point: adding a member
|
|
8
|
+
* fails the build here, and a member RETIRED after a plan was stored still renders honestly
|
|
9
|
+
* instead of splicing `undefined` into the sentence a human is deciding from.
|
|
10
|
+
*/
|
|
11
|
+
export declare function describeAdoptionArea(area: AdoptionArea): string;
|
|
12
|
+
/** One side of the decision, as an instruction an agent can act on without further inference. */
|
|
13
|
+
export declare function describeAdoptionSource(source: AdoptionSource): string;
|
|
14
|
+
/** Whether a stored string is an area THIS build defines, narrowed from the schema's own options. */
|
|
15
|
+
export declare function isAdoptionArea(value: unknown): value is AdoptionArea;
|
|
16
|
+
/** Whether a stored string is a choice THIS build defines, narrowed from the schema's own options. */
|
|
17
|
+
export declare function isAdoptionSource(value: unknown): value is AdoptionSource;
|
|
18
|
+
/** What {@link parseAdoptionDecisions} produced, plus what it refused to carry through. */
|
|
19
|
+
export interface ParsedAdoptionDecisions {
|
|
20
|
+
decisions: AdoptionDecision[];
|
|
21
|
+
/** One line per dropped recommendation, naming it and why. Rendered to the reviewer. */
|
|
22
|
+
dropped: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read a model's raw reply into the stored decision list, keeping only what it can support.
|
|
26
|
+
*
|
|
27
|
+
* The model is asked for `{ decisions: [...] }`; anything else is not a plan. Each decision has
|
|
28
|
+
* to survive three checks, and each one is a way the review would otherwise mislead:
|
|
29
|
+
*
|
|
30
|
+
* - a duplicate or missing `id` makes the human's answer unaddressable, so the line is dropped;
|
|
31
|
+
* - an area or recommendation outside the CURRENT vocabulary cannot be rendered or acted on;
|
|
32
|
+
* - evidence that names no path the survey actually read means the claim about the monorepo
|
|
33
|
+
* has nothing behind it. The line is dropped rather than shown unmarked, because a reviewer
|
|
34
|
+
* reads an unmarked line as something the platform checked.
|
|
35
|
+
*
|
|
36
|
+
* Every drop is REPORTED, never silent: a plan that lost half its lines to invention looks
|
|
37
|
+
* exactly like a monorepo with few conventions, and those need opposite reactions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseAdoptionDecisions(raw: unknown, survey: AdoptionSurvey): ParsedAdoptionDecisions;
|
|
40
|
+
/**
|
|
41
|
+
* Settle a human review against the plan it answers, or throw the refusal naming what is wrong.
|
|
42
|
+
*
|
|
43
|
+
* Refuses rather than repairs, on both sides of the mismatch. An UNANSWERED decision cannot be
|
|
44
|
+
* defaulted to the recommendation without erasing the difference between agreeing with it and
|
|
45
|
+
* never having read it, which is the single fact this whole step exists to record. An answer
|
|
46
|
+
* naming a decision the plan does not have means the reviewer was looking at a different plan
|
|
47
|
+
* (a stale tab, a re-run survey), and applying the rest of it would build under a review that
|
|
48
|
+
* was never given for this proposal.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveAdoptionReview(plan: AdoptionPlan, choices: readonly AdoptionChoice[], context: {
|
|
51
|
+
reviewedByUserId: string | null;
|
|
52
|
+
reviewedAt: number;
|
|
53
|
+
notes?: string | undefined;
|
|
54
|
+
}): ResolvedAdoption;
|
|
55
|
+
/**
|
|
56
|
+
* Render the settled review as the adoption section of the apply phase's brief.
|
|
57
|
+
*
|
|
58
|
+
* Every decision is stated as a SIDE plus the reviewer's own words where they left any, and the
|
|
59
|
+
* overrides are called out: an agent told only "use the monorepo's test runner" cannot tell a
|
|
60
|
+
* default it may reason around from a human who deliberately overruled the recommendation, and
|
|
61
|
+
* the second is not negotiable. The list is exhaustive on purpose: an area the reviewer settled
|
|
62
|
+
* and the brief omits is an area the agent decides again, unreviewed.
|
|
63
|
+
*
|
|
64
|
+
* The holes are VERBATIM here. {@link renderAdoptionPrSection} is the rendering for the pull
|
|
65
|
+
* request; do not send this one to a host.
|
|
66
|
+
*/
|
|
67
|
+
export declare function renderAdoptionBrief(resolved: ResolvedAdoption, directory: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* Render the settled review for the PULL REQUEST the apply phase opens.
|
|
70
|
+
*
|
|
71
|
+
* The same list, addressed to the human reviewing the change rather than to the agent making it:
|
|
72
|
+
* what a reviewer of a bootstrap PR is being asked is whether the service fits the monorepo, and
|
|
73
|
+
* what settles that is which side each area came from and who chose it, which the diff cannot
|
|
74
|
+
* show. Every hole crosses {@link HOST_SINK}, because both the titles (model-authored) and the
|
|
75
|
+
* notes (reviewer-authored) are untrusted text landing on a parsed surface. The caller scrubs
|
|
76
|
+
* secrets at compose time, before any of this is capped.
|
|
77
|
+
*/
|
|
78
|
+
export declare function renderAdoptionPrSection(resolved: ResolvedAdoption, directory: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* The default branch name for a monorepo bootstrap's pull request.
|
|
81
|
+
*
|
|
82
|
+
* Derived from the run's own id rather than the service name so two bootstraps of similarly
|
|
83
|
+
* named services can never collide on one branch, and stable per run so a retry of the SAME run
|
|
84
|
+
* resumes its branch instead of opening a second pull request against the monorepo.
|
|
85
|
+
*/
|
|
86
|
+
export declare function monorepoBootstrapBranch(jobId: string): string;
|
|
87
|
+
//# sourceMappingURL=monorepo-adoption.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo-adoption.logic.d.ts","sourceRoot":"","sources":["../../src/domain/monorepo-adoption.logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAEtB,MAAM,wBAAwB,CAAA;AAsB/B,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAcxC;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA6B/D;AAOD,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAarE;AAED,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAIpE;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAIxE;AAED,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,wFAAwF;IACxF,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,cAAc,GACrB,uBAAuB,CAiEzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,OAAO,EAAE;IAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC3F,gBAAgB,CA+ClB;AA8DD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAe7F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { adoptionAreaSchema, adoptionSourceSchema, MAX_ADOPTION_DROP_LINES, } from '@cat-factory/contracts';
|
|
2
|
+
import * as hostMarkdown from '../shared/host-markdown.logic.js';
|
|
3
|
+
import { ValidationError } from './errors.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// The rules over a monorepo bootstrap's adoption plan: reading a model's proposal into the
|
|
6
|
+
// stored shape, settling a human review against it, and rendering the settled result as the
|
|
7
|
+
// brief the apply phase's agent works from.
|
|
8
|
+
//
|
|
9
|
+
// Pure (no repository, no model, no clock beyond what is passed), because every one of these
|
|
10
|
+
// is a place the flow can silently become useless, and the failure modes are only visible when
|
|
11
|
+
// they can be driven directly:
|
|
12
|
+
//
|
|
13
|
+
// - a recommendation whose EVIDENCE names nothing the survey read is the model asserting a
|
|
14
|
+
// monorepo convention it invented, and it is the one claim a reviewer cannot check by eye;
|
|
15
|
+
// - a review that leaves a decision unanswered must be REFUSED, not defaulted onto the
|
|
16
|
+
// recommendation, because "I agree" and "I did not look" are exactly what this step exists
|
|
17
|
+
// to tell apart;
|
|
18
|
+
// - a settled decision must reach the agent's brief in words that name a SIDE, since
|
|
19
|
+
// "adopt from the monorepo" and "keep the template's" are the whole deliverable.
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/** Cap on how many decisions one plan may carry, so a runaway reply can't produce a wall of them. */
|
|
22
|
+
export const MAX_ADOPTION_DECISIONS = 24;
|
|
23
|
+
/**
|
|
24
|
+
* A stored area this build no longer defines, named as the retired value it is.
|
|
25
|
+
*
|
|
26
|
+
* Deliberately NOT mapped onto a current member: nothing here knows which one was meant, and a
|
|
27
|
+
* plan is PERSISTED, so a run parked before a vocabulary change is read back by exactly the
|
|
28
|
+
* surface whose job is to tell a human what they are approving. Guessing would put a wrong
|
|
29
|
+
* label on a decision that changes what gets built.
|
|
30
|
+
*/
|
|
31
|
+
function describeRetiredArea(area) {
|
|
32
|
+
return `'${String(area)}' (an area this deployment no longer defines; re-run the survey)`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* One convention area, in the words the review UI and the agent brief both use.
|
|
36
|
+
*
|
|
37
|
+
* The `default` is unreachable while the type is honoured, which is the point: adding a member
|
|
38
|
+
* fails the build here, and a member RETIRED after a plan was stored still renders honestly
|
|
39
|
+
* instead of splicing `undefined` into the sentence a human is deciding from.
|
|
40
|
+
*/
|
|
41
|
+
export function describeAdoptionArea(area) {
|
|
42
|
+
switch (area) {
|
|
43
|
+
case 'build-tooling':
|
|
44
|
+
return 'build tooling';
|
|
45
|
+
case 'dependencies':
|
|
46
|
+
return 'dependency versions and package management';
|
|
47
|
+
case 'lint-format':
|
|
48
|
+
return 'linting and formatting';
|
|
49
|
+
case 'typecheck':
|
|
50
|
+
return 'type checking';
|
|
51
|
+
case 'testing':
|
|
52
|
+
return 'test runner and test layout';
|
|
53
|
+
case 'ci':
|
|
54
|
+
return 'CI pipelines';
|
|
55
|
+
case 'containerization':
|
|
56
|
+
return 'containerization and image build';
|
|
57
|
+
case 'runtime-config':
|
|
58
|
+
return 'runtime configuration and secrets';
|
|
59
|
+
case 'observability':
|
|
60
|
+
return 'logging, metrics and tracing';
|
|
61
|
+
case 'source-layout':
|
|
62
|
+
return 'source layout and module structure';
|
|
63
|
+
case 'docs':
|
|
64
|
+
return 'documentation';
|
|
65
|
+
case 'other':
|
|
66
|
+
return 'other conventions';
|
|
67
|
+
default:
|
|
68
|
+
return describeRetiredArea(area);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** A stored side this build no longer defines. Same rule, same reason, as {@link describeRetiredArea}. */
|
|
72
|
+
function describeRetiredSource(source) {
|
|
73
|
+
return `'${String(source)}' (a choice this deployment no longer defines; re-run the survey)`;
|
|
74
|
+
}
|
|
75
|
+
/** One side of the decision, as an instruction an agent can act on without further inference. */
|
|
76
|
+
export function describeAdoptionSource(source) {
|
|
77
|
+
switch (source) {
|
|
78
|
+
case 'monorepo':
|
|
79
|
+
return "adopt the monorepo's existing convention and drop the template's";
|
|
80
|
+
case 'template':
|
|
81
|
+
return "keep the reference template's version as-is";
|
|
82
|
+
case 'both':
|
|
83
|
+
return "compose the two: build on the monorepo's shared setup and layer the template's addition on top";
|
|
84
|
+
case 'neither':
|
|
85
|
+
return 'take neither: leave this out of the new service entirely';
|
|
86
|
+
default:
|
|
87
|
+
return describeRetiredSource(source);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Whether a stored string is an area THIS build defines, narrowed from the schema's own options. */
|
|
91
|
+
export function isAdoptionArea(value) {
|
|
92
|
+
return (typeof value === 'string' && adoptionAreaSchema.options.includes(value));
|
|
93
|
+
}
|
|
94
|
+
/** Whether a stored string is a choice THIS build defines, narrowed from the schema's own options. */
|
|
95
|
+
export function isAdoptionSource(value) {
|
|
96
|
+
return (typeof value === 'string' && adoptionSourceSchema.options.includes(value));
|
|
97
|
+
}
|
|
98
|
+
/** Every path the survey managed to read, in the prefixed form a decision's evidence uses. */
|
|
99
|
+
function surveyedPaths(survey) {
|
|
100
|
+
return new Set([
|
|
101
|
+
...survey.monorepoPaths.map((path) => `monorepo:${path}`),
|
|
102
|
+
...survey.templatePaths.map((path) => `template:${path}`),
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
function asString(value, max) {
|
|
106
|
+
return typeof value === 'string' ? value.trim().slice(0, max) : '';
|
|
107
|
+
}
|
|
108
|
+
function asNullableString(value, max) {
|
|
109
|
+
const text = asString(value, max);
|
|
110
|
+
return text.length > 0 ? text : null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Read a model's raw reply into the stored decision list, keeping only what it can support.
|
|
114
|
+
*
|
|
115
|
+
* The model is asked for `{ decisions: [...] }`; anything else is not a plan. Each decision has
|
|
116
|
+
* to survive three checks, and each one is a way the review would otherwise mislead:
|
|
117
|
+
*
|
|
118
|
+
* - a duplicate or missing `id` makes the human's answer unaddressable, so the line is dropped;
|
|
119
|
+
* - an area or recommendation outside the CURRENT vocabulary cannot be rendered or acted on;
|
|
120
|
+
* - evidence that names no path the survey actually read means the claim about the monorepo
|
|
121
|
+
* has nothing behind it. The line is dropped rather than shown unmarked, because a reviewer
|
|
122
|
+
* reads an unmarked line as something the platform checked.
|
|
123
|
+
*
|
|
124
|
+
* Every drop is REPORTED, never silent: a plan that lost half its lines to invention looks
|
|
125
|
+
* exactly like a monorepo with few conventions, and those need opposite reactions.
|
|
126
|
+
*/
|
|
127
|
+
export function parseAdoptionDecisions(raw, survey) {
|
|
128
|
+
const dropped = [];
|
|
129
|
+
let unreported = 0;
|
|
130
|
+
/** Record a drop, or count it once the report is full (contracts' `MAX_ADOPTION_DROP_LINES`). */
|
|
131
|
+
const drop = (line) => {
|
|
132
|
+
if (dropped.length < MAX_ADOPTION_DROP_LINES)
|
|
133
|
+
dropped.push(line);
|
|
134
|
+
else
|
|
135
|
+
unreported += 1;
|
|
136
|
+
};
|
|
137
|
+
const container = raw;
|
|
138
|
+
const list = Array.isArray(container?.decisions) ? container.decisions : null;
|
|
139
|
+
if (!list)
|
|
140
|
+
return { decisions: [], dropped: ['the reply carried no `decisions` array'] };
|
|
141
|
+
const known = surveyedPaths(survey);
|
|
142
|
+
const decisions = [];
|
|
143
|
+
const seen = new Set();
|
|
144
|
+
for (const entry of list) {
|
|
145
|
+
if (decisions.length >= MAX_ADOPTION_DECISIONS) {
|
|
146
|
+
drop(`the reply proposed more than ${MAX_ADOPTION_DECISIONS} decisions; the rest were not read`);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
const item = entry;
|
|
150
|
+
if (!item || typeof item !== 'object')
|
|
151
|
+
continue;
|
|
152
|
+
const id = asString(item.id, 80);
|
|
153
|
+
const title = asString(item.title, 200);
|
|
154
|
+
if (!id || !title) {
|
|
155
|
+
drop(`a proposed decision had no id or title (${id || title || 'unnamed'})`);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (seen.has(id)) {
|
|
159
|
+
drop(`'${id}' was proposed twice; only the first was kept`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (!isAdoptionArea(item.area)) {
|
|
163
|
+
drop(`'${title}' named an area this deployment does not define`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (!isAdoptionSource(item.recommended)) {
|
|
167
|
+
drop(`'${title}' recommended a choice this deployment does not define`);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const evidence = Array.isArray(item.evidence)
|
|
171
|
+
? item.evidence.filter((path) => typeof path === 'string' && known.has(path))
|
|
172
|
+
: [];
|
|
173
|
+
if (evidence.length === 0) {
|
|
174
|
+
drop(`'${title}' cited no file the survey actually read, so it was not carried through`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
seen.add(id);
|
|
178
|
+
decisions.push({
|
|
179
|
+
id,
|
|
180
|
+
area: item.area,
|
|
181
|
+
title,
|
|
182
|
+
monorepoPractice: asNullableString(item.monorepoPractice, 600),
|
|
183
|
+
templatePractice: asNullableString(item.templatePractice, 600),
|
|
184
|
+
recommended: item.recommended,
|
|
185
|
+
rationale: asString(item.rationale, 600),
|
|
186
|
+
evidence,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (unreported > 0) {
|
|
190
|
+
dropped.push(`and ${unreported} further proposals were dropped for the same kinds of reason`);
|
|
191
|
+
}
|
|
192
|
+
return { decisions, dropped };
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Settle a human review against the plan it answers, or throw the refusal naming what is wrong.
|
|
196
|
+
*
|
|
197
|
+
* Refuses rather than repairs, on both sides of the mismatch. An UNANSWERED decision cannot be
|
|
198
|
+
* defaulted to the recommendation without erasing the difference between agreeing with it and
|
|
199
|
+
* never having read it, which is the single fact this whole step exists to record. An answer
|
|
200
|
+
* naming a decision the plan does not have means the reviewer was looking at a different plan
|
|
201
|
+
* (a stale tab, a re-run survey), and applying the rest of it would build under a review that
|
|
202
|
+
* was never given for this proposal.
|
|
203
|
+
*/
|
|
204
|
+
export function resolveAdoptionReview(plan, choices, context) {
|
|
205
|
+
// Deliberately NOT gated on `plan.status === 'ready'`. An `unavailable` plan carries no
|
|
206
|
+
// decisions, so settling it answers nothing, but it is still the human's decision to make, and
|
|
207
|
+
// refusing it strands the run: the review is the ONLY exit from the park, and a retry re-enters
|
|
208
|
+
// the same phase. A deployment with no adoption model would then be unable to bootstrap into a
|
|
209
|
+
// monorepo at all, which is the opposite of the "they just make it unaided" this flow promises.
|
|
210
|
+
// The two checks below are what keep that safe: nothing to answer means nothing may be
|
|
211
|
+
// answered, so a review aimed at a plan that has since been re-surveyed is still refused whole.
|
|
212
|
+
const byId = new Map(choices.map((choice) => [choice.id, choice]));
|
|
213
|
+
const unknown = choices.filter((choice) => !plan.decisions.some((d) => d.id === choice.id));
|
|
214
|
+
if (unknown.length > 0) {
|
|
215
|
+
throw new ValidationError(`The review answers decisions this plan does not contain: ${unknown
|
|
216
|
+
.map((choice) => `'${choice.id}'`)
|
|
217
|
+
.join(', ')}. Reload the plan and review it again.`, { reason: 'adoption_choice_unknown', ids: unknown.map((choice) => choice.id) });
|
|
218
|
+
}
|
|
219
|
+
const missing = plan.decisions.filter((decision) => !byId.has(decision.id));
|
|
220
|
+
if (missing.length > 0) {
|
|
221
|
+
throw new ValidationError(`Every adoption decision must be answered; ${missing.length} ${missing.length === 1 ? 'is' : 'are'} still open: ${missing.map((decision) => `'${decision.title}'`).join(', ')}.`, { reason: 'adoption_review_incomplete', ids: missing.map((decision) => decision.id) });
|
|
222
|
+
}
|
|
223
|
+
const decisions = plan.decisions.map((decision) => {
|
|
224
|
+
// Total by construction: `missing` above already refused any decision with no answer.
|
|
225
|
+
const choice = byId.get(decision.id);
|
|
226
|
+
return {
|
|
227
|
+
id: decision.id,
|
|
228
|
+
area: decision.area,
|
|
229
|
+
title: decision.title,
|
|
230
|
+
choice: choice.choice,
|
|
231
|
+
overrodeRecommendation: choice.choice !== decision.recommended,
|
|
232
|
+
note: choice.note?.trim() ? choice.note.trim() : null,
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
const notes = context.notes?.trim();
|
|
236
|
+
return {
|
|
237
|
+
decisions,
|
|
238
|
+
notes: notes ? notes : null,
|
|
239
|
+
reviewedByUserId: context.reviewedByUserId,
|
|
240
|
+
reviewedAt: context.reviewedAt,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** The prompt sink: verbatim, because the reader is a model and the text is its instruction. */
|
|
244
|
+
const AGENT_SINK = { inline: (value) => value, prose: (value) => value };
|
|
245
|
+
/** The host sink: every auto-link trigger neutralised, every hole capped and fence-balanced. */
|
|
246
|
+
const HOST_SINK = {
|
|
247
|
+
inline: (value) => hostMarkdown.inline(value),
|
|
248
|
+
prose: (value) => hostMarkdown.prose(value),
|
|
249
|
+
};
|
|
250
|
+
/** The shared body of both renderings; only the holes differ (see {@link AdoptionTextSink}). */
|
|
251
|
+
function renderAdoptionDecisions(resolved, sink, lead) {
|
|
252
|
+
const lines = [
|
|
253
|
+
`## Adoption decisions (settled by a human reviewer; follow them exactly)`,
|
|
254
|
+
'',
|
|
255
|
+
lead,
|
|
256
|
+
'',
|
|
257
|
+
];
|
|
258
|
+
if (resolved.decisions.length === 0) {
|
|
259
|
+
lines.push('_The reviewer settled no areas: follow the surrounding monorepo wherever it has an ' +
|
|
260
|
+
'established convention, and the template only where it does not._', '');
|
|
261
|
+
}
|
|
262
|
+
for (const decision of resolved.decisions) {
|
|
263
|
+
const override = decision.overrodeRecommendation ? ' (reviewer overrode the suggestion)' : '';
|
|
264
|
+
lines.push(`- **${sink.inline(decision.title)}** (${describeAdoptionArea(decision.area)}): ` +
|
|
265
|
+
`${describeAdoptionSource(decision.choice)}${override}.` +
|
|
266
|
+
(decision.note ? `\n Reviewer's note: ${sink.inline(decision.note)}` : ''));
|
|
267
|
+
}
|
|
268
|
+
if (resolved.notes) {
|
|
269
|
+
lines.push('', '### Reviewer notes for the service as a whole', '', sink.prose(resolved.notes));
|
|
270
|
+
}
|
|
271
|
+
return lines.join('\n');
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Render the settled review as the adoption section of the apply phase's brief.
|
|
275
|
+
*
|
|
276
|
+
* Every decision is stated as a SIDE plus the reviewer's own words where they left any, and the
|
|
277
|
+
* overrides are called out: an agent told only "use the monorepo's test runner" cannot tell a
|
|
278
|
+
* default it may reason around from a human who deliberately overruled the recommendation, and
|
|
279
|
+
* the second is not negotiable. The list is exhaustive on purpose: an area the reviewer settled
|
|
280
|
+
* and the brief omits is an area the agent decides again, unreviewed.
|
|
281
|
+
*
|
|
282
|
+
* The holes are VERBATIM here. {@link renderAdoptionPrSection} is the rendering for the pull
|
|
283
|
+
* request; do not send this one to a host.
|
|
284
|
+
*/
|
|
285
|
+
export function renderAdoptionBrief(resolved, directory) {
|
|
286
|
+
return renderAdoptionDecisions(resolved, AGENT_SINK, `The new service lives at \`${directory}\`. For each area below, a reviewer has decided ` +
|
|
287
|
+
`whether it follows the surrounding monorepo or the reference template. These are ` +
|
|
288
|
+
`decisions, not suggestions: do not substitute your own judgement for one of them, and ` +
|
|
289
|
+
`if a decision turns out to be impossible as stated, do the closest thing that honours it ` +
|
|
290
|
+
`and say so in the pull request description rather than quietly picking the other side.`);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Render the settled review for the PULL REQUEST the apply phase opens.
|
|
294
|
+
*
|
|
295
|
+
* The same list, addressed to the human reviewing the change rather than to the agent making it:
|
|
296
|
+
* what a reviewer of a bootstrap PR is being asked is whether the service fits the monorepo, and
|
|
297
|
+
* what settles that is which side each area came from and who chose it, which the diff cannot
|
|
298
|
+
* show. Every hole crosses {@link HOST_SINK}, because both the titles (model-authored) and the
|
|
299
|
+
* notes (reviewer-authored) are untrusted text landing on a parsed surface. The caller scrubs
|
|
300
|
+
* secrets at compose time, before any of this is capped.
|
|
301
|
+
*/
|
|
302
|
+
export function renderAdoptionPrSection(resolved, directory) {
|
|
303
|
+
const overrides = resolved.decisions.filter((decision) => decision.overrodeRecommendation).length;
|
|
304
|
+
const stance = resolved.decisions.length === 0
|
|
305
|
+
? 'with no suggestion to review: the platform could not produce one'
|
|
306
|
+
: overrides > 0
|
|
307
|
+
? `${overrides} of which overrode the platform's suggestion`
|
|
308
|
+
: "all of which accepted the platform's suggestion";
|
|
309
|
+
return renderAdoptionDecisions(resolved, HOST_SINK, `This service was bootstrapped into \`${hostMarkdown.inline(directory)}\` under decisions ` +
|
|
310
|
+
`settled by a human before any code was written, ${stance}. Each line below names the ` +
|
|
311
|
+
`area, the side the new service follows for it, and anything the reviewer added.`);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* The default branch name for a monorepo bootstrap's pull request.
|
|
315
|
+
*
|
|
316
|
+
* Derived from the run's own id rather than the service name so two bootstraps of similarly
|
|
317
|
+
* named services can never collide on one branch, and stable per run so a retry of the SAME run
|
|
318
|
+
* resumes its branch instead of opening a second pull request against the monorepo.
|
|
319
|
+
*/
|
|
320
|
+
export function monorepoBootstrapBranch(jobId) {
|
|
321
|
+
return `cat-factory/bootstrap-${jobId}`;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=monorepo-adoption.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo-adoption.logic.js","sourceRoot":"","sources":["../../src/domain/monorepo-adoption.logic.ts"],"names":[],"mappings":"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"}
|