halfcycle 0.4.9 → 0.4.11

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.
@@ -231,6 +231,13 @@ export declare function reviewOpenedLine(phase: string): string;
231
231
  export declare const COULD_NOT_COUNT_LINE = "[halfcycle] Halfcycle could not count what this phase changed, so the owner judges each part on what the agents reported alone.";
232
232
  /** H1 (`typed-close-review`) — how the owner reviews, or that typing is switched off. */
233
233
  export declare function typedReviewHintLine(offered: boolean): string;
234
+ /**
235
+ * After H1 (`system-view-page` AC7): the console's way to review, ending with the
236
+ * phase's System view address on `engagementId`. The second way while typing is
237
+ * offered, the way while it is switched off. `undefined` when there is no address (an
238
+ * id that is not an engagement id), and then no line is printed.
239
+ */
240
+ export declare function systemViewReviewLine(offered: boolean, engagementId: string, phase: string): string | undefined;
234
241
  /** CL3 — tasks of the phase are not finished, named by title, at most ten. */
235
242
  export declare function tasksOpenLine(phase: string, open: readonly string[], more: number): string;
236
243
  /** CL4 — no build of the phase has been reported. */
@@ -253,12 +260,13 @@ export interface CloseStepReport {
253
260
  }
254
261
  /**
255
262
  * Every line the close step prints for one attempt. An open prints CL1, then CL2 when
256
- * the answer says Halfcycle could not count, then H1, and closes nothing; a commit
263
+ * the answer says Halfcycle could not count, then H1, then the System view line on
264
+ * `engagementId` (`systemViewReviewLine`), and closes nothing; a commit
257
265
  * that could not be read is then said on stderr, with the reasons this verb has always
258
266
  * given (git missing and git's bad answer stay two), because the statements carry the
259
267
  * commit to the record. A refusal from the service names each field by its flag, as a
260
268
  * refusal on this machine does (`describeIssuePath`). A refusal prints
261
269
  * its own sentence and exits 1.
262
270
  */
263
- export declare function closeStepReport(phase: string, attempt: ReviewOpenAttempt): CloseStepReport;
271
+ export declare function closeStepReport(phase: string, attempt: ReviewOpenAttempt, engagementId: string): CloseStepReport;
264
272
  //# sourceMappingURL=close-phase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"close-phase.d.ts","sourceRoot":"","sources":["../src/close-phase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"close-phase.d.ts","sourceRoot":"","sources":["../src/close-phase.ts"],"names":[],"mappings":"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"}
@@ -143,7 +143,10 @@ export type PasteTarget = {
143
143
  };
144
144
  /** The architecture's paste target. */
145
145
  export declare const ARCHITECTURE_PASTE: PasteTarget;
146
- /** A phase's paste target: `Phase <name>`, in `docs/phases/`. */
146
+ /** A phase's paste target: `Phase "<name>"`, in `docs/phases/`. Quoted
147
+ * (agreed difference #41, FW-03's form), same reason `closedPhraseFor`
148
+ * above is: an unquoted name is indistinguishable from Halfcycle's own
149
+ * plan-order number on a project that names a phase a plain digit. */
147
150
  export declare function phasePaste(phase: string): PasteTarget;
148
151
  /** The Markdown to paste into the document `target` names, and the line before it. */
149
152
  export declare function pasteLines(mermaid: string, target: PasteTarget): string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/draw/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/draw/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -790,10 +790,10 @@ var buildRecordV2Schema = z5.object({
790
790
 
791
791
  // ../events/dist/crew.js
792
792
  import { z as z6 } from "zod";
793
- var crewGroupSchema = z6.enum(["builder", "reviewer", "always-on"]);
793
+ var crewGroupSchema = z6.enum(["analyst-architect", "builder", "reviewer", "lead"]);
794
794
  var crewTierSchema = z6.enum(["deep", "standard", "fast"]);
795
795
  var CREW_DISCIPLINE_MAX = 64;
796
- var crewFaceHeadSchema = z6.enum(["sq", "sqr", "rnd", "dome", "hex"]);
796
+ var crewFaceHeadSchema = z6.enum(["sq", "sqr", "rnd", "dome", "hex", "gable"]);
797
797
  var crewFaceAntennaSchema = z6.enum(["none", "stalk", "twin", "dish"]);
798
798
  var crewFaceEyesSchema = z6.enum(["dots", "bars", "visor", "cyclops"]);
799
799
  var crewFaceMouthSchema = z6.enum(["line", "grid", "dots", "wave"]);
@@ -810,12 +810,25 @@ var crewFaceSchema = z6.object({
810
810
  // Whether this member is drawn with ears.
811
811
  ears: z6.boolean()
812
812
  }).strict();
813
+ var crewRoleSchema = z6.enum([
814
+ "business-analyst",
815
+ "architect",
816
+ "spec-writer",
817
+ "builder",
818
+ "context-docs",
819
+ "spec-reviewer",
820
+ "code-test-reviewer",
821
+ "delivery-lead",
822
+ "quality-lead"
823
+ ]);
813
824
  var crewMemberSchema = z6.object({
814
- // The agent's name. The same twenty-one on every project, so a name is a
825
+ // The agent's name. The same names on every project, so a name is a
815
826
  // vocabulary a returning client already knows.
816
827
  callsign: z6.string().min(1).max(32),
817
- // Which of the three headings this member reads under.
828
+ // Which of the four teams this member belongs to.
818
829
  group: crewGroupSchema,
830
+ // The part this member plays, which decides the stages it leads and helps with.
831
+ role: crewRoleSchema,
819
832
  // The kind of work this member takes. A task names a discipline, and only
820
833
  // agents holding it can be dispatched to it.
821
834
  discipline: z6.string().min(1).max(CREW_DISCIPLINE_MAX),
@@ -827,10 +840,44 @@ var crewMemberSchema = z6.object({
827
840
  face: crewFaceSchema
828
841
  }).strict();
829
842
  var CREW_ROSTER = [
843
+ // ── analysts and architects ─────────────────────────────────────────────────
844
+ {
845
+ callsign: "SOFIA",
846
+ group: "analyst-architect",
847
+ role: "business-analyst",
848
+ discipline: "business analyst",
849
+ tier: "deep",
850
+ face: { head: "gable", antenna: "stalk", eyes: "dots", mouth: "wave", ears: false }
851
+ },
852
+ {
853
+ callsign: "BEA",
854
+ group: "analyst-architect",
855
+ role: "business-analyst",
856
+ discipline: "business analyst",
857
+ tier: "standard",
858
+ face: { head: "gable", antenna: "none", eyes: "visor", mouth: "line", ears: false }
859
+ },
860
+ {
861
+ callsign: "WREN",
862
+ group: "analyst-architect",
863
+ role: "architect",
864
+ discipline: "solution architect",
865
+ tier: "deep",
866
+ face: { head: "gable", antenna: "dish", eyes: "bars", mouth: "line", ears: true }
867
+ },
868
+ {
869
+ callsign: "PEI",
870
+ group: "analyst-architect",
871
+ role: "architect",
872
+ discipline: "technical architect",
873
+ tier: "standard",
874
+ face: { head: "gable", antenna: "twin", eyes: "cyclops", mouth: "dots", ears: false }
875
+ },
830
876
  // ── builders: code ──────────────────────────────────────────────────────────
831
877
  {
832
878
  callsign: "ADA",
833
879
  group: "builder",
880
+ role: "builder",
834
881
  discipline: "implementation",
835
882
  tier: "deep",
836
883
  face: { head: "sq", antenna: "stalk", eyes: "dots", mouth: "line", ears: false }
@@ -838,6 +885,7 @@ var CREW_ROSTER = [
838
885
  {
839
886
  callsign: "OTTO",
840
887
  group: "builder",
888
+ role: "builder",
841
889
  discipline: "implementation",
842
890
  tier: "deep",
843
891
  face: { head: "sq", antenna: "twin", eyes: "bars", mouth: "grid", ears: true }
@@ -845,6 +893,7 @@ var CREW_ROSTER = [
845
893
  {
846
894
  callsign: "MILO",
847
895
  group: "builder",
896
+ role: "builder",
848
897
  discipline: "implementation",
849
898
  tier: "standard",
850
899
  face: { head: "sqr", antenna: "stalk", eyes: "dots", mouth: "dots", ears: false }
@@ -852,42 +901,24 @@ var CREW_ROSTER = [
852
901
  {
853
902
  callsign: "NOVA",
854
903
  group: "builder",
904
+ role: "builder",
855
905
  discipline: "implementation",
856
906
  tier: "standard",
857
907
  face: { head: "sq", antenna: "dish", eyes: "cyclops", mouth: "line", ears: false }
858
908
  },
859
- {
860
- callsign: "KAI",
861
- group: "builder",
862
- discipline: "implementation",
863
- tier: "standard",
864
- face: { head: "sqr", antenna: "none", eyes: "bars", mouth: "line", ears: true }
865
- },
866
909
  {
867
910
  callsign: "HUGO",
868
911
  group: "builder",
912
+ role: "builder",
869
913
  discipline: "infrastructure",
870
914
  tier: "standard",
871
915
  face: { head: "sq", antenna: "twin", eyes: "dots", mouth: "grid", ears: true }
872
916
  },
873
- {
874
- callsign: "WREN",
875
- group: "builder",
876
- discipline: "refactor",
877
- tier: "fast",
878
- face: { head: "sqr", antenna: "stalk", eyes: "bars", mouth: "wave", ears: false }
879
- },
880
- {
881
- callsign: "PIP",
882
- group: "builder",
883
- discipline: "refactor",
884
- tier: "fast",
885
- face: { head: "sqr", antenna: "none", eyes: "dots", mouth: "dots", ears: false }
886
- },
887
917
  // ── builders: specs and docs ────────────────────────────────────────────────
888
918
  {
889
919
  callsign: "IRIS",
890
920
  group: "builder",
921
+ role: "spec-writer",
891
922
  discipline: "feature spec",
892
923
  tier: "deep",
893
924
  face: { head: "dome", antenna: "stalk", eyes: "visor", mouth: "line", ears: false }
@@ -895,6 +926,7 @@ var CREW_ROSTER = [
895
926
  {
896
927
  callsign: "JUNO",
897
928
  group: "builder",
929
+ role: "spec-writer",
898
930
  discipline: "feature spec",
899
931
  tier: "standard",
900
932
  face: { head: "dome", antenna: "none", eyes: "dots", mouth: "wave", ears: false }
@@ -902,6 +934,7 @@ var CREW_ROSTER = [
902
934
  {
903
935
  callsign: "LEX",
904
936
  group: "builder",
937
+ role: "context-docs",
905
938
  discipline: "context & docs",
906
939
  tier: "fast",
907
940
  face: { head: "dome", antenna: "twin", eyes: "bars", mouth: "dots", ears: false }
@@ -910,6 +943,7 @@ var CREW_ROSTER = [
910
943
  {
911
944
  callsign: "VERA",
912
945
  group: "reviewer",
946
+ role: "spec-reviewer",
913
947
  discipline: "spec consistency",
914
948
  tier: "deep",
915
949
  face: { head: "rnd", antenna: "stalk", eyes: "visor", mouth: "line", ears: false }
@@ -917,6 +951,7 @@ var CREW_ROSTER = [
917
951
  {
918
952
  callsign: "ODIN",
919
953
  group: "reviewer",
954
+ role: "spec-reviewer",
920
955
  discipline: "cross-spec audit",
921
956
  tier: "deep",
922
957
  face: { head: "rnd", antenna: "dish", eyes: "cyclops", mouth: "line", ears: false }
@@ -924,6 +959,7 @@ var CREW_ROSTER = [
924
959
  {
925
960
  callsign: "CASS",
926
961
  group: "reviewer",
962
+ role: "code-test-reviewer",
927
963
  discipline: "code review",
928
964
  tier: "deep",
929
965
  face: { head: "rnd", antenna: "none", eyes: "visor", mouth: "grid", ears: true }
@@ -931,13 +967,23 @@ var CREW_ROSTER = [
931
967
  {
932
968
  callsign: "THEO",
933
969
  group: "reviewer",
970
+ role: "code-test-reviewer",
934
971
  discipline: "code review",
935
972
  tier: "standard",
936
973
  face: { head: "rnd", antenna: "twin", eyes: "bars", mouth: "line", ears: false }
937
974
  },
975
+ {
976
+ callsign: "KAI",
977
+ group: "reviewer",
978
+ role: "code-test-reviewer",
979
+ discipline: "code review",
980
+ tier: "standard",
981
+ face: { head: "rnd", antenna: "none", eyes: "bars", mouth: "line", ears: true }
982
+ },
938
983
  {
939
984
  callsign: "ECHO",
940
985
  group: "reviewer",
986
+ role: "code-test-reviewer",
941
987
  discipline: "test quality",
942
988
  tier: "standard",
943
989
  face: { head: "rnd", antenna: "stalk", eyes: "dots", mouth: "wave", ears: false }
@@ -945,6 +991,7 @@ var CREW_ROSTER = [
945
991
  {
946
992
  callsign: "MAVIS",
947
993
  group: "reviewer",
994
+ role: "code-test-reviewer",
948
995
  discipline: "suites & coverage",
949
996
  tier: "standard",
950
997
  face: { head: "rnd", antenna: "none", eyes: "visor", mouth: "dots", ears: false }
@@ -952,6 +999,7 @@ var CREW_ROSTER = [
952
999
  {
953
1000
  callsign: "ZARA",
954
1001
  group: "reviewer",
1002
+ role: "code-test-reviewer",
955
1003
  discipline: "smoke & walk aid",
956
1004
  tier: "standard",
957
1005
  face: { head: "rnd", antenna: "dish", eyes: "bars", mouth: "wave", ears: false }
@@ -959,39 +1007,31 @@ var CREW_ROSTER = [
959
1007
  {
960
1008
  callsign: "NORA",
961
1009
  group: "reviewer",
1010
+ role: "code-test-reviewer",
962
1011
  discipline: "evidence & provenance",
963
1012
  tier: "fast",
964
1013
  face: { head: "rnd", antenna: "twin", eyes: "dots", mouth: "line", ears: false }
965
1014
  },
966
- // ── always on: continuous, takes no task ────────────────────────────────────
1015
+ // ── leads ───────────────────────────────────────────────────────────────────
967
1016
  {
968
1017
  callsign: "ARGUS",
969
- group: "always-on",
970
- discipline: "guard \xB7 every diff",
1018
+ group: "lead",
1019
+ role: "quality-lead",
1020
+ discipline: "quality lead \xB7 every diff",
971
1021
  tier: "standard",
972
1022
  face: { head: "hex", antenna: "dish", eyes: "visor", mouth: "grid", ears: true }
973
1023
  },
974
1024
  {
975
1025
  callsign: "ATLAS",
976
- group: "always-on",
977
- discipline: "coordinator",
1026
+ group: "lead",
1027
+ role: "delivery-lead",
1028
+ discipline: "delivery lead",
978
1029
  tier: "deep",
979
1030
  face: { head: "hex", antenna: "twin", eyes: "cyclops", mouth: "line", ears: true }
980
1031
  }
981
1032
  ];
982
1033
  var CREW_ROSTER_SIZE = CREW_ROSTER.length;
983
1034
  var CREW_CALLSIGNS = CREW_ROSTER.map((member) => member.callsign);
984
- var crewRoleSchema = z6.enum([
985
- "business-analyst",
986
- "architect",
987
- "spec-writer",
988
- "builder",
989
- "context-docs",
990
- "spec-reviewer",
991
- "code-test-reviewer",
992
- "delivery-lead",
993
- "quality-lead"
994
- ]);
995
1035
  var crewLayerSchema = methodLayerSchema.extract(["l0", "l1", "l2", "l3", "l4", "l5"]);
996
1036
  var crewRoleLayersSchema = z6.object({
997
1037
  leads: z6.array(crewLayerSchema),
@@ -1349,14 +1389,13 @@ var SCOPE_STATE_NAMES = [
1349
1389
  "waiting",
1350
1390
  "sent-back",
1351
1391
  "approved",
1352
- "partly-stale",
1353
- "withdrawn"
1392
+ "partly-stale"
1354
1393
  ];
1355
1394
  var scopeStateNameSchema = z9.enum(SCOPE_STATE_NAMES);
1356
1395
  var plannedScopeStateSchema = scopeStateNameSchema.exclude(["not-planned"]);
1357
1396
  var SCOPE_PART_STATUSES = ["approved", "waiting"];
1358
1397
  var scopePartStatusSchema = z9.enum(SCOPE_PART_STATUSES);
1359
- var SCOPE_ACTS = ["approve", "send-back", "withdraw"];
1398
+ var SCOPE_ACTS = ["approve", "send-back"];
1360
1399
  var scopeActSchema = z9.enum(SCOPE_ACTS);
1361
1400
  var SCOPE_GIVEN_IN = ["console", "chat"];
1362
1401
  var scopeGivenInSchema = z9.enum(SCOPE_GIVEN_IN);
@@ -1427,14 +1466,9 @@ var scopeSendBackRequestSchema = z9.object({
1427
1466
  parts: z9.array(scopeDecisionPartSchema).max(PHASE_PLAN_CHANGES_MAX),
1428
1467
  note: scopeNoteWireSchema.optional()
1429
1468
  }).strict();
1430
- var scopeWithdrawRequestSchema = z9.object({
1431
- act: z9.literal("withdraw"),
1432
- planVersion: planVersionSchema
1433
- }).strict();
1434
1469
  var scopeDecisionRequestSchema = z9.discriminatedUnion("act", [
1435
1470
  scopeApproveRequestSchema,
1436
- scopeSendBackRequestSchema,
1437
- scopeWithdrawRequestSchema
1471
+ scopeSendBackRequestSchema
1438
1472
  ]);
1439
1473
  var scopeDecisionRecordedSchema = z9.object({
1440
1474
  outcome: z9.literal("recorded"),
@@ -1467,7 +1501,6 @@ var scopeDecisionResultSchema = z9.discriminatedUnion("outcome", [
1467
1501
  reasonOutcome("not-owner"),
1468
1502
  reasonOutcome("no-owner"),
1469
1503
  reasonOutcome("plan-changed"),
1470
- reasonOutcome("nothing-to-withdraw"),
1471
1504
  reasonOutcome("build-started")
1472
1505
  ]);
1473
1506
  var scopeReadPartSchema = z9.object({
@@ -2049,11 +2082,16 @@ var phaseReviewViewSchema = z13.discriminatedUnion("state", [
2049
2082
 
2050
2083
  // ../events/dist/build-record-v3.js
2051
2084
  var BUILD_RECORD_V3_FORMAT = "halfcycle-build-record/v3";
2085
+ var recordRoundStatedSchema = z14.object({
2086
+ actor: attestedCloseSchema.shape.actor,
2087
+ statements: attestedStatementsSchema
2088
+ }).strict();
2052
2089
  var recordReviewRoundSchema = z14.object({
2053
2090
  round: z14.number().int().min(1),
2054
2091
  openedAt: utcIso8601,
2055
2092
  verdict: walkVerdictSchema,
2056
- findings: z14.number().int().min(0)
2093
+ findings: z14.number().int().min(0),
2094
+ stated: recordRoundStatedSchema.optional()
2057
2095
  }).strict();
2058
2096
  var recordReviewApprovalSchema = z14.discriminatedUnion("kind", [
2059
2097
  z14.object({
@@ -2115,6 +2153,9 @@ var recordReviewSchema = z14.object({
2115
2153
  if (r.round !== i + 1) {
2116
2154
  ctx.addIssue({ code: "custom", path: ["rounds", i, "round"], message: "rounds must be numbered 1, 2, 3 \u2026 in order with no gap" });
2117
2155
  }
2156
+ if (i === v.rounds.length - 1 && r.stated !== void 0) {
2157
+ ctx.addIssue({ code: "custom", path: ["rounds", i, "stated"], message: "the last round's words are the close's own, so the round does not repeat them" });
2158
+ }
2118
2159
  });
2119
2160
  const seen = /* @__PURE__ */ new Set();
2120
2161
  v.parts.forEach((p, i) => {
@@ -5193,12 +5234,13 @@ function machines(coverage, checks) {
5193
5234
  const line = `${label}${String(coverage.enrolled)}. Of these, ${String(coverage.conformant)} had reported Halfcycle's checks as fully set up.`;
5194
5235
  return checks === "not-observed" && coverage.conformant > 0 ? `${line} Set up is not the same as running: Halfcycle has no record of any check running during this phase.` : line;
5195
5236
  }
5196
- function walkLines(walk, p) {
5237
+ function walkLines(walk, p, closingRound = false) {
5197
5238
  const label = "> - Acceptance walk (the finished work tried as a user would, by someone other than its builder): ";
5198
5239
  if (walk === null)
5199
5240
  return [`${label}the person closing the phase reported none.`];
5241
+ const it = closingRound ? "the round that closed the phase" : "it";
5200
5242
  const lines = [
5201
- `${label}${walk.verdict === "clean" ? "the person closing the phase said it found no problems." : "the person closing the phase said it found problems."}`
5243
+ `${label}${walk.verdict === "clean" ? `the person closing the phase said ${it} found no problems.` : `the person closing the phase said ${it} found problems.`}`
5202
5244
  ];
5203
5245
  walk.findings.forEach((finding, i) => {
5204
5246
  lines.push(`> - Finding ${String(i + 1)}: ${p.text(finding)}`);
@@ -5217,12 +5259,12 @@ function decisionLine(attested) {
5217
5259
  }
5218
5260
  return attested.walk !== null && attested.walk.verdict === "defects" ? "> - Decision: close the phase as it stood, with the problems its acceptance walk found." : "> - Decision: the phase's agreed finish conditions were met.";
5219
5261
  }
5220
- function renderStated(attested, p) {
5262
+ function renderStated(attested, p, closingRound = false) {
5221
5263
  const lines = [
5222
5264
  decisionLine(attested),
5223
5265
  `> - Name given: ${attested.actor === null ? "removed with the account that made this close" : p.text(attested.actor)}`,
5224
5266
  `> - Reason given: ${attested.reason === null ? "none." : p.text(attested.reason)}`,
5225
- ...walkLines(attested.walk, p),
5267
+ ...walkLines(attested.walk, p, closingRound),
5226
5268
  `> - Code closed at (commit): ${statedOrNot(attested.closeCommit, p)}`,
5227
5269
  `> - What the phase set out to prove: ${statedOrNot(attested.statements.thesis, p)}`,
5228
5270
  `> - What came out of it: ${statedOrNot(attested.statements.outcome, p)}`
@@ -5238,7 +5280,7 @@ function renderStated(attested, p) {
5238
5280
  }
5239
5281
  return lines.join("\n");
5240
5282
  }
5241
- function renderClose(heading, observed, attested, checks, p) {
5283
+ function renderClose(heading, observed, attested, checks, p, closingRound = false) {
5242
5284
  return [
5243
5285
  heading,
5244
5286
  headline(observed, attested, checks),
@@ -5250,7 +5292,7 @@ function renderClose(heading, observed, attested, checks, p) {
5250
5292
  machines(observed.seatCoverage, checks)
5251
5293
  ].join("\n"),
5252
5294
  STATED_LABEL,
5253
- renderStated(attested, p)
5295
+ renderStated(attested, p, closingRound)
5254
5296
  ];
5255
5297
  }
5256
5298
  var REVIEW_LABEL = "**Recorded by Halfcycle from the owner's review.** Each part the review held, and how the project's owner decided it. A line marked as the agent's is the agent's own answer, not Halfcycle's.";
@@ -5266,7 +5308,7 @@ function decisionText(part, p) {
5266
5308
  case "accepted":
5267
5309
  return "Accepted";
5268
5310
  case "carried":
5269
- return part.carriedTo === null || part.carriedTo === void 0 ? `Carried to the next phase planned: ${p.text(part.reason ?? "")}` : `Carried to phase ${String(part.carriedTo.number)}: ${p.text(part.reason ?? "")}`;
5311
+ return part.carriedTo === null || part.carriedTo === void 0 ? `Carried to the next phase planned: ${p.text(part.reason ?? "")}` : `Carried to phase "${part.carriedTo.phase}": ${p.text(part.reason ?? "")}`;
5270
5312
  case "dropped":
5271
5313
  return `Dropped: ${p.text(part.reason ?? "")}`;
5272
5314
  }
@@ -5299,6 +5341,37 @@ function renderReview(record2, p) {
5299
5341
  blocks.push(removals);
5300
5342
  return blocks;
5301
5343
  }
5344
+ var EARLIER_ROUNDS_LABEL = `${STATED_LABEL} What was said each time the owner's review was asked for, before the round that closed the phase. What was said for that last round is under the close above. If the account that asked for a round is later deleted, the name given for that round is removed.`;
5345
+ function renderRoundStated(round, stated, p) {
5346
+ const label = "> - Acceptance walk (the finished work tried as a user would, by someone other than its builder): ";
5347
+ const walk = round.verdict === "clean" ? "the person asking for this round said it found no problems." : round.findings === 0 ? "the person asking for this round said it found problems." : `the person asking for this round said it found ${counted(round.findings, "problem", "problems")}.`;
5348
+ const lines = [
5349
+ `> - Name given: ${stated.actor === null ? "removed with the account that asked for this round" : p.text(stated.actor)}`,
5350
+ `${label}${walk}`,
5351
+ `> - What the phase set out to prove: ${statedOrNot(stated.statements.thesis, p)}`,
5352
+ `> - What came out of it: ${statedOrNot(stated.statements.outcome, p)}`
5353
+ ];
5354
+ const deviations = stated.statements.deviations;
5355
+ if (deviations.length === 0) {
5356
+ lines.push("> - Changes from the plan: None stated by the client.");
5357
+ } else {
5358
+ lines.push("> - Changes from the plan:");
5359
+ deviations.forEach((deviation, i) => {
5360
+ lines.push(`> - Change ${String(i + 1)}: ${p.text(deviation)}`);
5361
+ });
5362
+ }
5363
+ return lines.join("\n");
5364
+ }
5365
+ function renderEarlierRounds(record2, p) {
5366
+ const rounds = record2.review.rounds;
5367
+ const blocks = [];
5368
+ for (const round of rounds) {
5369
+ if (round.stated === void 0)
5370
+ continue;
5371
+ blocks.push(`### Round ${String(round.round)} of ${String(rounds.length)}`, renderRoundStated(round, round.stated, p));
5372
+ }
5373
+ return blocks.length === 0 ? [] : ["## Earlier rounds of the review", EARLIER_ROUNDS_LABEL, ...blocks];
5374
+ }
5302
5375
  function renderBuildRecordV2Markdown(record2) {
5303
5376
  const p = makePrinter();
5304
5377
  const attestedBySequence = /* @__PURE__ */ new Map();
@@ -5312,6 +5385,8 @@ function renderBuildRecordV2Markdown(record2) {
5312
5385
  const closes = [...record2.observed.closes].sort((a, b) => a.sequence - b.sequence);
5313
5386
  const total = closes.length;
5314
5387
  const latest = closes[total - 1];
5388
+ const rounds = record2.format === "halfcycle-build-record/v3" ? record2.review.rounds : [];
5389
+ const roundsAfter = rounds.length <= 1 ? null : `after ${String(rounds.length)} rounds of the owner's review.${rounds.some((r) => r.stated !== void 0) ? ' What was said for each earlier round is under "Earlier rounds of the review".' : ""}`;
5315
5390
  const body = [
5316
5391
  `Phase: ${phase} (the name the client gave it)`,
5317
5392
  OBSERVED_LABEL,
@@ -5320,12 +5395,12 @@ function renderBuildRecordV2Markdown(record2) {
5320
5395
  `- Project identifier: ${p.text(record2.observed.engagementId)}. Halfcycle keeps this project's records under this identifier.`,
5321
5396
  `- Record format: ${p.text(record2.format)}. This names the layout this file and the .json file beside it follow, for software that reads them.`
5322
5397
  ].join("\n"),
5323
- total === 1 ? "This phase was closed once." : `This phase was closed ${String(total)} times. The latest close is described first; each earlier close follows, as it was recorded when it was made.`,
5398
+ total === 1 ? roundsAfter === null ? "This phase was closed once." : `This phase was closed once, ${roundsAfter}` : `This phase was closed ${String(total)} times. The latest close is described first; each earlier close follows, as it was recorded when it was made.${roundsAfter === null ? "" : ` The latest close came ${roundsAfter}`}`,
5324
5399
  ...renderChecks(record2.observed.checks, p),
5325
- ...renderClose(total === 1 ? "## The close" : `## The latest close (close ${String(latest.sequence)} of ${String(total)})`, latest, attestedBySequence.get(latest.sequence), record2.observed.checks.state, p)
5400
+ ...renderClose(total === 1 ? "## The close" : `## The latest close (close ${String(latest.sequence)} of ${String(total)})`, latest, attestedBySequence.get(latest.sequence), record2.observed.checks.state, p, rounds.length > 1)
5326
5401
  ];
5327
5402
  if (record2.format === "halfcycle-build-record/v3")
5328
- body.push(...renderReview(record2, p));
5403
+ body.push(...renderReview(record2, p), ...renderEarlierRounds(record2, p));
5329
5404
  if (total > 1) {
5330
5405
  body.push("## Earlier closes");
5331
5406
  for (const close of closes.slice(0, -1)) {