Symbolon packs

kausalflow/lightkone / components/tidy/versions/1/symbolon.toml · raw

[contract]
id = "lightkone/tidy"
version = 1
title = "Find duplicate papers and merge them"
description = """
Finds papers entered more than once, picks the one to keep, and works out
what the kept paper gains from the others, as lightkone's Tidy panel does.
The others are then moved to the trash by the caller.

DUPLICATES. Papers in the trash (trashed present and non-empty) are ignored.
Each remaining paper has up to three match keys:
  doi    "doi:" + doi trimmed, lower-cased, with a leading http(s)://doi.org/
         or http(s)://dx.doi.org/ removed; no key when that leaves nothing
         (no doi, only whitespace, or only the prefix).
  arxiv  "arxiv:" + arxiv trimmed, lower-cased, without a leading "arxiv:"
         and a trailing vN; no key when that leaves nothing.
  title  t = title decomposed (NFKD), lower-cased, keeping only a-z and 0-9.
         If t is longer than 20: "title:" + t. Else if longer than 3:
         "title:" + t + ":" + the first author's surname (before the first
         comma), decomposed, lower-cased, keeping only a-z. Else no key.
Papers that share a key are duplicates, and so are duplicates of duplicates.
Groups of two or more are reported in the order of their first paper, and
each group lists its papers in library order.

KEEPER. The paper with a pdf; among those, the one with notes; among those,
the earliest added (comparing the timestamps as text); then library order.

PATCH (what the keeper gains), with "others" in group order:
  tags     every tag of the keeper, then of the others, without repeats
  folders  the same for folders
  notes    every distinct trimmed non-empty note, keeper first, joined by a
           blank line; absent if none
  starred  true if any is starred; absent otherwise
  fields   the BibTeX fields of all of them, the keeper's winning, then
           earlier others over later ones
  added    the earliest added
  abstract, doi, arxiv, url, venue, year, pdf, file, opened: when the
           keeper's is absent or empty, the first other's non-empty value
"""
regenerability = "disposable"
license = "Proprietary (kausalflow)"
authors = ["kausalflow/lightkone"]

[entrypoint]
function = "run"

[requires]
network = []
credentials = []
state = []
permissions = []

[spec]
seed = 0
max_examples = 200
timeout_seconds = 300