@primmel/primmel 1.5.0 → 1.5.1

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 (112) hide show
  1. package/dist/src/check-rules.d.ts.map +1 -1
  2. package/dist/src/check-rules.js +7 -1
  3. package/dist/src/check-rules.js.map +1 -1
  4. package/dist/src/check.d.ts +13 -0
  5. package/dist/src/check.d.ts.map +1 -1
  6. package/dist/src/check.js +91 -0
  7. package/dist/src/check.js.map +1 -1
  8. package/dist/src/ser-des/config/artifact.d.ts.map +1 -1
  9. package/dist/src/ser-des/config/artifact.js +29 -12
  10. package/dist/src/ser-des/config/artifact.js.map +1 -1
  11. package/dist/src/ser-des/config/calculation.d.ts.map +1 -1
  12. package/dist/src/ser-des/config/calculation.js +21 -6
  13. package/dist/src/ser-des/config/calculation.js.map +1 -1
  14. package/dist/src/ser-des/config/competenceKind.d.ts.map +1 -1
  15. package/dist/src/ser-des/config/competenceKind.js +9 -0
  16. package/dist/src/ser-des/config/competenceKind.js.map +1 -1
  17. package/dist/src/ser-des/config/conformanceClass.d.ts.map +1 -1
  18. package/dist/src/ser-des/config/conformanceClass.js +2 -1
  19. package/dist/src/ser-des/config/conformanceClass.js.map +1 -1
  20. package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -1
  21. package/dist/src/ser-des/config/conformanceTest.js +11 -23
  22. package/dist/src/ser-des/config/conformanceTest.js.map +1 -1
  23. package/dist/src/ser-des/config/constraint.d.ts.map +1 -1
  24. package/dist/src/ser-des/config/constraint.js +9 -0
  25. package/dist/src/ser-des/config/constraint.js.map +1 -1
  26. package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
  27. package/dist/src/ser-des/config/field-parser.js +29 -2
  28. package/dist/src/ser-des/config/field-parser.js.map +1 -1
  29. package/dist/src/ser-des/config/form.d.ts.map +1 -1
  30. package/dist/src/ser-des/config/form.js +12 -2
  31. package/dist/src/ser-des/config/form.js.map +1 -1
  32. package/dist/src/ser-des/config/formulasUsed.d.ts.map +1 -1
  33. package/dist/src/ser-des/config/formulasUsed.js +20 -9
  34. package/dist/src/ser-des/config/formulasUsed.js.map +1 -1
  35. package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -1
  36. package/dist/src/ser-des/config/packageManifest.js +5 -2
  37. package/dist/src/ser-des/config/packageManifest.js.map +1 -1
  38. package/dist/src/ser-des/config/process.d.ts.map +1 -1
  39. package/dist/src/ser-des/config/process.js +15 -12
  40. package/dist/src/ser-des/config/process.js.map +1 -1
  41. package/dist/src/ser-des/config/ref.d.ts +55 -0
  42. package/dist/src/ser-des/config/ref.d.ts.map +1 -1
  43. package/dist/src/ser-des/config/ref.js +115 -0
  44. package/dist/src/ser-des/config/ref.js.map +1 -1
  45. package/dist/src/ser-des/config/referenceMaterial.d.ts.map +1 -1
  46. package/dist/src/ser-des/config/referenceMaterial.js +43 -19
  47. package/dist/src/ser-des/config/referenceMaterial.js.map +1 -1
  48. package/dist/src/ser-des/config/requirement.d.ts.map +1 -1
  49. package/dist/src/ser-des/config/requirement.js +9 -13
  50. package/dist/src/ser-des/config/requirement.js.map +1 -1
  51. package/dist/src/ser-des/config/subject.d.ts.map +1 -1
  52. package/dist/src/ser-des/config/subject.js +160 -21
  53. package/dist/src/ser-des/config/subject.js.map +1 -1
  54. package/dist/src/ser-des/config/symbol.d.ts.map +1 -1
  55. package/dist/src/ser-des/config/symbol.js +10 -1
  56. package/dist/src/ser-des/config/symbol.js.map +1 -1
  57. package/dist/src/ser-des/config/table.d.ts.map +1 -1
  58. package/dist/src/ser-des/config/table.js +10 -8
  59. package/dist/src/ser-des/config/table.js.map +1 -1
  60. package/dist/src/ser-des/config/term.d.ts.map +1 -1
  61. package/dist/src/ser-des/config/term.js +18 -1
  62. package/dist/src/ser-des/config/term.js.map +1 -1
  63. package/dist/src/ser-des/config/testPointSet.d.ts.map +1 -1
  64. package/dist/src/ser-des/config/testPointSet.js +24 -13
  65. package/dist/src/ser-des/config/testPointSet.js.map +1 -1
  66. package/dist/src/ser-des/config/testSequence.d.ts.map +1 -1
  67. package/dist/src/ser-des/config/testSequence.js +19 -7
  68. package/dist/src/ser-des/config/testSequence.js.map +1 -1
  69. package/dist/src/ser-des/config/verdict.d.ts.map +1 -1
  70. package/dist/src/ser-des/config/verdict.js +24 -13
  71. package/dist/src/ser-des/config/verdict.js.map +1 -1
  72. package/dist/src/ser-des/parse-block.d.ts +16 -5
  73. package/dist/src/ser-des/parse-block.d.ts.map +1 -1
  74. package/dist/src/ser-des/parse-block.js +45 -6
  75. package/dist/src/ser-des/parse-block.js.map +1 -1
  76. package/dist/src/types/Artifact.d.ts +6 -0
  77. package/dist/src/types/Artifact.d.ts.map +1 -1
  78. package/dist/src/types/Calculation.d.ts +2 -0
  79. package/dist/src/types/Calculation.d.ts.map +1 -1
  80. package/dist/src/types/CompetenceKind.d.ts +3 -0
  81. package/dist/src/types/CompetenceKind.d.ts.map +1 -1
  82. package/dist/src/types/Constraint.d.ts +3 -0
  83. package/dist/src/types/Constraint.d.ts.map +1 -1
  84. package/dist/src/types/Form.d.ts +3 -0
  85. package/dist/src/types/Form.d.ts.map +1 -1
  86. package/dist/src/types/FormulasUsed.d.ts +2 -0
  87. package/dist/src/types/FormulasUsed.d.ts.map +1 -1
  88. package/dist/src/types/Invariant.d.ts +1 -0
  89. package/dist/src/types/Invariant.d.ts.map +1 -1
  90. package/dist/src/types/ReferenceMaterial.d.ts +7 -0
  91. package/dist/src/types/ReferenceMaterial.d.ts.map +1 -1
  92. package/dist/src/types/Subject.d.ts +22 -0
  93. package/dist/src/types/Subject.d.ts.map +1 -1
  94. package/dist/src/types/Symbol.d.ts +4 -0
  95. package/dist/src/types/Symbol.d.ts.map +1 -1
  96. package/dist/src/types/Table.d.ts +4 -0
  97. package/dist/src/types/Table.d.ts.map +1 -1
  98. package/dist/src/types/Term.d.ts +2 -0
  99. package/dist/src/types/Term.d.ts.map +1 -1
  100. package/dist/src/types/TestPointSet.d.ts +4 -0
  101. package/dist/src/types/TestPointSet.d.ts.map +1 -1
  102. package/dist/src/types/TestSequence.d.ts +2 -0
  103. package/dist/src/types/TestSequence.d.ts.map +1 -1
  104. package/dist/src/types/Verdict.d.ts +4 -0
  105. package/dist/src/types/Verdict.d.ts.map +1 -1
  106. package/dist/src/types/process.d.ts +3 -0
  107. package/dist/src/types/process.d.ts.map +1 -1
  108. package/dist/src/validate.js +9 -1
  109. package/dist/src/validate.js.map +1 -1
  110. package/dist-browser/index.mjs +1587 -1348
  111. package/dist-cli/primmel.mjs +566 -124
  112. package/package.json +1 -1
@@ -104,7 +104,9 @@ exports.subjectConstruct = exports.conditionSetConstruct = exports.behaviorConst
104
104
  exports.resolveSubject = resolveSubject;
105
105
  const tokenize_1 = require("../tokenize");
106
106
  const tokenize_2 = require("../tokenize");
107
+ const parse_block_1 = require("../parse-block");
107
108
  const field_parser_1 = require("./field-parser");
109
+ const ref_1 = require("./ref");
108
110
  const field_parser_2 = require("./field-parser");
109
111
  const twin_1 = require("./twin");
110
112
  const composition_1 = require("./composition");
@@ -153,6 +155,10 @@ const parseInstrument = function (id, data) {
153
155
  measurand: null,
154
156
  components: [],
155
157
  structure: [],
158
+ // Initialized so the ref fold (docs/primmel/18 §18.4) mirrors the
159
+ // first derives-from block here — the fold only mirrors slots the
160
+ // object already carries.
161
+ source: null,
156
162
  };
157
163
  const t = (0, tokenize_2.tokenizePackage)(data);
158
164
  let i = 0;
@@ -183,7 +189,12 @@ const parseInstrument = function (id, data) {
183
189
  result.note = (0, tokenize_2.stripWrapping)(t[i++]);
184
190
  }
185
191
  else if (cmd === 'source') {
186
- result.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
192
+ // Repeated provenance blocks accumulate; `source` stays the first.
193
+ const src = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
194
+ (result.sourceRefs ??= []).push(src);
195
+ if (!result.source) {
196
+ result.source = src;
197
+ }
187
198
  }
188
199
  else if (cmd === 'variant') {
189
200
  const variantId = (0, tokenize_2.stripWrapping)(t[i++]);
@@ -245,6 +256,18 @@ const parseInstrument = function (id, data) {
245
256
  else if (fc === 'source') {
246
257
  result.familySource = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(ft[j++]));
247
258
  }
259
+ else if (fc === 'ref') {
260
+ // The unified typed reference (docs/primmel/18) — the family
261
+ // block's provenance folds onto familySource.
262
+ const rr = (0, ref_1.parseRef)(ft, j, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
263
+ j = rr.next;
264
+ if (rr.ref.predicate === 'derives-from') {
265
+ const b = (0, ref_1.refTargetToSourceRef)(rr.ref.target);
266
+ if (b && !result.familySource) {
267
+ result.familySource = b;
268
+ }
269
+ }
270
+ }
248
271
  else {
249
272
  (0, tokenize_2.unwrapBlock)(ft[j++]);
250
273
  }
@@ -276,8 +299,16 @@ const parseInstrument = function (id, data) {
276
299
  else if (cmd === 'reference') {
277
300
  result.referenceIds = readReference(t[i++]);
278
301
  }
302
+ else if (cmd === 'ref') {
303
+ // The unified typed reference (docs/primmel/18).
304
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
305
+ if (!(0, ref_1.foldRefIntoLegacy)(result, rr.ref)) {
306
+ (result.refs ??= []).push(rr.ref);
307
+ }
308
+ i = rr.next;
309
+ }
279
310
  else {
280
- (0, tokenize_2.unwrapBlock)(t[i++]);
311
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
281
312
  }
282
313
  }
283
314
  return ctx => {
@@ -331,7 +362,7 @@ function parseMeasurand(block) {
331
362
  m.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
332
363
  }
333
364
  else {
334
- (0, tokenize_2.unwrapBlock)(t[i++]);
365
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
335
366
  }
336
367
  }
337
368
  return m;
@@ -361,7 +392,7 @@ function parseComponent(id, block) {
361
392
  c.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
362
393
  }
363
394
  else {
364
- (0, tokenize_2.unwrapBlock)(t[i++]);
395
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
365
396
  }
366
397
  }
367
398
  return c;
@@ -416,7 +447,7 @@ function parseStructure(id, block) {
416
447
  s.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
417
448
  }
418
449
  else {
419
- (0, tokenize_2.unwrapBlock)(t[i++]);
450
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
420
451
  }
421
452
  }
422
453
  return s;
@@ -465,7 +496,7 @@ function parseDimension(id, block) {
465
496
  dim.values = parseDimensionValues((0, tokenize_2.unwrapBlock)(t[i++]));
466
497
  }
467
498
  else {
468
- (0, tokenize_2.unwrapBlock)(t[i++]);
499
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
469
500
  }
470
501
  }
471
502
  return dim;
@@ -585,11 +616,23 @@ function parseModelGroup(block) {
585
616
  else if (cmd === 'source') {
586
617
  mg.sources.push((0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++])));
587
618
  }
619
+ else if (cmd === 'ref') {
620
+ // The unified typed reference (docs/primmel/18) — a model_group
621
+ // provenance line folds onto the sources list.
622
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
623
+ i = rr.next;
624
+ if (rr.ref.predicate === 'derives-from') {
625
+ const b = (0, ref_1.refTargetToSourceRef)(rr.ref.target);
626
+ if (b) {
627
+ mg.sources.push(b);
628
+ }
629
+ }
630
+ }
588
631
  else if (cmd === 'sample_selection') {
589
632
  mg.sampleSelection.push((0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++])));
590
633
  }
591
634
  else {
592
- (0, tokenize_2.unwrapBlock)(t[i++]);
635
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
593
636
  }
594
637
  }
595
638
  return mg;
@@ -782,7 +825,11 @@ const dumpInstrument = function (inst) {
782
825
  if (inst.familyNote) {
783
826
  out += ' note "' + (0, tokenize_2.escapeString)(inst.familyNote) + '"\n';
784
827
  }
785
- out += dumpSource('source', inst.familySource ?? null, ' ');
828
+ if (inst.familySource &&
829
+ (inst.familySource.doc || inst.familySource.clause)) {
830
+ // The canonical provenance spelling (docs/primmel/18 §18.4).
831
+ out += (0, ref_1.dumpSourceRefAsRef)(inst.familySource, ' ', tokenize_2.escapeString);
832
+ }
786
833
  out += ' }\n';
787
834
  }
788
835
  if (inst.familyCriteria.length > 0) {
@@ -814,14 +861,24 @@ const dumpInstrument = function (inst) {
814
861
  out += dumpIdList('identical_characteristics', inst.modelGroup.identicalCharacteristics, ' ');
815
862
  out += dumpIdList('identical_attributes', inst.modelGroup.identicalAttributes, ' ');
816
863
  for (const s of inst.modelGroup.sources ?? []) {
817
- out += dumpSource('source', s, ' ');
864
+ // The canonical provenance spelling (docs/primmel/18 §18.4).
865
+ out += (0, ref_1.dumpSourceRefAsRef)(s, ' ', tokenize_2.escapeString);
818
866
  }
819
867
  for (const s of inst.modelGroup.sampleSelection ?? []) {
820
868
  out += dumpSource('sample_selection', s, ' ');
821
869
  }
822
870
  out += ' }\n';
823
871
  }
824
- out += dumpSource('source', inst.source ?? null, ' ');
872
+ const instSources = inst.sourceRefs && inst.sourceRefs.length > 0
873
+ ? inst.sourceRefs
874
+ : inst.source
875
+ ? [inst.source]
876
+ : [];
877
+ for (const s of instSources) {
878
+ // The canonical provenance spelling (docs/primmel/18 §18.4).
879
+ out += (0, ref_1.dumpSourceRefAsRef)(s, ' ', tokenize_2.escapeString);
880
+ }
881
+ out += (0, ref_1.dumpRefs)(inst.refs, ' ', tokenize_2.escapeString);
825
882
  out += dumpIdList('reference', inst.referenceIds, ' ');
826
883
  out += '}\n';
827
884
  return out;
@@ -863,7 +920,13 @@ const parseAttributeDefinition = function (id, data) {
863
920
  result.definition = (0, tokenize_2.stripWrapping)(t[i++]);
864
921
  }
865
922
  else if (cmd === 'source' || cmd === 'reference') {
866
- result.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
923
+ // Repeated provenance blocks accumulate; `source` stays the first
924
+ // entry (the requirement family's idiom, TODO.roadmap/24).
925
+ const src = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
926
+ (result.sourceRefs ??= []).push(src);
927
+ if (!result.source) {
928
+ result.source = src;
929
+ }
867
930
  }
868
931
  else if (cmd === 'quantity_kind') {
869
932
  result.quantityKind = (0, tokenize_2.stripWrapping)(t[i++]);
@@ -901,8 +964,16 @@ const parseAttributeDefinition = function (id, data) {
901
964
  else if (cmd === 'derived') {
902
965
  result.derived = (0, tokenize_2.stripWrapping)(t[i++]);
903
966
  }
967
+ else if (cmd === 'ref') {
968
+ // The unified typed reference (docs/primmel/18).
969
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
970
+ if (!(0, ref_1.foldRefIntoLegacy)(result, rr.ref)) {
971
+ (result.refs ??= []).push(rr.ref);
972
+ }
973
+ i = rr.next;
974
+ }
904
975
  else {
905
- (0, tokenize_2.unwrapBlock)(t[i++]);
976
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
906
977
  }
907
978
  }
908
979
  return ctx => {
@@ -921,7 +992,16 @@ const dumpAttributeDefinition = function (a) {
921
992
  if (a.definition) {
922
993
  out += ' definition "' + (0, tokenize_2.escapeString)(a.definition) + '"\n';
923
994
  }
924
- out += dumpSource('source', a.source, ' ');
995
+ const attrSources = a.sourceRefs && a.sourceRefs.length > 0
996
+ ? a.sourceRefs
997
+ : a.source
998
+ ? [a.source]
999
+ : [];
1000
+ for (const s of attrSources) {
1001
+ // The canonical provenance spelling (docs/primmel/18 §18.4).
1002
+ out += (0, ref_1.dumpSourceRefAsRef)(s, ' ', tokenize_2.escapeString);
1003
+ }
1004
+ out += (0, ref_1.dumpRefs)(a.refs, ' ', tokenize_2.escapeString);
925
1005
  if (a.quantityKind) {
926
1006
  out += ' quantity_kind ' + a.quantityKind + '\n';
927
1007
  }
@@ -1003,8 +1083,16 @@ const parseCapability = function (id, data) {
1003
1083
  else if (cmd === 'reference') {
1004
1084
  result.referenceIds = readReference(t[i++]);
1005
1085
  }
1086
+ else if (cmd === 'ref') {
1087
+ // The unified typed reference (docs/primmel/18).
1088
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
1089
+ if (!(0, ref_1.foldRefIntoLegacy)(result, rr.ref)) {
1090
+ (result.refs ??= []).push(rr.ref);
1091
+ }
1092
+ i = rr.next;
1093
+ }
1006
1094
  else {
1007
- (0, tokenize_2.unwrapBlock)(t[i++]);
1095
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
1008
1096
  }
1009
1097
  }
1010
1098
  return ctx => {
@@ -1029,6 +1117,7 @@ const dumpCapability = function (c) {
1029
1117
  out += dumpIdList('satisfies_requirements', c.satisfiesRequirements, ' ');
1030
1118
  out += dumpIdList('verified_by_tests', c.verifiedByTests, ' ');
1031
1119
  out += dumpIdList('reference', c.referenceIds, ' ');
1120
+ out += (0, ref_1.dumpRefs)(c.refs, ' ', tokenize_2.escapeString);
1032
1121
  out += '}\n';
1033
1122
  return out;
1034
1123
  };
@@ -1060,13 +1149,26 @@ const parseBehavior = function (id, data) {
1060
1149
  result.response = (0, tokenize_2.stripWrapping)(t[i++]);
1061
1150
  }
1062
1151
  else if (cmd === 'source' || cmd === 'reference') {
1063
- result.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
1152
+ // Repeated provenance blocks accumulate; `source` stays the first.
1153
+ const src = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
1154
+ (result.sourceRefs ??= []).push(src);
1155
+ if (!result.source) {
1156
+ result.source = src;
1157
+ }
1064
1158
  }
1065
1159
  else if (cmd === 'verified_by' || cmd === 'verified_by_tests') {
1066
1160
  result.verifiedBy = readReference(t[i++]);
1067
1161
  }
1162
+ else if (cmd === 'ref') {
1163
+ // The unified typed reference (docs/primmel/18).
1164
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
1165
+ if (!(0, ref_1.foldRefIntoLegacy)(result, rr.ref)) {
1166
+ (result.refs ??= []).push(rr.ref);
1167
+ }
1168
+ i = rr.next;
1169
+ }
1068
1170
  else {
1069
- (0, tokenize_2.unwrapBlock)(t[i++]);
1171
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
1070
1172
  }
1071
1173
  }
1072
1174
  return ctx => {
@@ -1085,7 +1187,16 @@ const dumpBehavior = function (b) {
1085
1187
  if (b.response) {
1086
1188
  out += ' response "' + (0, tokenize_2.escapeString)(b.response) + '"\n';
1087
1189
  }
1088
- out += dumpSource('source', b.source, ' ');
1190
+ const behaviorSources = b.sourceRefs && b.sourceRefs.length > 0
1191
+ ? b.sourceRefs
1192
+ : b.source
1193
+ ? [b.source]
1194
+ : [];
1195
+ for (const s of behaviorSources) {
1196
+ // The canonical provenance spelling (docs/primmel/18 §18.4).
1197
+ out += (0, ref_1.dumpSourceRefAsRef)(s, ' ', tokenize_2.escapeString);
1198
+ }
1199
+ out += (0, ref_1.dumpRefs)(b.refs, ' ', tokenize_2.escapeString);
1089
1200
  out += dumpIdList('verified_by', b.verifiedBy, ' ');
1090
1201
  out += '}\n';
1091
1202
  return out;
@@ -1127,11 +1238,36 @@ const parseConditionSet = function (id, data) {
1127
1238
  result.source = src;
1128
1239
  }
1129
1240
  }
1241
+ else if (cmd === 'ref') {
1242
+ // The unified typed reference (docs/primmel/18): derives-from folds
1243
+ // onto the source/sources provenance channel, cites onto
1244
+ // referenceIds, the rest stay as refs.
1245
+ const rr = (0, ref_1.parseRef)(t, i, tokenize_2.stripWrapping, tokenize_2.unwrapBlock);
1246
+ i = rr.next;
1247
+ if (rr.ref.predicate === 'derives-from') {
1248
+ const b = (0, ref_1.refTargetToSourceRef)(rr.ref.target);
1249
+ if (b) {
1250
+ result.sources.push(b);
1251
+ if (!result.source) {
1252
+ result.source = b;
1253
+ }
1254
+ }
1255
+ else {
1256
+ (result.refs ??= []).push(rr.ref);
1257
+ }
1258
+ }
1259
+ else if (rr.ref.predicate === 'cites') {
1260
+ result.referenceIds.push(rr.ref.target);
1261
+ }
1262
+ else {
1263
+ (result.refs ??= []).push(rr.ref);
1264
+ }
1265
+ }
1130
1266
  else if (cmd === 'reference') {
1131
1267
  result.referenceIds = readReference(t[i++]);
1132
1268
  }
1133
1269
  else {
1134
- (0, tokenize_2.unwrapBlock)(t[i++]);
1270
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
1135
1271
  }
1136
1272
  }
1137
1273
  return ctx => {
@@ -1220,9 +1356,12 @@ const dumpConditionSet = function (cs) {
1220
1356
  ? [cs.source]
1221
1357
  : [];
1222
1358
  for (const s of sources) {
1223
- out += dumpSource('source', s, ' ');
1359
+ // The canonical provenance spelling (docs/primmel/18 §18.4): a
1360
+ // URN-anchored block dumps as a derives-from ref line.
1361
+ out += (0, ref_1.dumpSourceRefAsRef)(s, ' ', tokenize_2.escapeString);
1224
1362
  }
1225
1363
  out += dumpIdList('reference', cs.referenceIds, ' ');
1364
+ out += (0, ref_1.dumpRefs)(cs.refs, ' ', tokenize_2.escapeString);
1226
1365
  out += '}\n';
1227
1366
  return out;
1228
1367
  };
@@ -1397,7 +1536,7 @@ function readCharacteristicBlock(block) {
1397
1536
  c.source = (0, field_parser_1.readSource)((0, tokenize_2.unwrapBlock)(t[i++]));
1398
1537
  }
1399
1538
  else {
1400
- (0, tokenize_2.unwrapBlock)(t[i++]);
1539
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
1401
1540
  }
1402
1541
  }
1403
1542
  return c;
@@ -1741,7 +1880,7 @@ const parseSubject = function (id, data) {
1741
1880
  result.referenceIds = readReference(t[i++]);
1742
1881
  }
1743
1882
  else {
1744
- (0, tokenize_2.unwrapBlock)(t[i++]);
1883
+ i = (0, parse_block_1.skipUnknownValue)(t, i, cmd);
1745
1884
  }
1746
1885
  }
1747
1886
  return ctx => {