pi-outpost 0.32.4 → 0.34.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 (188) hide show
  1. package/dist/contract/README.md +120 -1
  2. package/dist/contract/conformance/README.md +29 -5
  3. package/dist/contract/conformance/index.json +115 -0
  4. package/dist/contract/conformance/invalid/unknown-version.json +1 -1
  5. package/dist/contract/conformance/invalid/v3-timeline-comparison-without-reference.json +123 -0
  6. package/dist/contract/conformance/invalid/v3-timeline-contradictory-change.json +128 -0
  7. package/dist/contract/conformance/invalid/v3-timeline-dependency-cycle.json +124 -0
  8. package/dist/contract/conformance/invalid/v3-timeline-dependency-on-removed.json +125 -0
  9. package/dist/contract/conformance/invalid/v3-timeline-duplicate-dependency.json +125 -0
  10. package/dist/contract/conformance/invalid/v3-timeline-duplicate-identifier.json +120 -0
  11. package/dist/contract/conformance/invalid/v3-timeline-empty-task-endpoint.json +124 -0
  12. package/dist/contract/conformance/invalid/v3-timeline-impossible-date.json +101 -0
  13. package/dist/contract/conformance/invalid/v3-timeline-inverted-activity.json +120 -0
  14. package/dist/contract/conformance/invalid/v3-timeline-inverted-range.json +120 -0
  15. package/dist/contract/conformance/invalid/v3-timeline-milestone-outside-range.json +120 -0
  16. package/dist/contract/conformance/invalid/v3-timeline-period-outside-range.json +139 -0
  17. package/dist/contract/conformance/invalid/v3-timeline-presentation-property.json +121 -0
  18. package/dist/contract/conformance/invalid/v3-timeline-previous-outside-range.json +128 -0
  19. package/dist/contract/conformance/invalid/v3-timeline-previous-wrong-shape.json +128 -0
  20. package/dist/contract/conformance/invalid/v3-timeline-reference-outside-range.json +140 -0
  21. package/dist/contract/conformance/invalid/v3-timeline-self-dependency.json +124 -0
  22. package/dist/contract/conformance/invalid/v3-timeline-under-version-2.json +120 -0
  23. package/dist/contract/conformance/invalid/v3-timeline-unknown-dependency-type.json +121 -0
  24. package/dist/contract/conformance/invalid/v3-timeline-unresolved-dependency-endpoint.json +120 -0
  25. package/dist/contract/conformance/invalid/v3-timeline-unsupported-scale.json +120 -0
  26. package/dist/contract/conformance/invalid/v3-timeline-with-target.json +123 -0
  27. package/dist/contract/conformance/valid/v3-timeline-calendar.json +140 -0
  28. package/dist/contract/conformance/valid/v3-timeline-compared.json +142 -0
  29. package/dist/contract/conformance/valid/v3-timeline-empty-task-and-anonymous-separator.json +35 -0
  30. package/dist/contract/conformance/valid/v3-timeline-four-dependency-types.json +61 -0
  31. package/dist/contract/conformance/valid/v3-timeline-programme.json +44 -0
  32. package/dist/contract/conformance/valid/v3-timeline-quarter-scale.json +42 -0
  33. package/dist/contract/conformance/valid/v3-timeline-single-day-activity.json +27 -0
  34. package/dist/contract/conformance/valid/v3-timeline-unsatisfied-dependency.json +45 -0
  35. package/dist/contract/conformance/valid/v3-timeline-week-scale.json +35 -0
  36. package/dist/contract/conformance/version-1.lock.json +2 -2
  37. package/dist/contract/schemas/structured-exchange-3.json +1263 -0
  38. package/dist/contract/schemas/structured-exchange-profile-registry-2.json +94 -0
  39. package/dist/contract/structured-exchange-project-setup.md +36 -0
  40. package/dist/contract/validate-structured-exchange.mjs +1981 -174
  41. package/dist/pi-outpost-tools.mjs +4556 -1130
  42. package/dist/pi-outpost.mjs +5733 -1898
  43. package/dist/pi-outpost.sea.mjs +2 -2
  44. package/dist/sea-prep.blob +2 -2
  45. package/dist/skills/structured-exchange/SKILL.md +90 -378
  46. package/dist/skills/structured-exchange/references/enriched-contract.md +158 -0
  47. package/dist/skills/structured-exchange/references/figures.md +52 -0
  48. package/dist/skills/structured-exchange/references/graphs-and-tables.md +115 -0
  49. package/dist/skills/structured-exchange/references/proposals.md +86 -0
  50. package/dist/skills/structured-exchange/references/timelines.md +87 -0
  51. package/dist/skills/structured-exchange/structured-exchange-3.json +1263 -0
  52. package/dist/skills/structured-exchange/structured-exchange-profile-registry-2.json +94 -0
  53. package/dist/skills/structured-exchange-project/SKILL.md +22 -0
  54. package/dist/web/assets/{PdfViewer-DHIy06i5.js → PdfViewer-9kadnb9W.js} +2 -2
  55. package/dist/web/assets/{abnfDiagram-VCTEODGH-0IqI620v.js → abnfDiagram-YUKMZFIV-BUZ7jF1I.js} +1 -1
  56. package/dist/web/assets/architecture-WOLXFQ4H-CxBmyj2Z.js +1 -0
  57. package/dist/web/assets/architectureDiagram-47P4ROYG-BAvert-J.js +36 -0
  58. package/dist/web/assets/{blockDiagram-OSKFZWR5-sw0nzjYC.js → blockDiagram-E7TT5TSB-CXQT_J2x.js} +16 -5
  59. package/dist/web/assets/c4Diagram-CRA5TL53-Byqo5aDs.js +38 -0
  60. package/dist/web/assets/channel-D3nE3SyW.js +1 -0
  61. package/dist/web/assets/chunk-2BW5OAIV-D9dSVCv2.js +10 -0
  62. package/dist/web/assets/chunk-3YJQHVM4-D6IQcIQB.js +2 -0
  63. package/dist/web/assets/chunk-4EA7E6EY-BxZ_5HMn.js +1 -0
  64. package/dist/web/assets/{chunk-F27PBJKO-C6rqX2gT.js → chunk-7TKQ45FW-G9TsFldk.js} +1 -1
  65. package/dist/web/assets/{chunk-SVP7TREG-CYXVRfc0.js → chunk-AW2ZBBNX-nmg5rsd5.js} +3 -3
  66. package/dist/web/assets/{chunk-GVQU2GXP-BtSmWzHA.js → chunk-DBDB3WZW-BwVIGLtu.js} +1 -1
  67. package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  68. package/dist/web/assets/chunk-E2ZNV5FY-VD95O25Z.js +72 -0
  69. package/dist/web/assets/chunk-EU5HNXII-CSnybkPb.js +213 -0
  70. package/dist/web/assets/chunk-FVRAUYC3-TBqluQ8N.js +2 -0
  71. package/dist/web/assets/{chunk-PWAF6VOD-Dup_NAkl.js → chunk-HJ2JQQFS-BiLMpVsO.js} +1 -1
  72. package/dist/web/assets/chunk-HTAEGDNF-QDOAuhR5.js +1 -0
  73. package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  74. package/dist/web/assets/{chunk-POPQ4Y6H-BrnPOTT-.js → chunk-KQW6MTUR-_WxFaX97.js} +1 -1
  75. package/dist/web/assets/chunk-NGNAAXSQ-BW1P8EP7.js +136 -0
  76. package/dist/web/assets/chunk-NTY3LDVX-BI0Pj8F6.js +1 -0
  77. package/dist/web/assets/chunk-VPRB5NB3-BBDlNNll.js +129 -0
  78. package/dist/web/assets/chunk-XC4XBNZT-Ba1ra4Jd.js +62 -0
  79. package/dist/web/assets/classDiagram-v2-K4WV4PDN-CksBjG_q.js +217 -0
  80. package/dist/web/assets/{conversationExport-CfUybHMU.js → conversationExport-q-9NUHuj.js} +1 -1
  81. package/dist/web/assets/cynefin-EF2NZ3EQ-ucJDz_S5.js +1 -0
  82. package/dist/web/assets/{cynefinDiagram-5FMLGOSQ-BKvXEDID.js → cynefinDiagram-3GCD6N5R-qPxcNdaa.js} +1 -1
  83. package/dist/web/assets/dagre-W4DXFKR2-ChflYJGj.js +4 -0
  84. package/dist/web/assets/diagram-2UJZ2QOL-Bi9ngdu2.js +200 -0
  85. package/dist/web/assets/{diagram-VX7I27RA-D5POkb-9.js → diagram-OVF4WLC6-iSSbF5Cd.js} +10 -10
  86. package/dist/web/assets/{diagram-S7CK7UJ4-DTvEAe9r.js → diagram-PFPMY2P6-BeEOD8rR.js} +2 -2
  87. package/dist/web/assets/{diagram-Z3DM3KII-CC2Mxm4H.js → diagram-UMYRVEAY-BckO6iZI.js} +1 -1
  88. package/dist/web/assets/{diagram-UQ7AKVKN-CVGEkml-.js → diagram-YEKJPTXX-BzzDIAmO.js} +2 -2
  89. package/dist/web/assets/diagram-ZIFT7M5P-ByjWOPbN.js +3 -0
  90. package/dist/web/assets/{docxExport-ErgwApAZ.js → docxExport-BO7j3Xnv.js} +1 -1
  91. package/dist/web/assets/{ebnfDiagram-PWID7BFC-CbDy2vxX.js → ebnfDiagram-VR2GEFS7-DRp-A5JC.js} +1 -1
  92. package/dist/web/assets/elk-IJKZMXRS-QzeiQ3l1.js +27 -0
  93. package/dist/web/assets/{erDiagram-2YWLMYGG-DUdStx-7.js → erDiagram-O2IAPWRE-BewZvI56.js} +15 -15
  94. package/dist/web/assets/eventmodeling-K75KTNOO-CX7X0bsf.js +1 -0
  95. package/dist/web/assets/flowDiagram-OXPTDLAJ-CSIHFoeR.js +1 -0
  96. package/dist/web/assets/ganttDiagram-R7TSEDQI-BT8Lcdwc.js +292 -0
  97. package/dist/web/assets/gitGraph-VSP46ZUC-BxYbaxeg.js +1 -0
  98. package/dist/web/assets/gitGraphDiagram-XJZIOB7I-B0fqVCqP.js +106 -0
  99. package/dist/web/assets/index-DcqvxkHN.css +2 -0
  100. package/dist/web/assets/index-eTp_lQUc.js +350 -0
  101. package/dist/web/assets/info-OHQRW6UA-DV3PDKXA.js +1 -0
  102. package/dist/web/assets/infoDiagram-5W2HQ5XZ-DfHpZ9RG.js +2 -0
  103. package/dist/web/assets/{ishikawaDiagram-5VMMS53U-D-gYpOUM.js → ishikawaDiagram-K3B6WC7H-DuwLwL9k.js} +2 -2
  104. package/dist/web/assets/{journeyDiagram-EYS64GPL-B0WqOtZ4.js → journeyDiagram-COXZFDF6-CMOfweZO.js} +4 -4
  105. package/dist/web/assets/{kanban-definition-UXKFOSKX-DIrVFtP3.js → kanban-definition-P3RFRI5V-DjHhlDbk.js} +9 -9
  106. package/dist/web/assets/{line-CuEhAU65.js → line-CGIAMPkR.js} +1 -1
  107. package/dist/web/assets/loadReferencedImage-DZ5eApE4.js +2 -0
  108. package/dist/web/assets/{mermaid-parser.core-CzCh9EE1.js → mermaid-parser.core-C18KmsD9.js} +6 -6
  109. package/dist/web/assets/mermaid.core-C9srNL3b.js +44 -0
  110. package/dist/web/assets/{mindmap-definition-THT77NOG-CBH0Z9AJ.js → mindmap-definition-LZFPQGKD-C38HXkG2.js} +24 -24
  111. package/dist/web/assets/packet-JDAUHWVQ-Br-8ADK6.js +1 -0
  112. package/dist/web/assets/{pdf-6mG9havR.js → pdf-C3f6Vjz7.js} +1 -1
  113. package/dist/web/assets/{pegDiagram-XKGWAZYB-BNpTWHo8.js → pegDiagram-BGZESJAR-Be49dM_b.js} +1 -1
  114. package/dist/web/assets/pie-XZMESJXO-68ykK6i1.js +1 -0
  115. package/dist/web/assets/{pieDiagram-E7YTZNPT-CZ34Q1W-.js → pieDiagram-CAPJLFHJ-DVOWjXQ_.js} +2 -2
  116. package/dist/web/assets/{quadrantDiagram-AXDQQJYC-C5aFQsIe.js → quadrantDiagram-GDMTTRAM-8la_R53U.js} +3 -3
  117. package/dist/web/assets/radar-ABXABTNO-K00ZGu13.js +1 -0
  118. package/dist/web/assets/railroad-I3PHUGI6-W7QuDysT.js +1 -0
  119. package/dist/web/assets/railroad-abnf-LNEFI6M7-DR6CNkaK.js +1 -0
  120. package/dist/web/assets/railroad-ebnf-DWYD2UWJ-dAhaGv5L.js +1 -0
  121. package/dist/web/assets/railroad-peg-JR7BVNR7-DwoiiDdE.js +1 -0
  122. package/dist/web/assets/{railroadDiagram-O6MQD6OU-B0ctRtRT.js → railroadDiagram-SM67HX2B-BuSjCs02.js} +1 -1
  123. package/dist/web/assets/{requirementDiagram-IS5BZ75X-BuOtNPGm.js → requirementDiagram-X7JNWC4A-3uq8m_5E.js} +11 -11
  124. package/dist/web/assets/{sankeyDiagram-P5KCCOFB-CybICPpQ.js → sankeyDiagram-UM26HJRW-BB9_G8bN.js} +3 -3
  125. package/dist/web/assets/sequenceDiagram-ZO4K6R2Y-CGehVq9k.js +169 -0
  126. package/dist/web/assets/stateDiagram-v2-TBUQTH76-CwMywh5s.js +291 -0
  127. package/dist/web/assets/swimlanes-N4OXWK64-CqjihurI.js +1 -0
  128. package/dist/web/assets/swimlanesDiagram-K3J5GTZL-Blk5ohUI.js +8 -0
  129. package/dist/web/assets/timeline-definition-YOQAKGHF-BtKnuY5Y.js +120 -0
  130. package/dist/web/assets/treeView-D4JQ5SDB-Dy4jC4wa.js +1 -0
  131. package/dist/web/assets/treemap-SAJKECNS-CHtGJD8P.js +1 -0
  132. package/dist/web/assets/usecaseDiagram-VIAY4XPW-BjnstWbR.js +328 -0
  133. package/dist/web/assets/vennDiagram-BLWOH2XV-o_EtJWVA.js +34 -0
  134. package/dist/web/assets/wardley-7MLQ67FV-BTheL3FW.js +1 -0
  135. package/dist/web/assets/{wardleyDiagram-VM6X3IG4-CzB2tR_t.js → wardleyDiagram-YMQ3BMBF-Bp_sv2v4.js} +3 -3
  136. package/dist/web/assets/xychartDiagram-TAQBALBS-C0IpEfij.js +7 -0
  137. package/dist/web/index.html +2 -2
  138. package/package.json +3 -3
  139. package/dist/web/assets/architecture-7GRP2DOG-BqTZwqCY.js +0 -1
  140. package/dist/web/assets/architectureDiagram-5GKGNRK7-BEGSAGSn.js +0 -36
  141. package/dist/web/assets/c4Diagram-7LVT6UL2-C6wQYxBC.js +0 -38
  142. package/dist/web/assets/channel-CbMG5PZq.js +0 -1
  143. package/dist/web/assets/chunk-3NF5O7KM-Dni31-nE.js +0 -168
  144. package/dist/web/assets/chunk-4HAMMTFA-hiqoLVtf.js +0 -62
  145. package/dist/web/assets/chunk-75Z2AOVW-1k7HRGrm.js +0 -2
  146. package/dist/web/assets/chunk-DU6HZSFF-Dy05V--k.js +0 -127
  147. package/dist/web/assets/chunk-FOHPRMQF-DHwB1DNv.js +0 -161
  148. package/dist/web/assets/chunk-GMAD6QVW-Bi5Ne8OE.js +0 -72
  149. package/dist/web/assets/chunk-HLEWEB6X-yamDqy1M.js +0 -206
  150. package/dist/web/assets/chunk-L3NEJ4N5-CQSamtuJ.js +0 -1
  151. package/dist/web/assets/chunk-OSK3NFVY-S95igUko.js +0 -10
  152. package/dist/web/assets/chunk-P2QGCYS3-BPor-azX.js +0 -1
  153. package/dist/web/assets/chunk-ZLD2IHE6-D0uZMMWb.js +0 -231
  154. package/dist/web/assets/classDiagram-CYGNFDIV-2Yl201cv.js +0 -1
  155. package/dist/web/assets/classDiagram-v2-TLXNO2FR-2Yl201cv.js +0 -1
  156. package/dist/web/assets/cynefin-OW5HDTMX-ua6bZIWp.js +0 -1
  157. package/dist/web/assets/dagre-OS7QT2EB-BRxaZdm2.js +0 -4
  158. package/dist/web/assets/dagre-PrKaheQc.js +0 -1
  159. package/dist/web/assets/diagram-VSXAHHWV-Dkh-RvzE.js +0 -3
  160. package/dist/web/assets/eventmodeling-NTZA5JFV-Bw8wULv_.js +0 -1
  161. package/dist/web/assets/flowDiagram-T62WH6J4-Dp4v9IDN.js +0 -1
  162. package/dist/web/assets/ganttDiagram-EL5Y4UJY-6dI1H52q.js +0 -292
  163. package/dist/web/assets/gitGraph-4MIJSDKK-UXnB0IFr.js +0 -1
  164. package/dist/web/assets/gitGraphDiagram-WWUBYQGX-B_wXPpx0.js +0 -106
  165. package/dist/web/assets/index-9y9n2Dul.css +0 -2
  166. package/dist/web/assets/index-COu8CnNa.js +0 -350
  167. package/dist/web/assets/info-A6RAGUB7-C2WWyNzF.js +0 -1
  168. package/dist/web/assets/infoDiagram-FKFFQAWI-DY65_ndC.js +0 -2
  169. package/dist/web/assets/loadReferencedImage-DgHMXQNZ.js +0 -2
  170. package/dist/web/assets/mermaid.core-BmGW_v8T.js +0 -44
  171. package/dist/web/assets/packet-AYTQ26CC-BYG_KViO.js +0 -1
  172. package/dist/web/assets/pie-WAS4IAKB-wBoUHr8R.js +0 -1
  173. package/dist/web/assets/radar-RG4KPBEZ-D4K5XP7X.js +0 -1
  174. package/dist/web/assets/railroad-74A4TZTK-Haum25Us.js +0 -1
  175. package/dist/web/assets/railroad-abnf-HS5TGJTU-D-kbOsoZ.js +0 -1
  176. package/dist/web/assets/railroad-ebnf-LZEXJU2U-CWtixpZf.js +0 -1
  177. package/dist/web/assets/railroad-peg-WCYAUIDC-BeY7arxf.js +0 -1
  178. package/dist/web/assets/sequenceDiagram-WJ2MYXX4-Dvo8sl8e.js +0 -162
  179. package/dist/web/assets/stateDiagram-XQSTLZYL-BcM-hGJa.js +0 -1
  180. package/dist/web/assets/stateDiagram-v2-IH3M54BS-hYgwFLzv.js +0 -1
  181. package/dist/web/assets/swimlanes-V6O3JKXN-mOOjKnlm.js +0 -1
  182. package/dist/web/assets/swimlanesDiagram-JKAHXJPX-C_yinM3f.js +0 -8
  183. package/dist/web/assets/timeline-definition-24CTP7MA-DuwMztTy.js +0 -120
  184. package/dist/web/assets/treeView-Q6P3EWNA-BT4vRttT.js +0 -1
  185. package/dist/web/assets/treemap-WGGIJYW6-Df6GHCE2.js +0 -1
  186. package/dist/web/assets/vennDiagram-4TSXK5OY-BbcbGn7o.js +0 -34
  187. package/dist/web/assets/wardley-WFR3VGLG-L_G3ydHA.js +0 -1
  188. package/dist/web/assets/xychartDiagram-S5SC5T6Z-CKHwJboP.js +0 -7
@@ -1,7 +1,7 @@
1
1
  # Structured exchange — for producers
2
2
 
3
3
  A tool can return structured data alongside its text, and this application will render
4
- it natively: a graph, a sequence, or a table, drawn from the data rather than from
4
+ it natively: a graph, a sequence, a table, or a planning timeline, drawn from the data rather than from
5
5
  anything the tool wrote for display. When the document names a target it is read as a
6
6
  *proposal* to change something an external authority holds, and its rendering becomes
7
7
  the approval gate before that change is applied.
@@ -421,6 +421,124 @@ not, and will not:
421
421
  - **resolve anything you name.** Profiles, locations and artifact URIs are inert text
422
422
  until a person acts on them.
423
423
 
424
+ ## Version 3: the timeline, `urn:structured-exchange:3`
425
+
426
+ Version 3 is version 2 with one more kind. Everything version 2 defines keeps its
427
+ meaning — re-declare a version 2 document as version 3 and it reaches the same verdict
428
+ with the same diagnostics — and versions 1 and 2 never accept a timeline. The schema is
429
+ [`shared/schemas/structured-exchange-3.json`](../shared/schemas/structured-exchange-3.json).
430
+
431
+ A `timeline` carries a schedule: a calendar range, rows of tasks and separators, the
432
+ activities and milestones on each task, and optional Gantt dependencies between them.
433
+
434
+ ```json
435
+ {
436
+ "schema": "urn:structured-exchange:3",
437
+ "kind": "timeline",
438
+ "data": {
439
+ "title": "Validation campaign",
440
+ "time": { "start": "2027-01-01", "end": "2027-06-30", "scale": "month" },
441
+ "rows": [
442
+ { "type": "separator", "label": "Bench" },
443
+ { "type": "task", "id": "bench", "label": "Bench tests", "items": [
444
+ { "type": "activity", "id": "b1", "start": "2027-01-11", "end": "2027-02-26", "label": "Campaign 1" },
445
+ { "type": "milestone", "id": "trr", "date": "2027-03-01", "kind": "TRR", "label": "Test Readiness Review" },
446
+ { "type": "activity", "id": "b2", "start": "2027-03-08", "end": "2027-04-30", "label": "Campaign 2" }
447
+ ] },
448
+ { "type": "task", "id": "report", "label": "Report", "items": [
449
+ { "type": "milestone", "id": "final", "date": "2027-06-15", "kind": "QR" }
450
+ ] }
451
+ ],
452
+ "periods": [
453
+ { "start": "2027-05-03", "end": "2027-05-14", "label": "Bench maintenance", "kind": "closure" }
454
+ ],
455
+ "references": [
456
+ { "date": "2027-06-30", "label": "Contractual end of campaign", "kind": "contract" }
457
+ ],
458
+ "dependencies": [
459
+ { "from": "trr", "to": "b2" },
460
+ { "from": "b2", "to": "final" }
461
+ ]
462
+ }
463
+ }
464
+ ```
465
+
466
+ What a producer has to know:
467
+
468
+ - **Dates are calendar days**, `YYYY-MM-DD`, never instants, so no reader's time zone
469
+ moves a bar. An impossible day (`2027-02-30`) is `invalid-date`; a range or an activity
470
+ that ends before it starts is `inverted-range`; an item outside `time` is
471
+ `item-outside-range` — refused, never clipped.
472
+ - **Rows and items are dispatched by `type`.** A task needs `id`, `label` and `items`
473
+ (which may be empty); a separator needs nothing else and may carry a `label`. A refusal
474
+ points at the property at fault, including one the timeline does not define: positions,
475
+ colours, shapes and the current date are the renderer's, and the schema refuses them.
476
+ - **Dependencies** name a task or an identified item at each end. A task stands for the
477
+ span of its items. `type` is one of `finish-to-start` (the default), `start-to-start`,
478
+ `finish-to-finish`, `start-to-finish`. Unresolved ends, an empty task as an end, a task
479
+ linked to its own item, duplicates and cycles are refused. A dependency the dates do
480
+ not honour — the successor's linked day strictly before the predecessor's — is **not**
481
+ refused: it is drawn marked as not satisfied and reported to the agent, because a slip
482
+ is exactly what a reader needs to see.
483
+ - **A timeline is not a proposal.** It carries no `target`, `removals` or `viewpoints`;
484
+ a revision is the whole timeline presented again. No profile constrains it, and
485
+ `write_structure_table` refuses it.
486
+ - **A timeline can carry its calendar.** `periods` (`start`, `end`, optional `label`, `kind`)
487
+ are drawn as translucent bands across every row and the header — a closure, holidays; their
488
+ colour follows their `kind`, neutral and hatched without one. `references` (`date`, `label`,
489
+ optional `kind`) are named dashed lines — a contractual date, a delivery. Neither constrains
490
+ any item. A period may straddle the range's edge and is drawn clipped; one wholly outside is
491
+ `period-outside-range`; a reference outside the range is `item-outside-range`.
492
+ - **A timeline can state what it is compared with.** `comparedTo: { label, date? }` names
493
+ the previous plan; an activity may carry `previous: { start, end }`, a milestone
494
+ `previous: { date }`, and a task or item `role: "added" | "removed"`. The reader draws the
495
+ previous dates dashed beside the current ones with the shift written out, marks what is
496
+ new and strikes what was dropped, and offers the new version alone. Without `comparedTo`,
497
+ none of these may appear (`comparison-without-reference`); an added or removed item has no
498
+ `previous` (`contradictory-change`); nothing may depend on a removed item
499
+ (`dependency-on-removed`); previous dates fall inside `time`. The agent's
500
+ `compare_timelines` tool produces such a document from two plan files, pairing by `id`.
501
+ - **A timeline has a scale, and the reader may change it.** `time.scale` is `week`, `month`
502
+ or `quarter`: the scale the plan opens at, a choice of display that moves no date. The
503
+ reader switches between them or fits the whole range to the visible width; the header
504
+ labels the finest unit there is room for — ISO weeks (`W41`) under months, months under
505
+ years, or quarters (`Q1`) under years — and every year stays named. A comparison opens on
506
+ its first change, anything else on *Today*.
507
+ - **A timeline leaves as a figure.** `write_structure_figure` writes it as one SVG — labels,
508
+ calendar, rows, arrows, key — with `scale` to draw it by week, month or quarter, `width` to
509
+ fit a page (which wins over `scale`), `compact` and `hide_dependencies`
510
+ for the reader's display options, and a date line labelled with the day it was written
511
+ (`reference_line: "none"` omits it). The reader's "download SVG" saves the same figure for
512
+ the options and scale on screen.
513
+ - **Today is never in the document.** The reader draws a *Today* line at their own
514
+ calendar date when it falls in the range, and says which side of the range it is on
515
+ when it does not.
516
+
517
+ A compared timeline, as `compare_timelines` writes it:
518
+
519
+ ```json
520
+ {
521
+ "schema": "urn:structured-exchange:3",
522
+ "kind": "timeline",
523
+ "data": {
524
+ "title": "Validation campaign",
525
+ "comparedTo": { "label": "Plan of 1 September", "date": "2026-09-01" },
526
+ "time": { "start": "2027-01-01", "end": "2027-06-30", "scale": "month" },
527
+ "rows": [
528
+ { "type": "task", "id": "bench", "label": "Bench tests", "items": [
529
+ { "type": "activity", "id": "b1", "start": "2027-01-25", "end": "2027-03-12", "label": "Campaign 1",
530
+ "previous": { "start": "2027-01-11", "end": "2027-02-26" } },
531
+ { "type": "milestone", "id": "trr", "date": "2027-03-15", "kind": "TRR", "role": "added" },
532
+ { "type": "milestone", "id": "dry", "date": "2027-02-01", "label": "Dry run", "role": "removed" }
533
+ ] }
534
+ ]
535
+ }
536
+ }
537
+ ```
538
+
539
+ The scales are `week`, `month` and `quarter`. Version 3 may still grow in place until a
540
+ release publishes it; after that, another scale is a version 4.
541
+
424
542
  ## Holding documents to a project's data model
425
543
 
426
544
  The core contract treats `profile` as a name. A project can go further: declare its data
@@ -796,6 +914,7 @@ contract ships with the package, under `contract/`:
796
914
  node_modules/pi-outpost/dist/contract/
797
915
  schemas/structured-exchange-1.json the normative schema — any validator runs it
798
916
  schemas/structured-exchange-2.json the enriched contract, published beside it
917
+ schemas/structured-exchange-3.json version 2 plus the planning timeline
799
918
  schemas/structured-exchange-rules-1.json
800
919
  the rules a project reviews its specifications against
801
920
  conformance/ documents and the verdict each should get
@@ -17,8 +17,8 @@ whether it conforms does not have a contract, it has a dependency.
17
17
 
18
18
  ## Two versions in one suite
19
19
 
20
- Cases are named for the version they exercise: `v2-` for the enriched contract,
21
- everything else for version 1. A conforming implementation dispatches on the
20
+ Cases are named for the version they exercise: `v3-` for the timeline, `v2-` for the
21
+ enriched contract, everything else for version 1. A conforming implementation dispatches on the
22
22
  identifier each document declares — `index.json` states the expected verdict, and
23
23
  nothing else about a case tells you which contract judges it.
24
24
 
@@ -48,6 +48,19 @@ at v0.25.0 — the first release to publish version 2. Until then version 2 grew
48
48
  written against it. From that release on, a change to what a version 2 envelope may say is a
49
49
  new version, and the two locks together are the floor the suite may not sink below.
50
50
 
51
+ ## Version 3
52
+
53
+ Version 3 is version 2 with one more kind, `timeline`. Everything version 2 defines keeps
54
+ its meaning, so a version 2 document re-declared as version 3 reaches the same verdict
55
+ with the same reasons; the `v3-` cases exercise only the timeline. `unknown-version`
56
+ moved to version 4 when version 3 was published, and the version 1 lock records why.
57
+
58
+ Version 3 may still grow in place until a release publishes it, as version 2 did for
59
+ viewpoints — compared timelines (`comparedTo`, `previous`, `role`), calendar periods and reference dates
60
+ (`periods`, `references`) and the `week` and `quarter` scales were added that way. From that release on it is
61
+ frozen like the other two: another timeline scale (`day`, `year`), another item or row type, or anything else a
62
+ version 3 document could not say before, is a version 4.
63
+
51
64
  ## Rules that are not in the schema
52
65
 
53
66
  JSON Schema decides shape. These are the relational rules that follow it, and the
@@ -55,12 +68,12 @@ JSON Schema decides shape. These are the relational rules that follow it, and th
55
68
 
56
69
  | Rule | What it refuses |
57
70
  |---|---|
58
- | `duplicate-identifier` | two elements sharing an envelope-scoped `id` |
71
+ | `duplicate-identifier` | two elements sharing an envelope-scoped `id` — on a timeline, any two tasks or items |
59
72
  | `duplicate-container-identifier` | two containers sharing an `id` |
60
- | `unresolved-endpoint` | a relationship endpoint that no declared element carries |
73
+ | `unresolved-endpoint` | a relationship endpoint that no declared element carries, or a timeline dependency naming no task or item |
61
74
  | `unresolved-container` | an element assigned to a container the document never declares |
62
75
  | `kind-data-mismatch` | a declared `kind` that disagrees with the data variant present |
63
- | `kind-not-proposable` | a `table` carrying a `target` or a `removal` |
76
+ | `kind-not-proposable` | a `table` (version 1) or a `timeline` carrying a `target` or a `removal` |
64
77
  | `removal-without-target` | a removal in a document that targets nothing |
65
78
  | `duplicate-reference` | the same reference addressed twice — changed twice, or changed and removed |
66
79
  | `change-without-reference` | a `set` with no `ref` naming what should change |
@@ -71,6 +84,17 @@ JSON Schema decides shape. These are the relational rules that follow it, and th
71
84
  | `viewpoints-without-graph` | viewpoints declared on a document that is not a graph |
72
85
  | `duplicate-viewpoint-identifier` | two viewpoints of one document sharing an `id` |
73
86
  | `empty-viewpoint` | a viewpoint that retains no element kind and no relationship kind |
87
+ | `invalid-date` | a timeline date the pattern admits and the calendar does not, such as `2027-02-30` |
88
+ | `inverted-range` | a timeline, or an activity, that starts after it ends |
89
+ | `item-outside-range` | an activity or milestone outside the timeline's `time` range — refused, never clipped |
90
+ | `empty-task-endpoint` | a dependency naming a task that holds no item, so has no start or finish |
91
+ | `self-dependency` | a dependency from something to itself, or between a task and one of its own items |
92
+ | `duplicate-dependency` | the same `from`, `to` and type declared twice |
93
+ | `comparison-without-reference` | previous dates or a change role in a timeline that declares no `comparedTo` |
94
+ | `contradictory-change` | previous dates on an added or removed item, or an item role contradicting its task's |
95
+ | `dependency-on-removed` | a dependency naming a task or item the plan dropped |
96
+ | `period-outside-range` | a timeline period lying wholly outside the range (one straddling an edge is drawn clipped) |
97
+ | `dependency-cycle` | dependencies that loop, which no dates could honour; the message names the loop |
74
98
  | `unresolved-viewpoint-kind` | a viewpoint retaining a kind no element, or no relationship, of the document has — checked per vocabulary, and never corrected to a near miss |
75
99
 
76
100
  Rules prefixed `schema/` come from the JSON Schema itself; the suffix is the keyword
@@ -77,6 +77,33 @@
77
77
  },
78
78
  {
79
79
  "file": "valid/v2-graph-with-viewpoints.json"
80
+ },
81
+ {
82
+ "file": "valid/v3-timeline-programme.json"
83
+ },
84
+ {
85
+ "file": "valid/v3-timeline-empty-task-and-anonymous-separator.json"
86
+ },
87
+ {
88
+ "file": "valid/v3-timeline-single-day-activity.json"
89
+ },
90
+ {
91
+ "file": "valid/v3-timeline-week-scale.json"
92
+ },
93
+ {
94
+ "file": "valid/v3-timeline-quarter-scale.json"
95
+ },
96
+ {
97
+ "file": "valid/v3-timeline-four-dependency-types.json"
98
+ },
99
+ {
100
+ "file": "valid/v3-timeline-unsatisfied-dependency.json"
101
+ },
102
+ {
103
+ "file": "valid/v3-timeline-compared.json"
104
+ },
105
+ {
106
+ "file": "valid/v3-timeline-calendar.json"
80
107
  }
81
108
  ],
82
109
  "invalid": [
@@ -255,6 +282,94 @@
255
282
  {
256
283
  "file": "invalid/viewpoints-under-version-1.json",
257
284
  "expectedRule": "schema/additionalProperties"
285
+ },
286
+ {
287
+ "file": "invalid/v3-timeline-impossible-date.json",
288
+ "expectedRule": "invalid-date"
289
+ },
290
+ {
291
+ "file": "invalid/v3-timeline-inverted-activity.json",
292
+ "expectedRule": "inverted-range"
293
+ },
294
+ {
295
+ "file": "invalid/v3-timeline-inverted-range.json",
296
+ "expectedRule": "inverted-range"
297
+ },
298
+ {
299
+ "file": "invalid/v3-timeline-milestone-outside-range.json",
300
+ "expectedRule": "item-outside-range"
301
+ },
302
+ {
303
+ "file": "invalid/v3-timeline-duplicate-identifier.json",
304
+ "expectedRule": "duplicate-identifier"
305
+ },
306
+ {
307
+ "file": "invalid/v3-timeline-unresolved-dependency-endpoint.json",
308
+ "expectedRule": "unresolved-endpoint"
309
+ },
310
+ {
311
+ "file": "invalid/v3-timeline-empty-task-endpoint.json",
312
+ "expectedRule": "empty-task-endpoint"
313
+ },
314
+ {
315
+ "file": "invalid/v3-timeline-self-dependency.json",
316
+ "expectedRule": "self-dependency"
317
+ },
318
+ {
319
+ "file": "invalid/v3-timeline-duplicate-dependency.json",
320
+ "expectedRule": "duplicate-dependency"
321
+ },
322
+ {
323
+ "file": "invalid/v3-timeline-dependency-cycle.json",
324
+ "expectedRule": "dependency-cycle"
325
+ },
326
+ {
327
+ "file": "invalid/v3-timeline-unsupported-scale.json",
328
+ "expectedRule": "schema/enum"
329
+ },
330
+ {
331
+ "file": "invalid/v3-timeline-unknown-dependency-type.json",
332
+ "expectedRule": "schema/enum"
333
+ },
334
+ {
335
+ "file": "invalid/v3-timeline-presentation-property.json",
336
+ "expectedRule": "schema/additionalProperties"
337
+ },
338
+ {
339
+ "file": "invalid/v3-timeline-with-target.json",
340
+ "expectedRule": "kind-not-proposable"
341
+ },
342
+ {
343
+ "file": "invalid/v3-timeline-under-version-2.json",
344
+ "expectedRule": "schema/enum"
345
+ },
346
+ {
347
+ "file": "invalid/v3-timeline-comparison-without-reference.json",
348
+ "expectedRule": "comparison-without-reference"
349
+ },
350
+ {
351
+ "file": "invalid/v3-timeline-contradictory-change.json",
352
+ "expectedRule": "contradictory-change"
353
+ },
354
+ {
355
+ "file": "invalid/v3-timeline-previous-outside-range.json",
356
+ "expectedRule": "item-outside-range"
357
+ },
358
+ {
359
+ "file": "invalid/v3-timeline-dependency-on-removed.json",
360
+ "expectedRule": "dependency-on-removed"
361
+ },
362
+ {
363
+ "file": "invalid/v3-timeline-previous-wrong-shape.json",
364
+ "expectedRule": "schema/additionalProperties"
365
+ },
366
+ {
367
+ "file": "invalid/v3-timeline-period-outside-range.json",
368
+ "expectedRule": "period-outside-range"
369
+ },
370
+ {
371
+ "file": "invalid/v3-timeline-reference-outside-range.json",
372
+ "expectedRule": "item-outside-range"
258
373
  }
259
374
  ]
260
375
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "schema": "urn:structured-exchange:3",
2
+ "schema": "urn:structured-exchange:4",
3
3
  "kind": "graph",
4
4
  "data": {
5
5
  "nodes": [
@@ -0,0 +1,123 @@
1
+ {
2
+ "schema": "urn:structured-exchange:3",
3
+ "kind": "timeline",
4
+ "data": {
5
+ "title": "Programme X",
6
+ "time": {
7
+ "start": "2026-10-01",
8
+ "end": "2028-03-31",
9
+ "scale": "month"
10
+ },
11
+ "rows": [
12
+ {
13
+ "type": "separator",
14
+ "label": "Système A"
15
+ },
16
+ {
17
+ "type": "task",
18
+ "id": "T1",
19
+ "label": "Études système",
20
+ "items": [
21
+ {
22
+ "type": "activity",
23
+ "id": "etude-preliminaire",
24
+ "start": "2026-11-01",
25
+ "end": "2027-02-28",
26
+ "label": "Étude préliminaire"
27
+ },
28
+ {
29
+ "type": "milestone",
30
+ "id": "srr",
31
+ "date": "2027-03-01",
32
+ "kind": "SRR",
33
+ "label": "System Requirements Review",
34
+ "previous": {
35
+ "date": "2027-02-01"
36
+ }
37
+ },
38
+ {
39
+ "type": "activity",
40
+ "id": "etude-detaillee",
41
+ "start": "2027-03-15",
42
+ "end": "2027-07-31",
43
+ "label": "Étude détaillée"
44
+ },
45
+ {
46
+ "type": "milestone",
47
+ "id": "pdr",
48
+ "date": "2027-05-15",
49
+ "kind": "PDR",
50
+ "label": "Preliminary Design Review"
51
+ },
52
+ {
53
+ "type": "milestone",
54
+ "id": "cdr",
55
+ "date": "2027-08-01",
56
+ "kind": "CDR",
57
+ "label": "Critical Design Review"
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "type": "task",
63
+ "id": "T2",
64
+ "label": "Développement",
65
+ "items": [
66
+ {
67
+ "type": "activity",
68
+ "id": "dev",
69
+ "start": "2027-03-01",
70
+ "end": "2027-09-30",
71
+ "label": "Développement"
72
+ }
73
+ ]
74
+ },
75
+ {
76
+ "type": "separator",
77
+ "label": "Système B"
78
+ },
79
+ {
80
+ "type": "task",
81
+ "id": "T3",
82
+ "label": "Études système",
83
+ "items": [
84
+ {
85
+ "type": "activity",
86
+ "start": "2027-02-01",
87
+ "end": "2027-06-30",
88
+ "label": "Étude"
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "type": "separator"
94
+ },
95
+ {
96
+ "type": "task",
97
+ "id": "T4",
98
+ "label": "Recette",
99
+ "items": []
100
+ }
101
+ ],
102
+ "dependencies": [
103
+ {
104
+ "from": "etude-preliminaire",
105
+ "to": "srr"
106
+ },
107
+ {
108
+ "from": "srr",
109
+ "to": "T2"
110
+ },
111
+ {
112
+ "from": "etude-detaillee",
113
+ "to": "cdr",
114
+ "type": "finish-to-finish"
115
+ },
116
+ {
117
+ "from": "T1",
118
+ "to": "T3",
119
+ "type": "start-to-start"
120
+ }
121
+ ]
122
+ }
123
+ }
@@ -0,0 +1,128 @@
1
+ {
2
+ "schema": "urn:structured-exchange:3",
3
+ "kind": "timeline",
4
+ "data": {
5
+ "title": "Programme X",
6
+ "time": {
7
+ "start": "2026-10-01",
8
+ "end": "2028-03-31",
9
+ "scale": "month"
10
+ },
11
+ "rows": [
12
+ {
13
+ "type": "separator",
14
+ "label": "Système A"
15
+ },
16
+ {
17
+ "type": "task",
18
+ "id": "T1",
19
+ "label": "Études système",
20
+ "items": [
21
+ {
22
+ "type": "activity",
23
+ "id": "etude-preliminaire",
24
+ "start": "2026-11-01",
25
+ "end": "2027-02-28",
26
+ "label": "Étude préliminaire"
27
+ },
28
+ {
29
+ "type": "milestone",
30
+ "id": "srr",
31
+ "date": "2027-03-01",
32
+ "kind": "SRR",
33
+ "label": "System Requirements Review"
34
+ },
35
+ {
36
+ "type": "activity",
37
+ "id": "etude-detaillee",
38
+ "start": "2027-03-15",
39
+ "end": "2027-07-31",
40
+ "label": "Étude détaillée"
41
+ },
42
+ {
43
+ "type": "milestone",
44
+ "id": "pdr",
45
+ "date": "2027-05-15",
46
+ "kind": "PDR",
47
+ "label": "Preliminary Design Review"
48
+ },
49
+ {
50
+ "type": "milestone",
51
+ "id": "cdr",
52
+ "date": "2027-08-01",
53
+ "kind": "CDR",
54
+ "label": "Critical Design Review",
55
+ "role": "added",
56
+ "previous": {
57
+ "date": "2027-07-01"
58
+ }
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "type": "task",
64
+ "id": "T2",
65
+ "label": "Développement",
66
+ "items": [
67
+ {
68
+ "type": "activity",
69
+ "id": "dev",
70
+ "start": "2027-03-01",
71
+ "end": "2027-09-30",
72
+ "label": "Développement"
73
+ }
74
+ ]
75
+ },
76
+ {
77
+ "type": "separator",
78
+ "label": "Système B"
79
+ },
80
+ {
81
+ "type": "task",
82
+ "id": "T3",
83
+ "label": "Études système",
84
+ "items": [
85
+ {
86
+ "type": "activity",
87
+ "start": "2027-02-01",
88
+ "end": "2027-06-30",
89
+ "label": "Étude"
90
+ }
91
+ ]
92
+ },
93
+ {
94
+ "type": "separator"
95
+ },
96
+ {
97
+ "type": "task",
98
+ "id": "T4",
99
+ "label": "Recette",
100
+ "items": []
101
+ }
102
+ ],
103
+ "dependencies": [
104
+ {
105
+ "from": "etude-preliminaire",
106
+ "to": "srr"
107
+ },
108
+ {
109
+ "from": "srr",
110
+ "to": "T2"
111
+ },
112
+ {
113
+ "from": "etude-detaillee",
114
+ "to": "cdr",
115
+ "type": "finish-to-finish"
116
+ },
117
+ {
118
+ "from": "T1",
119
+ "to": "T3",
120
+ "type": "start-to-start"
121
+ }
122
+ ],
123
+ "comparedTo": {
124
+ "label": "Plan of 1 September",
125
+ "date": "2026-09-01"
126
+ }
127
+ }
128
+ }