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.
- package/dist/contract/README.md +120 -1
- package/dist/contract/conformance/README.md +29 -5
- package/dist/contract/conformance/index.json +115 -0
- package/dist/contract/conformance/invalid/unknown-version.json +1 -1
- package/dist/contract/conformance/invalid/v3-timeline-comparison-without-reference.json +123 -0
- package/dist/contract/conformance/invalid/v3-timeline-contradictory-change.json +128 -0
- package/dist/contract/conformance/invalid/v3-timeline-dependency-cycle.json +124 -0
- package/dist/contract/conformance/invalid/v3-timeline-dependency-on-removed.json +125 -0
- package/dist/contract/conformance/invalid/v3-timeline-duplicate-dependency.json +125 -0
- package/dist/contract/conformance/invalid/v3-timeline-duplicate-identifier.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-empty-task-endpoint.json +124 -0
- package/dist/contract/conformance/invalid/v3-timeline-impossible-date.json +101 -0
- package/dist/contract/conformance/invalid/v3-timeline-inverted-activity.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-inverted-range.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-milestone-outside-range.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-period-outside-range.json +139 -0
- package/dist/contract/conformance/invalid/v3-timeline-presentation-property.json +121 -0
- package/dist/contract/conformance/invalid/v3-timeline-previous-outside-range.json +128 -0
- package/dist/contract/conformance/invalid/v3-timeline-previous-wrong-shape.json +128 -0
- package/dist/contract/conformance/invalid/v3-timeline-reference-outside-range.json +140 -0
- package/dist/contract/conformance/invalid/v3-timeline-self-dependency.json +124 -0
- package/dist/contract/conformance/invalid/v3-timeline-under-version-2.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-unknown-dependency-type.json +121 -0
- package/dist/contract/conformance/invalid/v3-timeline-unresolved-dependency-endpoint.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-unsupported-scale.json +120 -0
- package/dist/contract/conformance/invalid/v3-timeline-with-target.json +123 -0
- package/dist/contract/conformance/valid/v3-timeline-calendar.json +140 -0
- package/dist/contract/conformance/valid/v3-timeline-compared.json +142 -0
- package/dist/contract/conformance/valid/v3-timeline-empty-task-and-anonymous-separator.json +35 -0
- package/dist/contract/conformance/valid/v3-timeline-four-dependency-types.json +61 -0
- package/dist/contract/conformance/valid/v3-timeline-programme.json +44 -0
- package/dist/contract/conformance/valid/v3-timeline-quarter-scale.json +42 -0
- package/dist/contract/conformance/valid/v3-timeline-single-day-activity.json +27 -0
- package/dist/contract/conformance/valid/v3-timeline-unsatisfied-dependency.json +45 -0
- package/dist/contract/conformance/valid/v3-timeline-week-scale.json +35 -0
- package/dist/contract/conformance/version-1.lock.json +2 -2
- package/dist/contract/schemas/structured-exchange-3.json +1263 -0
- package/dist/contract/schemas/structured-exchange-profile-registry-2.json +94 -0
- package/dist/contract/structured-exchange-project-setup.md +36 -0
- package/dist/contract/validate-structured-exchange.mjs +1981 -174
- package/dist/pi-outpost-tools.mjs +4556 -1130
- package/dist/pi-outpost.mjs +5733 -1898
- package/dist/pi-outpost.sea.mjs +2 -2
- package/dist/sea-prep.blob +2 -2
- package/dist/skills/structured-exchange/SKILL.md +90 -378
- package/dist/skills/structured-exchange/references/enriched-contract.md +158 -0
- package/dist/skills/structured-exchange/references/figures.md +52 -0
- package/dist/skills/structured-exchange/references/graphs-and-tables.md +115 -0
- package/dist/skills/structured-exchange/references/proposals.md +86 -0
- package/dist/skills/structured-exchange/references/timelines.md +87 -0
- package/dist/skills/structured-exchange/structured-exchange-3.json +1263 -0
- package/dist/skills/structured-exchange/structured-exchange-profile-registry-2.json +94 -0
- package/dist/skills/structured-exchange-project/SKILL.md +22 -0
- package/dist/web/assets/{PdfViewer-DHIy06i5.js → PdfViewer-9kadnb9W.js} +2 -2
- package/dist/web/assets/{abnfDiagram-VCTEODGH-0IqI620v.js → abnfDiagram-YUKMZFIV-BUZ7jF1I.js} +1 -1
- package/dist/web/assets/architecture-WOLXFQ4H-CxBmyj2Z.js +1 -0
- package/dist/web/assets/architectureDiagram-47P4ROYG-BAvert-J.js +36 -0
- package/dist/web/assets/{blockDiagram-OSKFZWR5-sw0nzjYC.js → blockDiagram-E7TT5TSB-CXQT_J2x.js} +16 -5
- package/dist/web/assets/c4Diagram-CRA5TL53-Byqo5aDs.js +38 -0
- package/dist/web/assets/channel-D3nE3SyW.js +1 -0
- package/dist/web/assets/chunk-2BW5OAIV-D9dSVCv2.js +10 -0
- package/dist/web/assets/chunk-3YJQHVM4-D6IQcIQB.js +2 -0
- package/dist/web/assets/chunk-4EA7E6EY-BxZ_5HMn.js +1 -0
- package/dist/web/assets/{chunk-F27PBJKO-C6rqX2gT.js → chunk-7TKQ45FW-G9TsFldk.js} +1 -1
- package/dist/web/assets/{chunk-SVP7TREG-CYXVRfc0.js → chunk-AW2ZBBNX-nmg5rsd5.js} +3 -3
- package/dist/web/assets/{chunk-GVQU2GXP-BtSmWzHA.js → chunk-DBDB3WZW-BwVIGLtu.js} +1 -1
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-E2ZNV5FY-VD95O25Z.js +72 -0
- package/dist/web/assets/chunk-EU5HNXII-CSnybkPb.js +213 -0
- package/dist/web/assets/chunk-FVRAUYC3-TBqluQ8N.js +2 -0
- package/dist/web/assets/{chunk-PWAF6VOD-Dup_NAkl.js → chunk-HJ2JQQFS-BiLMpVsO.js} +1 -1
- package/dist/web/assets/chunk-HTAEGDNF-QDOAuhR5.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/{chunk-POPQ4Y6H-BrnPOTT-.js → chunk-KQW6MTUR-_WxFaX97.js} +1 -1
- package/dist/web/assets/chunk-NGNAAXSQ-BW1P8EP7.js +136 -0
- package/dist/web/assets/chunk-NTY3LDVX-BI0Pj8F6.js +1 -0
- package/dist/web/assets/chunk-VPRB5NB3-BBDlNNll.js +129 -0
- package/dist/web/assets/chunk-XC4XBNZT-Ba1ra4Jd.js +62 -0
- package/dist/web/assets/classDiagram-v2-K4WV4PDN-CksBjG_q.js +217 -0
- package/dist/web/assets/{conversationExport-CfUybHMU.js → conversationExport-q-9NUHuj.js} +1 -1
- package/dist/web/assets/cynefin-EF2NZ3EQ-ucJDz_S5.js +1 -0
- package/dist/web/assets/{cynefinDiagram-5FMLGOSQ-BKvXEDID.js → cynefinDiagram-3GCD6N5R-qPxcNdaa.js} +1 -1
- package/dist/web/assets/dagre-W4DXFKR2-ChflYJGj.js +4 -0
- package/dist/web/assets/diagram-2UJZ2QOL-Bi9ngdu2.js +200 -0
- package/dist/web/assets/{diagram-VX7I27RA-D5POkb-9.js → diagram-OVF4WLC6-iSSbF5Cd.js} +10 -10
- package/dist/web/assets/{diagram-S7CK7UJ4-DTvEAe9r.js → diagram-PFPMY2P6-BeEOD8rR.js} +2 -2
- package/dist/web/assets/{diagram-Z3DM3KII-CC2Mxm4H.js → diagram-UMYRVEAY-BckO6iZI.js} +1 -1
- package/dist/web/assets/{diagram-UQ7AKVKN-CVGEkml-.js → diagram-YEKJPTXX-BzzDIAmO.js} +2 -2
- package/dist/web/assets/diagram-ZIFT7M5P-ByjWOPbN.js +3 -0
- package/dist/web/assets/{docxExport-ErgwApAZ.js → docxExport-BO7j3Xnv.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-PWID7BFC-CbDy2vxX.js → ebnfDiagram-VR2GEFS7-DRp-A5JC.js} +1 -1
- package/dist/web/assets/elk-IJKZMXRS-QzeiQ3l1.js +27 -0
- package/dist/web/assets/{erDiagram-2YWLMYGG-DUdStx-7.js → erDiagram-O2IAPWRE-BewZvI56.js} +15 -15
- package/dist/web/assets/eventmodeling-K75KTNOO-CX7X0bsf.js +1 -0
- package/dist/web/assets/flowDiagram-OXPTDLAJ-CSIHFoeR.js +1 -0
- package/dist/web/assets/ganttDiagram-R7TSEDQI-BT8Lcdwc.js +292 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-BxYbaxeg.js +1 -0
- package/dist/web/assets/gitGraphDiagram-XJZIOB7I-B0fqVCqP.js +106 -0
- package/dist/web/assets/index-DcqvxkHN.css +2 -0
- package/dist/web/assets/index-eTp_lQUc.js +350 -0
- package/dist/web/assets/info-OHQRW6UA-DV3PDKXA.js +1 -0
- package/dist/web/assets/infoDiagram-5W2HQ5XZ-DfHpZ9RG.js +2 -0
- package/dist/web/assets/{ishikawaDiagram-5VMMS53U-D-gYpOUM.js → ishikawaDiagram-K3B6WC7H-DuwLwL9k.js} +2 -2
- package/dist/web/assets/{journeyDiagram-EYS64GPL-B0WqOtZ4.js → journeyDiagram-COXZFDF6-CMOfweZO.js} +4 -4
- package/dist/web/assets/{kanban-definition-UXKFOSKX-DIrVFtP3.js → kanban-definition-P3RFRI5V-DjHhlDbk.js} +9 -9
- package/dist/web/assets/{line-CuEhAU65.js → line-CGIAMPkR.js} +1 -1
- package/dist/web/assets/loadReferencedImage-DZ5eApE4.js +2 -0
- package/dist/web/assets/{mermaid-parser.core-CzCh9EE1.js → mermaid-parser.core-C18KmsD9.js} +6 -6
- package/dist/web/assets/mermaid.core-C9srNL3b.js +44 -0
- package/dist/web/assets/{mindmap-definition-THT77NOG-CBH0Z9AJ.js → mindmap-definition-LZFPQGKD-C38HXkG2.js} +24 -24
- package/dist/web/assets/packet-JDAUHWVQ-Br-8ADK6.js +1 -0
- package/dist/web/assets/{pdf-6mG9havR.js → pdf-C3f6Vjz7.js} +1 -1
- package/dist/web/assets/{pegDiagram-XKGWAZYB-BNpTWHo8.js → pegDiagram-BGZESJAR-Be49dM_b.js} +1 -1
- package/dist/web/assets/pie-XZMESJXO-68ykK6i1.js +1 -0
- package/dist/web/assets/{pieDiagram-E7YTZNPT-CZ34Q1W-.js → pieDiagram-CAPJLFHJ-DVOWjXQ_.js} +2 -2
- package/dist/web/assets/{quadrantDiagram-AXDQQJYC-C5aFQsIe.js → quadrantDiagram-GDMTTRAM-8la_R53U.js} +3 -3
- package/dist/web/assets/radar-ABXABTNO-K00ZGu13.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-W7QuDysT.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-DR6CNkaK.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-dAhaGv5L.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-DwoiiDdE.js +1 -0
- package/dist/web/assets/{railroadDiagram-O6MQD6OU-B0ctRtRT.js → railroadDiagram-SM67HX2B-BuSjCs02.js} +1 -1
- package/dist/web/assets/{requirementDiagram-IS5BZ75X-BuOtNPGm.js → requirementDiagram-X7JNWC4A-3uq8m_5E.js} +11 -11
- package/dist/web/assets/{sankeyDiagram-P5KCCOFB-CybICPpQ.js → sankeyDiagram-UM26HJRW-BB9_G8bN.js} +3 -3
- package/dist/web/assets/sequenceDiagram-ZO4K6R2Y-CGehVq9k.js +169 -0
- package/dist/web/assets/stateDiagram-v2-TBUQTH76-CwMywh5s.js +291 -0
- package/dist/web/assets/swimlanes-N4OXWK64-CqjihurI.js +1 -0
- package/dist/web/assets/swimlanesDiagram-K3J5GTZL-Blk5ohUI.js +8 -0
- package/dist/web/assets/timeline-definition-YOQAKGHF-BtKnuY5Y.js +120 -0
- package/dist/web/assets/treeView-D4JQ5SDB-Dy4jC4wa.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-CHtGJD8P.js +1 -0
- package/dist/web/assets/usecaseDiagram-VIAY4XPW-BjnstWbR.js +328 -0
- package/dist/web/assets/vennDiagram-BLWOH2XV-o_EtJWVA.js +34 -0
- package/dist/web/assets/wardley-7MLQ67FV-BTheL3FW.js +1 -0
- package/dist/web/assets/{wardleyDiagram-VM6X3IG4-CzB2tR_t.js → wardleyDiagram-YMQ3BMBF-Bp_sv2v4.js} +3 -3
- package/dist/web/assets/xychartDiagram-TAQBALBS-C0IpEfij.js +7 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -3
- package/dist/web/assets/architecture-7GRP2DOG-BqTZwqCY.js +0 -1
- package/dist/web/assets/architectureDiagram-5GKGNRK7-BEGSAGSn.js +0 -36
- package/dist/web/assets/c4Diagram-7LVT6UL2-C6wQYxBC.js +0 -38
- package/dist/web/assets/channel-CbMG5PZq.js +0 -1
- package/dist/web/assets/chunk-3NF5O7KM-Dni31-nE.js +0 -168
- package/dist/web/assets/chunk-4HAMMTFA-hiqoLVtf.js +0 -62
- package/dist/web/assets/chunk-75Z2AOVW-1k7HRGrm.js +0 -2
- package/dist/web/assets/chunk-DU6HZSFF-Dy05V--k.js +0 -127
- package/dist/web/assets/chunk-FOHPRMQF-DHwB1DNv.js +0 -161
- package/dist/web/assets/chunk-GMAD6QVW-Bi5Ne8OE.js +0 -72
- package/dist/web/assets/chunk-HLEWEB6X-yamDqy1M.js +0 -206
- package/dist/web/assets/chunk-L3NEJ4N5-CQSamtuJ.js +0 -1
- package/dist/web/assets/chunk-OSK3NFVY-S95igUko.js +0 -10
- package/dist/web/assets/chunk-P2QGCYS3-BPor-azX.js +0 -1
- package/dist/web/assets/chunk-ZLD2IHE6-D0uZMMWb.js +0 -231
- package/dist/web/assets/classDiagram-CYGNFDIV-2Yl201cv.js +0 -1
- package/dist/web/assets/classDiagram-v2-TLXNO2FR-2Yl201cv.js +0 -1
- package/dist/web/assets/cynefin-OW5HDTMX-ua6bZIWp.js +0 -1
- package/dist/web/assets/dagre-OS7QT2EB-BRxaZdm2.js +0 -4
- package/dist/web/assets/dagre-PrKaheQc.js +0 -1
- package/dist/web/assets/diagram-VSXAHHWV-Dkh-RvzE.js +0 -3
- package/dist/web/assets/eventmodeling-NTZA5JFV-Bw8wULv_.js +0 -1
- package/dist/web/assets/flowDiagram-T62WH6J4-Dp4v9IDN.js +0 -1
- package/dist/web/assets/ganttDiagram-EL5Y4UJY-6dI1H52q.js +0 -292
- package/dist/web/assets/gitGraph-4MIJSDKK-UXnB0IFr.js +0 -1
- package/dist/web/assets/gitGraphDiagram-WWUBYQGX-B_wXPpx0.js +0 -106
- package/dist/web/assets/index-9y9n2Dul.css +0 -2
- package/dist/web/assets/index-COu8CnNa.js +0 -350
- package/dist/web/assets/info-A6RAGUB7-C2WWyNzF.js +0 -1
- package/dist/web/assets/infoDiagram-FKFFQAWI-DY65_ndC.js +0 -2
- package/dist/web/assets/loadReferencedImage-DgHMXQNZ.js +0 -2
- package/dist/web/assets/mermaid.core-BmGW_v8T.js +0 -44
- package/dist/web/assets/packet-AYTQ26CC-BYG_KViO.js +0 -1
- package/dist/web/assets/pie-WAS4IAKB-wBoUHr8R.js +0 -1
- package/dist/web/assets/radar-RG4KPBEZ-D4K5XP7X.js +0 -1
- package/dist/web/assets/railroad-74A4TZTK-Haum25Us.js +0 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-D-kbOsoZ.js +0 -1
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-CWtixpZf.js +0 -1
- package/dist/web/assets/railroad-peg-WCYAUIDC-BeY7arxf.js +0 -1
- package/dist/web/assets/sequenceDiagram-WJ2MYXX4-Dvo8sl8e.js +0 -162
- package/dist/web/assets/stateDiagram-XQSTLZYL-BcM-hGJa.js +0 -1
- package/dist/web/assets/stateDiagram-v2-IH3M54BS-hYgwFLzv.js +0 -1
- package/dist/web/assets/swimlanes-V6O3JKXN-mOOjKnlm.js +0 -1
- package/dist/web/assets/swimlanesDiagram-JKAHXJPX-C_yinM3f.js +0 -8
- package/dist/web/assets/timeline-definition-24CTP7MA-DuwMztTy.js +0 -120
- package/dist/web/assets/treeView-Q6P3EWNA-BT4vRttT.js +0 -1
- package/dist/web/assets/treemap-WGGIJYW6-Df6GHCE2.js +0 -1
- package/dist/web/assets/vennDiagram-4TSXK5OY-BbcbGn7o.js +0 -34
- package/dist/web/assets/wardley-WFR3VGLG-L_G3ydHA.js +0 -1
- package/dist/web/assets/xychartDiagram-S5SC5T6Z-CKHwJboP.js +0 -7
package/dist/contract/README.md
CHANGED
|
@@ -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
|
|
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: `
|
|
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
|
}
|
|
@@ -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
|
+
}
|