@akagilnc/pi-workflow-roles 0.1.5212 → 0.1.5216

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.
@@ -1,10 +1,9 @@
1
1
  /**
2
- * 起居录(ticket-provenance)typed 形状 —— ADR 0075「2026-09-14 修订」/ #901 / #918。
2
+ * 起居录(ticket-provenance)typed 形状 —— ADR 0075 / ADR 0081 / #1090。
3
3
  *
4
- * 一册=一个追加式 records.jsonl;逻辑册子头与对话由读取时折叠不可变投影提交得到。
5
- * 既有「首行册子头+裸对话行」snapshot 向后可读,后续提交不回写旧行。
6
- * sessions 为 prior ∪ 各轮累计并集(遗漏不删除),已结转正文不因历史源重读而改。
7
- * 交卷 `sessions` 输入语义仍是「本轮对话边界」;累计并集是机械合并,不是角色交什么。
4
+ * 一册=一个追加式 records.jsonl。每轮交卷的 `sessions`=本轮对话边界;
5
+ * 成录接缝按该边界从宿主卷投影并追加,不回读已成录历史去重或折叠。
6
+ * 既有「首行册子头+裸对话行」snapshot 仍可读;后续提交不回写旧行。
8
7
  */
9
8
 
10
9
  /** Sitian kind for per-ticket court diary volumes. */
@@ -30,14 +29,14 @@ export type TicketProvenanceRange = {
30
29
 
31
30
  /**
32
31
  * 一卷:会话卷路径 + 区间声明。
33
- * 交卷时=本轮边界;写入册子头后=累计并集(#918),二者同型。
32
+ * 交卷与每条追加提交的 payload.sessions 同型=该次边界。
34
33
  */
35
34
  export type TicketProvenanceSession = {
36
35
  readonly path: string;
37
36
  readonly ranges: readonly TicketProvenanceRange[];
38
37
  };
39
38
 
40
- /** 读取时折叠出的逻辑册子头。sessions 为累计区间;reopen 与跨宿主并入,不新建册。 */
39
+ /** 旧 snapshot 册子头形状(存量可读;#1090 后新提交不再维护折叠头)。 */
41
40
  export type TicketProvenanceHeader = {
42
41
  readonly repo: string;
43
42
  readonly ticket: number | null;
@@ -48,15 +47,15 @@ export type TicketProvenanceHeader = {
48
47
 
49
48
  /**
50
49
  * 一条对话(存于不可变投影提交;旧 snapshot 中也可为裸行)。
51
- * `id` 按源事实存在则记、不存在不编;`s` 保留卷定位。
50
+ * `id` 按源事实存在则记、不存在不编;`s` 为本轮 sessions 下标。
52
51
  */
53
52
  export type TicketProvenanceLine = {
54
53
  readonly speaker: TicketProvenanceSpeaker;
55
- /** 卷下标(册子头 `sessions` 的位置)。 */
54
+ /** 本轮 sessions 下标。 */
56
55
  readonly s: number;
57
- /** Logical source order for display. */
56
+ /** Logical source order within the source volume at projection time. */
58
57
  readonly sourcePosition?: number;
59
- /** Replay-invariant structural identity used for id-less cumulative coverage. */
58
+ /** Replay-invariant structural identity for id-less source rows. */
60
59
  readonly sourceIdentity?: string;
61
60
  readonly id?: string;
62
61
  readonly text: string;
@@ -75,19 +74,6 @@ function positiveInteger(value: unknown): number | undefined {
75
74
  return undefined;
76
75
  }
77
76
 
78
- function nonNegativeInteger(value: unknown): number | undefined {
79
- if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) return value;
80
- if (typeof value === "string" && /^(0|[1-9][0-9]*)$/.test(value)) {
81
- const parsed = Number(value);
82
- if (Number.isSafeInteger(parsed)) return parsed;
83
- }
84
- return undefined;
85
- }
86
-
87
- function projectSpeaker(value: unknown): TicketProvenanceSpeaker | undefined {
88
- return value === "owner" || value === "runner" ? value : undefined;
89
- }
90
-
91
77
  function projectBound(value: unknown): TicketProvenanceBound | undefined {
92
78
  if (!isRecord(value)) return undefined;
93
79
  const id = typeof value.id === "string" && value.id !== "" ? value.id : undefined;
@@ -149,27 +135,3 @@ export function projectTicketProvenanceHeader(
149
135
  sessions,
150
136
  };
151
137
  }
152
-
153
- /** 读回一条对话行。 */
154
- export function projectTicketProvenanceLine(
155
- value: unknown,
156
- ): TicketProvenanceLine | undefined {
157
- if (!isRecord(value)) return undefined;
158
- const speaker = projectSpeaker(value.speaker);
159
- const s = nonNegativeInteger(value.s);
160
- if (speaker === undefined || s === undefined) return undefined;
161
- if (typeof value.text !== "string") return undefined;
162
- const sourcePosition = nonNegativeInteger(value.sourcePosition);
163
- const sourceIdentity = typeof value.sourceIdentity === "string" && value.sourceIdentity !== ""
164
- ? value.sourceIdentity
165
- : undefined;
166
- const id = typeof value.id === "string" && value.id !== "" ? value.id : undefined;
167
- return {
168
- speaker,
169
- s,
170
- ...(sourcePosition === undefined ? {} : { sourcePosition }),
171
- ...(sourceIdentity === undefined ? {} : { sourceIdentity }),
172
- ...(id === undefined ? {} : { id }),
173
- text: value.text,
174
- };
175
- }