keepset 0.37.0 → 0.38.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/README.md CHANGED
@@ -63,7 +63,7 @@ The catalogue itself is a manifest (`catalogue/manifest.json`: id, version, repo
63
63
 
64
64
  ## Categories and normalisation targets
65
65
 
66
- A category names a normalisation target: the shape every entry in that category resolves to, whatever its native shape. `graph/v1` is `{ meta, nodes, edges }` with unique node ids and edges whose endpoints name nodes; its entries are graph datasets taken from upstream collections such as SuiteSparse, Netzschleuder, SNAP, KONECT and OGB, read by one parser per format (delimited edge lists, Matrix Market, GML, Pajek, UCINet DL full matrices, Graph Drawing contest files, KONECT edge files, rating and count files, knowledge graph triples and Heterogeneous Graph Benchmark node and link files), each giving the graph's topology and, where the format states them, node and edge types, weights, times and the split each edge belongs to. `tasks/v1` is `{ meta, nodes }`, a set of tasks as the places or cases it offers to visit or serve (a routing benchmark, or an open data register of permits and complaints), each flat with optional coordinates, prize, prize probability, duration, travel time, skill, territory, lifecycle status and times, and deadline, read from tabular sources by the `csv-table` parser (a delimited file, a member of an archive, a sheet of an Excel workbook, or an open data portal read a page at a time) and from ArcGIS feature layers by the `geojson` parser. Its entries come from a survey of open operations-research datasets, imported with a curation that records, for each source, what its download gives and how its columns map onto the node; a dataset whose source has no usable table is imported without a recipe and says why. Any category can be fetched as a collection: a recipe that selects every matching archive member with `members` (by path, by the extensions its name ends with, or by a regular expression its whole path matches) resolves to `{ meta, instances }`, where each instance is a document of the entry's category under the path of the member it came from, the schema derived from the category's own, so a category needs nothing of its own to be collected. The parser reads each member, the crosswalk is applied to each, and a member that does not parse or does not validate fails the fetch and is named. Instance files are read by one parser per format (Solomon and TOPTW time window files, Chao team orienteering files, TSPLIB style orienteering files, VRP-REP XML, VeRoLog 2019 files and customer point lists), which gives each node the columns the file has and each instance a header of its own; a curation says which of them fill the `tasks/v1` node's fields, which pass through under their own names and which are dropped, so what an entry leaves out is written down, and a source whose time quantities are not seconds keeps them under the source's names with the unit recorded as the entry's `timeUnit`. A new category starts by defining its target schema in `src/targets/` and registering it in the category registry; an entry cannot name a category that does not exist. The statically generated site renders every entry with schema.org Dataset JSON-LD, so the catalogue surfaces in the dataset discovery layers.
66
+ A category names a normalisation target: the shape every entry in that category resolves to, whatever its native shape. `graph/v1` is `{ meta, nodes, edges }` with unique node ids and edges whose endpoints name nodes; its entries are graph datasets taken from upstream collections such as SuiteSparse, Netzschleuder, SNAP, KONECT and OGB, read by one parser per format (delimited edge lists, which can also be a sheet of a spreadsheet, Matrix Market, GML, Pajek, UCINet DL full matrices, Graph Drawing contest files, Witvliet connectome synapse files, KONECT edge files, rating and count files, knowledge graph triples and Heterogeneous Graph Benchmark node and link files), each giving the graph's topology and, where the format states them, node and edge types, weights, times and the split each edge belongs to. `tasks/v1` is `{ meta, nodes }`, a set of tasks as the places or cases it offers to visit or serve (a routing benchmark, or an open data register of permits and complaints), each flat with optional coordinates, prize, prize probability, duration, travel time, skill, territory, lifecycle status and times, and deadline, read from tabular sources by the `csv-table` parser (a delimited file, a member of an archive, a sheet of an Excel workbook, a legacy binary xls workbook or an OpenDocument spreadsheet, or an open data portal read a page at a time) and from ArcGIS feature layers by the `geojson` parser. Its entries come from a survey of open operations-research datasets, imported with a curation that records, for each source, what its download gives and how its columns map onto the node; a dataset whose source has no usable table is imported without a recipe and says why. Any category can be fetched as a collection: a recipe that selects every matching archive member with `members` (by path, by the extensions its name ends with, or by a regular expression its whole path matches) resolves to `{ meta, instances }`, where each instance is a document of the entry's category under the path of the member it came from, the schema derived from the category's own, so a category needs nothing of its own to be collected. The parser reads each member, the crosswalk is applied to each, and a member that does not parse or does not validate fails the fetch and is named. Instance files are read by one parser per format (Solomon and TOPTW time window files, Chao team orienteering files, TSPLIB style orienteering files, VRP-REP XML, VeRoLog 2019 files and customer point lists), which gives each node the columns the file has and each instance a header of its own; a curation says which of them fill the `tasks/v1` node's fields, which pass through under their own names and which are dropped, so what an entry leaves out is written down, and a source whose time quantities are not seconds keeps them under the source's names with the unit recorded as the entry's `timeUnit`. A new category starts by defining its target schema in `src/targets/` and registering it in the category registry; an entry cannot name a category that does not exist. The statically generated site renders every entry with schema.org Dataset JSON-LD, so the catalogue surfaces in the dataset discovery layers.
67
67
 
68
68
  ## Licensing
69
69
 
@@ -523,11 +523,24 @@ const CollectionArchiveSchema = z.object({
523
523
  sheets: MemberPatternSchema.optional()
524
524
  }).strict().optional()
525
525
  }).strict();
526
- /** How a member that is itself an archive unpacks into the file the parser reads: gunzipped, or one member of it selected. It nests one level, which is as deep as any source in the catalogue goes. */
527
- const InnerArchiveSchema = z.union([z.object({ kind: z.literal("gzip") }).strict(), z.object({
528
- kind: FileArchiveKindSchema,
529
- member: ArchiveMemberSchema
530
- }).strict()]);
526
+ /** A spreadsheet read as the CSV of one of its sheets (the sheet's name, as the workbook gives it): an Excel workbook (`xlsx`), a legacy binary Excel 97 to 2003 workbook (`xls`, BIFF8) or an OpenDocument spreadsheet (`ods`, whose sheets are its tables). The three give the same text for the same cells. */
527
+ const SheetArchiveSchema = z.object({
528
+ kind: z.enum([
529
+ "xlsx",
530
+ "xls",
531
+ "ods"
532
+ ]),
533
+ sheet: z.string().min(1)
534
+ }).strict();
535
+ /** How a member that is itself an archive unpacks into the file the parser reads: gunzipped, one member of it selected, or one sheet of it read when it is a spreadsheet. It nests one level, which is as deep as any source in the catalogue goes. */
536
+ const InnerArchiveSchema = z.union([
537
+ z.object({ kind: z.literal("gzip") }).strict(),
538
+ z.object({
539
+ kind: FileArchiveKindSchema,
540
+ member: ArchiveMemberSchema
541
+ }).strict(),
542
+ SheetArchiveSchema
543
+ ]);
531
544
  /** The name of a part of a document read from several files, which the parser gives its meaning: the split a triples file holds (`train`, `valid`, `test`), or which of an HGB dataset's files it is (`nodes`, `links`). */
532
545
  const PartNameSchema = z.string().regex(/^[a-z][a-z0-9]*$/, { message: "must be a lowercase name of letters and digits, such as train" });
533
546
  /** An archive one document is read from several files of: each part names the one member it is read from, and the parser reads the parts together in the order given. */
@@ -538,7 +551,7 @@ const PartsArchiveSchema = z.object({
538
551
  member: ArchiveMemberSchema
539
552
  }).strict()).min(1).refine((parts) => new Set(parts.map((part) => part.name)).size === parts.length, { message: "each part must have its own name" })
540
553
  }).strict();
541
- /** How the downloaded bytes unpack into the file the parser reads, the named files a parser reads together into one document (`parts`), or for a collection the files it reads one by one. A `members` selector gives every member it matches, at least one, in path order. `gzip` and `bzip2` are one compressed file, and `tar.gz` and `tar.bz2` a tar archive compressed with them. A member that is an archive in its turn (a contest bundle that ships its problems as a zip inside the zip) is unpacked by `inner`. A workbook (`xlsx`) is read as the CSV of its named sheet, with dates as ISO 8601 text, for the `csv-table` parser. A point shapefile (`shapefile`) is a zip whose `member` selects the `.shp`, read with the `.dbf`, `.prj` and `.cpg` of the same name beside it as the CSV of its attribute table with each point's stored coordinates and its WGS84 position, for the `csv-table` parser. */
554
+ /** How the downloaded bytes unpack into the file the parser reads, the named files a parser reads together into one document (`parts`), or for a collection the files it reads one by one. A `members` selector gives every member it matches, at least one, in path order. `gzip` and `bzip2` are one compressed file, and `tar.gz` and `tar.bz2` a tar archive compressed with them. A member that is an archive in its turn (a contest bundle that ships its problems as a zip inside the zip, a spreadsheet inside a zip) is unpacked by `inner`. A spreadsheet (`xlsx`, `xls` or `ods`) is read as the CSV of its named sheet, with dates as ISO 8601 text, for the `csv-table` or `edge-list` parser. A point shapefile (`shapefile`) is a zip whose `member` selects the `.shp`, read with the `.dbf`, `.prj` and `.cpg` of the same name beside it as the CSV of its attribute table with each point's stored coordinates and its WGS84 position, for the `csv-table` parser. */
542
555
  const ArchiveSchema = z.union([
543
556
  z.object({ kind: z.literal("none") }).strict(),
544
557
  z.object({ kind: z.literal("gzip") }).strict(),
@@ -550,10 +563,7 @@ const ArchiveSchema = z.union([
550
563
  }).strict(),
551
564
  CollectionArchiveSchema,
552
565
  PartsArchiveSchema,
553
- z.object({
554
- kind: z.literal("xlsx"),
555
- sheet: z.string().min(1)
556
- }).strict(),
566
+ SheetArchiveSchema,
557
567
  z.object({
558
568
  kind: z.literal("shapefile"),
559
569
  member: ArchiveMemberSchema
@@ -579,10 +589,22 @@ const ParserSchema = z.discriminatedUnion("format", [
579
589
  skipLines: z.int().min(0),
580
590
  commentPrefixes: z.array(z.string().min(1)),
581
591
  sourceColumn: ColumnSchema,
582
- targetColumn: ColumnSchema
592
+ targetColumn: ColumnSchema,
593
+ /** Keep only the lines whose `column` holds one of `values`, so a table that lists several relations side by side (a connectome's synapse types) gives the graph of the ones named. */
594
+ keep: z.object({
595
+ column: ColumnSchema,
596
+ values: z.array(z.string().min(1)).min(1)
597
+ }).strict().optional(),
598
+ /** The column holding how many edges a line stands for, a whole number, for a table that lists each pair once with its count; a line that stands for none adds neither an edge nor a node. */
599
+ multiplicityColumn: ColumnSchema.optional(),
600
+ /** The table lists every undirected edge twice, once in each direction and with the same multiplicity: each pair's edges are emitted once, in the direction it is first listed, a self-loop's once, and a line whose mirror is missing is an error. graph/v1 records direction in `meta` and never by duplicating edges, so an undirected graph read from such a table needs this. */
601
+ mirrored: z.literal(true).optional()
583
602
  }).strict().refine((parser) => parser.sourceColumn !== parser.targetColumn, {
584
603
  message: "sourceColumn and targetColumn must differ",
585
604
  path: ["targetColumn"]
605
+ }).refine((parser) => [parser.keep?.column, parser.multiplicityColumn].every((column) => column === void 0 || column !== parser.sourceColumn && column !== parser.targetColumn), {
606
+ message: "the keep and multiplicity columns must not be an endpoint column",
607
+ path: ["keep"]
586
608
  }),
587
609
  z.object({
588
610
  format: z.literal("matrix-market"),
@@ -674,6 +696,10 @@ const ParserSchema = z.discriminatedUnion("format", [
674
696
  format: z.literal("gd-contest"),
675
697
  encoding: EncodingSchema
676
698
  }).strict(),
699
+ z.object({
700
+ format: z.literal("witvliet-synapses"),
701
+ encoding: z.literal("utf-8")
702
+ }).strict(),
677
703
  z.object({
678
704
  format: z.literal("customer-points"),
679
705
  encoding: EncodingSchema
@@ -1180,7 +1206,7 @@ var catalogue_default = {
1180
1206
  "id": "keepset",
1181
1207
  "name": "keepset",
1182
1208
  "description": "The keepset catalogue: datasets with machine-readable recipes that fetch each one and normalise it into its category's target shape.",
1183
- "version": "1.28.0",
1209
+ "version": "1.29.0",
1184
1210
  "repository": "https://github.com/Mearman/keepset",
1185
1211
  "namespaceAliases": {
1186
1212
  "networkrepository": ["nr"],
@@ -6451,6 +6477,10 @@ var catalogue_default = {
6451
6477
  "url": "https://environment.data.gov.uk/dataset/88bed270-d465-11e4-8669-f0def148f590",
6452
6478
  "retrieved": "2026-10-19",
6453
6479
  "status": "live"
6480
+ }, {
6481
+ "url": "https://environment.data.gov.uk/api/file/download?fileDataSetId=766cb094-b392-4bd6-a02e-f60e143f3213&fileName=Historic_Flood_Warnings.zip",
6482
+ "retrieved": "2026-10-19",
6483
+ "status": "live"
6454
6484
  }],
6455
6485
  "licence": {
6456
6486
  "kind": "spdx",
@@ -6458,10 +6488,62 @@ var catalogue_default = {
6458
6488
  },
6459
6489
  "citations": [],
6460
6490
  "recipe": {
6461
- "status": "not-fetchable",
6462
- "reason": "The download is a zip holding one OpenDocument spreadsheet whose member name changes every quarter, and keepset reads xlsx and not ods."
6491
+ "status": "fetchable",
6492
+ "source": 1,
6493
+ "archive": {
6494
+ "kind": "zip",
6495
+ "member": { "extensions": [".ods"] },
6496
+ "inner": {
6497
+ "kind": "ods",
6498
+ "sheet": "tblAllData"
6499
+ }
6500
+ },
6501
+ "parser": {
6502
+ "format": "csv-table",
6503
+ "encoding": "utf-8",
6504
+ "delimiter": "comma",
6505
+ "skipLines": 0,
6506
+ "idColumn": null,
6507
+ "numericColumns": [],
6508
+ "columns": [
6509
+ "DATE",
6510
+ "TYPE",
6511
+ "AREA"
6512
+ ]
6513
+ }
6514
+ },
6515
+ "crosswalk": {
6516
+ "source": "csv-table",
6517
+ "target": "tasks/v1",
6518
+ "rules": [
6519
+ {
6520
+ "op": "move",
6521
+ "from": "meta",
6522
+ "to": "meta"
6523
+ },
6524
+ {
6525
+ "op": "move",
6526
+ "from": "nodes[].id",
6527
+ "to": "nodes[].id"
6528
+ },
6529
+ {
6530
+ "op": "move",
6531
+ "from": "nodes[].DATE",
6532
+ "to": "nodes[].opened"
6533
+ },
6534
+ {
6535
+ "op": "move",
6536
+ "from": "nodes[].TYPE",
6537
+ "to": "nodes[].status"
6538
+ },
6539
+ {
6540
+ "op": "move",
6541
+ "from": "nodes[].AREA",
6542
+ "to": "nodes[].territory"
6543
+ }
6544
+ ],
6545
+ "oneWay": []
6463
6546
  },
6464
- "crosswalk": { "file": "crosswalks/tasks-v1/nodes.json" },
6465
6547
  "expectedCounts": {},
6466
6548
  "properties": { "surveyId": "or-120" }
6467
6549
  },
@@ -8470,6 +8552,10 @@ var catalogue_default = {
8470
8552
  "url": "https://github.com/Oberfichtner/Clustering_and_TSP_with_R",
8471
8553
  "retrieved": "2026-10-19",
8472
8554
  "status": "live"
8555
+ }, {
8556
+ "url": "https://raw.githubusercontent.com/Oberfichtner/Clustering_and_TSP_with_R/main/rawdataclear.xls",
8557
+ "retrieved": "2026-10-19",
8558
+ "status": "live"
8473
8559
  }],
8474
8560
  "licence": { "kind": "unrecorded" },
8475
8561
  "citations": [{
@@ -8477,11 +8563,56 @@ var catalogue_default = {
8477
8563
  "doi": "10.1007/s10479-022-04883-1"
8478
8564
  }],
8479
8565
  "recipe": {
8480
- "status": "not-fetchable",
8481
- "reason": "The only data file is an old binary xls workbook, and keepset reads only xlsx."
8566
+ "status": "fetchable",
8567
+ "source": 1,
8568
+ "archive": {
8569
+ "kind": "xls",
8570
+ "sheet": "objects"
8571
+ },
8572
+ "parser": {
8573
+ "format": "csv-table",
8574
+ "encoding": "utf-8",
8575
+ "delimiter": "comma",
8576
+ "skipLines": 0,
8577
+ "idColumn": null,
8578
+ "numericColumns": [{
8579
+ "column": "LATITUDE",
8580
+ "factor": 1
8581
+ }, {
8582
+ "column": "LONGITUDE",
8583
+ "factor": 1
8584
+ }],
8585
+ "columns": ["LATITUDE", "LONGITUDE"]
8586
+ }
8482
8587
  },
8483
- "crosswalk": { "file": "crosswalks/tasks-v1/nodes.json" },
8484
- "expectedCounts": {},
8588
+ "crosswalk": {
8589
+ "source": "csv-table",
8590
+ "target": "tasks/v1",
8591
+ "rules": [
8592
+ {
8593
+ "op": "move",
8594
+ "from": "meta",
8595
+ "to": "meta"
8596
+ },
8597
+ {
8598
+ "op": "move",
8599
+ "from": "nodes[].id",
8600
+ "to": "nodes[].id"
8601
+ },
8602
+ {
8603
+ "op": "move",
8604
+ "from": "nodes[].LATITUDE",
8605
+ "to": "nodes[].lat"
8606
+ },
8607
+ {
8608
+ "op": "move",
8609
+ "from": "nodes[].LONGITUDE",
8610
+ "to": "nodes[].lon"
8611
+ }
8612
+ ],
8613
+ "oneWay": []
8614
+ },
8615
+ "expectedCounts": { "nodes": 237 },
8485
8616
  "properties": { "surveyId": "or-38" }
8486
8617
  },
8487
8618
  {
@@ -63378,18 +63509,39 @@ var catalogue_default = {
63378
63509
  "sources": [{
63379
63510
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63380
63511
  "retrieved": "2026-04-20",
63381
- "status": "live"
63512
+ "status": "dead",
63513
+ "snapshot": {
63514
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63515
+ "timestamp": "20260829213511"
63516
+ }
63382
63517
  }],
63383
63518
  "licence": { "kind": "unrecorded" },
63384
63519
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63385
63520
  "recipe": {
63386
- "status": "not-fetchable",
63387
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63521
+ "status": "fetchable",
63522
+ "source": 0,
63523
+ "archive": {
63524
+ "kind": "xls",
63525
+ "sheet": "NeuronConnect.csv"
63526
+ },
63527
+ "parser": {
63528
+ "format": "edge-list",
63529
+ "encoding": "utf-8",
63530
+ "delimiter": "comma",
63531
+ "skipLines": 1,
63532
+ "commentPrefixes": [],
63533
+ "sourceColumn": 0,
63534
+ "targetColumn": 1,
63535
+ "keep": {
63536
+ "column": 2,
63537
+ "values": ["S", "Sp"]
63538
+ }
63539
+ }
63388
63540
  },
63389
63541
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63390
63542
  "expectedCounts": {
63391
- "edges": 5233,
63392
- "nodes": 281
63543
+ "edges": 2575,
63544
+ "nodes": 279
63393
63545
  },
63394
63546
  "properties": {
63395
63547
  "directed": true,
@@ -63412,18 +63564,39 @@ var catalogue_default = {
63412
63564
  "sources": [{
63413
63565
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63414
63566
  "retrieved": "2026-04-20",
63415
- "status": "live"
63567
+ "status": "dead",
63568
+ "snapshot": {
63569
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63570
+ "timestamp": "20260829213511"
63571
+ }
63416
63572
  }],
63417
63573
  "licence": { "kind": "unrecorded" },
63418
63574
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63419
63575
  "recipe": {
63420
- "status": "not-fetchable",
63421
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63576
+ "status": "fetchable",
63577
+ "source": 0,
63578
+ "archive": {
63579
+ "kind": "xls",
63580
+ "sheet": "NeuronConnect.csv"
63581
+ },
63582
+ "parser": {
63583
+ "format": "edge-list",
63584
+ "encoding": "utf-8",
63585
+ "delimiter": "comma",
63586
+ "skipLines": 1,
63587
+ "commentPrefixes": [],
63588
+ "sourceColumn": 0,
63589
+ "targetColumn": 1,
63590
+ "keep": {
63591
+ "column": 2,
63592
+ "values": ["S", "Sp"]
63593
+ }
63594
+ }
63422
63595
  },
63423
63596
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63424
63597
  "expectedCounts": {
63425
- "edges": 5233,
63426
- "nodes": 281
63598
+ "edges": 2575,
63599
+ "nodes": 279
63427
63600
  },
63428
63601
  "properties": {
63429
63602
  "directed": false,
@@ -63446,18 +63619,39 @@ var catalogue_default = {
63446
63619
  "sources": [{
63447
63620
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63448
63621
  "retrieved": "2026-04-20",
63449
- "status": "live"
63622
+ "status": "dead",
63623
+ "snapshot": {
63624
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63625
+ "timestamp": "20260829213511"
63626
+ }
63450
63627
  }],
63451
63628
  "licence": { "kind": "unrecorded" },
63452
63629
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63453
63630
  "recipe": {
63454
- "status": "not-fetchable",
63455
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63631
+ "status": "fetchable",
63632
+ "source": 0,
63633
+ "archive": {
63634
+ "kind": "xls",
63635
+ "sheet": "NeuronConnect.csv"
63636
+ },
63637
+ "parser": {
63638
+ "format": "edge-list",
63639
+ "encoding": "utf-8",
63640
+ "delimiter": "comma",
63641
+ "skipLines": 1,
63642
+ "commentPrefixes": [],
63643
+ "sourceColumn": 0,
63644
+ "targetColumn": 1,
63645
+ "keep": {
63646
+ "column": 2,
63647
+ "values": ["S", "Sp"]
63648
+ }
63649
+ }
63456
63650
  },
63457
63651
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63458
63652
  "expectedCounts": {
63459
- "edges": 5233,
63460
- "nodes": 281
63653
+ "edges": 2575,
63654
+ "nodes": 279
63461
63655
  },
63462
63656
  "properties": {
63463
63657
  "directed": true,
@@ -63480,18 +63674,40 @@ var catalogue_default = {
63480
63674
  "sources": [{
63481
63675
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63482
63676
  "retrieved": "2026-04-20",
63483
- "status": "live"
63677
+ "status": "dead",
63678
+ "snapshot": {
63679
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63680
+ "timestamp": "20260829213511"
63681
+ }
63484
63682
  }],
63485
63683
  "licence": { "kind": "unrecorded" },
63486
63684
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63487
63685
  "recipe": {
63488
- "status": "not-fetchable",
63489
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63686
+ "status": "fetchable",
63687
+ "source": 0,
63688
+ "archive": {
63689
+ "kind": "xls",
63690
+ "sheet": "NeuronConnect.csv"
63691
+ },
63692
+ "parser": {
63693
+ "format": "edge-list",
63694
+ "encoding": "utf-8",
63695
+ "delimiter": "comma",
63696
+ "skipLines": 1,
63697
+ "commentPrefixes": [],
63698
+ "sourceColumn": 0,
63699
+ "targetColumn": 1,
63700
+ "keep": {
63701
+ "column": 2,
63702
+ "values": ["S", "Sp"]
63703
+ },
63704
+ "multiplicityColumn": 3
63705
+ }
63490
63706
  },
63491
63707
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63492
63708
  "expectedCounts": {
63493
- "edges": 5233,
63494
- "nodes": 281
63709
+ "edges": 6394,
63710
+ "nodes": 279
63495
63711
  },
63496
63712
  "properties": {
63497
63713
  "directed": true,
@@ -63514,18 +63730,44 @@ var catalogue_default = {
63514
63730
  "sources": [{
63515
63731
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63516
63732
  "retrieved": "2026-04-20",
63517
- "status": "live"
63733
+ "status": "dead",
63734
+ "snapshot": {
63735
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63736
+ "timestamp": "20260829213511"
63737
+ }
63518
63738
  }],
63519
63739
  "licence": { "kind": "unrecorded" },
63520
63740
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63521
63741
  "recipe": {
63522
- "status": "not-fetchable",
63523
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63742
+ "status": "fetchable",
63743
+ "source": 0,
63744
+ "archive": {
63745
+ "kind": "xls",
63746
+ "sheet": "NeuronConnect.csv"
63747
+ },
63748
+ "parser": {
63749
+ "format": "edge-list",
63750
+ "encoding": "utf-8",
63751
+ "delimiter": "comma",
63752
+ "skipLines": 1,
63753
+ "commentPrefixes": [],
63754
+ "sourceColumn": 0,
63755
+ "targetColumn": 1,
63756
+ "keep": {
63757
+ "column": 2,
63758
+ "values": [
63759
+ "S",
63760
+ "Sp",
63761
+ "EJ",
63762
+ "NMJ"
63763
+ ]
63764
+ }
63765
+ }
63524
63766
  },
63525
63767
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63526
63768
  "expectedCounts": {
63527
- "edges": 6417,
63528
- "nodes": 283
63769
+ "edges": 3759,
63770
+ "nodes": 281
63529
63771
  },
63530
63772
  "properties": {
63531
63773
  "directed": true,
@@ -63548,17 +63790,39 @@ var catalogue_default = {
63548
63790
  "sources": [{
63549
63791
  "url": "https://www.wormatlas.org/images/NeuronConnect.xls",
63550
63792
  "retrieved": "2026-04-20",
63551
- "status": "live"
63793
+ "status": "dead",
63794
+ "snapshot": {
63795
+ "url": "https://web.archive.org/web/20260829213511/https://www.wormatlas.org/images/NeuronConnect.xls",
63796
+ "timestamp": "20260829213511"
63797
+ }
63552
63798
  }],
63553
63799
  "licence": { "kind": "unrecorded" },
63554
63800
  "citations": [{ "text": "White, J. G., Southgate, E., Thomson, J. N., Brenner, S. (1986). The Structure of the Nervous System of the Nematode Caenorhabditis elegans. Phil. Trans. R. Soc. Lond. B 314, 1-340." }],
63555
63801
  "recipe": {
63556
- "status": "not-fetchable",
63557
- "reason": "no download is in a form keepset reads yet (xls: format xls has a pipeline-specific parser with no declarative keepset form yet)"
63802
+ "status": "fetchable",
63803
+ "source": 0,
63804
+ "archive": {
63805
+ "kind": "xls",
63806
+ "sheet": "NeuronConnect.csv"
63807
+ },
63808
+ "parser": {
63809
+ "format": "edge-list",
63810
+ "encoding": "utf-8",
63811
+ "delimiter": "comma",
63812
+ "skipLines": 1,
63813
+ "commentPrefixes": [],
63814
+ "sourceColumn": 0,
63815
+ "targetColumn": 1,
63816
+ "keep": {
63817
+ "column": 2,
63818
+ "values": ["EJ"]
63819
+ },
63820
+ "mirrored": true
63821
+ }
63558
63822
  },
63559
63823
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63560
63824
  "expectedCounts": {
63561
- "edges": 1031,
63825
+ "edges": 517,
63562
63826
  "nodes": 253
63563
63827
  },
63564
63828
  "properties": {
@@ -63591,12 +63855,25 @@ var catalogue_default = {
63591
63855
  "licence": { "kind": "unrecorded" },
63592
63856
  "citations": [{ "text": "Bumbarger, Daniel J., Sommer, Ralf J. (2013). System-wide rewiring underlies behavioral differences in predatory and bacterial-feeding nematodes. Cell 152(1), 109-119." }],
63593
63857
  "recipe": {
63594
- "status": "not-fetchable",
63595
- "reason": "no download is in a form keepset reads yet (bumbarger-consensus: format bumbarger-consensus has a pipeline-specific parser with no declarative keepset form yet)"
63858
+ "status": "fetchable",
63859
+ "source": 0,
63860
+ "archive": {
63861
+ "kind": "xlsx",
63862
+ "sheet": "Sheet1"
63863
+ },
63864
+ "parser": {
63865
+ "format": "edge-list",
63866
+ "encoding": "utf-8",
63867
+ "delimiter": "comma",
63868
+ "skipLines": 2,
63869
+ "commentPrefixes": [],
63870
+ "sourceColumn": 0,
63871
+ "targetColumn": 1
63872
+ }
63596
63873
  },
63597
63874
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63598
63875
  "expectedCounts": {
63599
- "edges": 533,
63876
+ "edges": 78,
63600
63877
  "nodes": 29
63601
63878
  },
63602
63879
  "properties": {
@@ -63626,7 +63903,7 @@ var catalogue_default = {
63626
63903
  "citations": [{ "text": "Witvliet, Daniel, et al. (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63627
63904
  "recipe": {
63628
63905
  "status": "not-fetchable",
63629
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
63906
+ "reason": "the graph joins the specimen's chemical synapse file with its gap junction file (Dataset1_gapjunctions.json beside it), and a recipe reads one download"
63630
63907
  },
63631
63908
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63632
63909
  "expectedCounts": {
@@ -63659,8 +63936,13 @@ var catalogue_default = {
63659
63936
  "licence": { "kind": "unrecorded" },
63660
63937
  "citations": [{ "text": "Witvliet, Daniel, Mulcahy, Ben, Mitchell, James K., Meirovitch, Yaron, Bender, Andrew, Garrett, Miranda, Holmyard, Dianne, Schwarz, Kathryn, Ackerman, David G., Bhatt, Dhaval S., Bhatt, Bharti, Bhatt, Heena, Bhatt, Gauri, Bhatt, Rajni, Bhatt, Arushi, Bhatt, Tanya, Bhatt, Prateek, Bhatt, Sanskriti, Bhatt, Ananya, Bhatt, Aanya (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63661
63938
  "recipe": {
63662
- "status": "not-fetchable",
63663
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
63939
+ "status": "fetchable",
63940
+ "source": 0,
63941
+ "archive": { "kind": "none" },
63942
+ "parser": {
63943
+ "format": "witvliet-synapses",
63944
+ "encoding": "utf-8"
63945
+ }
63664
63946
  },
63665
63947
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63666
63948
  "expectedCounts": {
@@ -63694,7 +63976,7 @@ var catalogue_default = {
63694
63976
  "citations": [{ "text": "Witvliet, Daniel, et al. (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63695
63977
  "recipe": {
63696
63978
  "status": "not-fetchable",
63697
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
63979
+ "reason": "the graph joins the specimen's chemical synapse file with its gap junction file (Dataset4_gapjunctions.json beside it), and a recipe reads one download"
63698
63980
  },
63699
63981
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63700
63982
  "expectedCounts": {
@@ -63727,8 +64009,13 @@ var catalogue_default = {
63727
64009
  "licence": { "kind": "unrecorded" },
63728
64010
  "citations": [{ "text": "Witvliet, Daniel, et al. (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63729
64011
  "recipe": {
63730
- "status": "not-fetchable",
63731
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
64012
+ "status": "fetchable",
64013
+ "source": 0,
64014
+ "archive": { "kind": "none" },
64015
+ "parser": {
64016
+ "format": "witvliet-synapses",
64017
+ "encoding": "utf-8"
64018
+ }
63732
64019
  },
63733
64020
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63734
64021
  "expectedCounts": {
@@ -63761,8 +64048,13 @@ var catalogue_default = {
63761
64048
  "licence": { "kind": "unrecorded" },
63762
64049
  "citations": [{ "text": "Witvliet, Daniel, et al. (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63763
64050
  "recipe": {
63764
- "status": "not-fetchable",
63765
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
64051
+ "status": "fetchable",
64052
+ "source": 0,
64053
+ "archive": { "kind": "none" },
64054
+ "parser": {
64055
+ "format": "witvliet-synapses",
64056
+ "encoding": "utf-8"
64057
+ }
63766
64058
  },
63767
64059
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63768
64060
  "expectedCounts": {
@@ -63795,8 +64087,13 @@ var catalogue_default = {
63795
64087
  "licence": { "kind": "unrecorded" },
63796
64088
  "citations": [{ "text": "Witvliet, Daniel, et al. (2020). Connectomes across development reveal principles of brain maturation. Nature." }],
63797
64089
  "recipe": {
63798
- "status": "not-fetchable",
63799
- "reason": "no download is in a form keepset reads yet (witvliet-json: format witvliet-json has a pipeline-specific parser with no declarative keepset form yet)"
64090
+ "status": "fetchable",
64091
+ "source": 0,
64092
+ "archive": { "kind": "none" },
64093
+ "parser": {
64094
+ "format": "witvliet-synapses",
64095
+ "encoding": "utf-8"
64096
+ }
63800
64097
  },
63801
64098
  "crosswalk": { "file": "crosswalks/graph-v1/topology.json" },
63802
64099
  "expectedCounts": {