)]}'
{
  "log": [
    {
      "commit": "437d7af6a7bc88d79e8edd6e584a729bac947d5d",
      "tree": "95e67a43f62661fc8f0a91b50b6ab2f3aaf2ba07",
      "parents": [
        "7cf697fced41a741884d68d3635e7673e594db91"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 09 14:40:02 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 09 14:56:35 2026 +0200"
      },
      "message": "Do not link to undocumented helpers from @noRd blocks\n\ndevtools::document() reported six links it could not resolve, all of them\npointing from one @noRd block to another: a function marked @noRd has no\ntopic to link to. They are plain code spans now. Links to\nqueryStringToLabel() stay as they are: that one is exported and does have\na topic.\n\nNothing catches this by itself, which is why it went unnoticed for a\nweek. The links never reach a manual page - no Rd file changes when they\ngo - so R CMD check is silent and comparing the generated files finds\nnothing either. And roxygen2 reports them as messages rather than\nwarnings, so they scroll past. A workflow of its own now documents the\npackage and looks for that message, failing when it appears. Verified\nboth ways: it passes as things stand and fails once a link is put back.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ifb5795ba2058c2f5a3b8d660a1d61f127ad82599\n"
    },
    {
      "commit": "7cf697fced41a741884d68d3635e7673e594db91",
      "tree": "581403242462af815fc44f1b2cb2cc3fe21ebc23",
      "parents": [
        "cff7522c7bee65defbc3f44efe5d7cd5d90548fc"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 10:47:53 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 09 11:17:32 2026 +0200"
      },
      "message": "Parse KWIC snippets of any shape in collocation analysis\n\nAffects only servers that do not deliver tokenized matches, where the\nanalysis falls back to parsing KWIC markup. Against a current KorAP\nmatches2FreqTable() is used instead.\n\nThe reported crash comes from findExample(), not from the regular\nexpression: after a failed request collectedMatches has no snippet\ncolumn, so the example was character(0) and assigning it aborted.\n\nThe expression was wrong as well, in three ways: it required the match\nto be followed directly by the closing span, which a \u003cspan\nclass\u003d\"cutted\"\u003e breaks, it required a non-empty left context, and it did\nnot expect a \u003cspan class\u003d\"more\"\u003e in the right context. Counts stayed\ncorrect - a guard skipped those snippets - but about 15 in every 100\nhits of the query from the report were dropped silently. The two context\nspans are now read one by one and stripped of whatever markup they\ncontain.\n\nAlso fixes both frequency table functions for their own default of an\nempty stopword list, which used to leave the table without the column\nthe stopwords are joined on.\n\nResolves #14\n\nChange-Id: I1cec847480ddb44fbf688042661019b9c5702a24\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cff7522c7bee65defbc3f44efe5d7cd5d90548fc",
      "tree": "11277efc5e3e02dcc12b7960a7538a472d10689c",
      "parents": [
        "1cbb15574990e0fa134f2ed5644e9907e314295a"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 21:49:11 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 22:22:55 2026 +0200"
      },
      "message": "Keep built packages out of the repository\n\nRKorAPClient_1.4.0.tar.gz was committed by accident, a build artefact of\nsome 400 kB that R CMD build produces from the sources next to it. It is\nremoved, and .gitignore now covers the tarballs and the check directories\nthey are unpacked into, so that a careless git add cannot pick one up\nagain.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I3932eed3577bb21e69d472ed0184063d83eaa439\n"
    },
    {
      "commit": "1cbb15574990e0fa134f2ed5644e9907e314295a",
      "tree": "855c1c63e848665091180a1415da3cc1650e243c",
      "parents": [
        "18e49583246446996f653974c7bbbdc859dd6776"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:30:52 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 20:56:00 2026 +0200"
      },
      "message": "DocPrompting: Switch GLM-5.3-Flash from Synthetic to OpenRouter\n\nThe endpoint stays OpenAI compatible, so only the base url, the key and\nthe model id change, from hf:zai-org/GLM-5.3-Flash to z-ai/glm-5.3-flash.\nAn hf: id now fails with a hint rather than being sent somewhere it is\nnot known, since it survives in local .Renviron files.\n\nOpenRouter serves the model from two dozen hosts and would pick one by\navailability, which the tests cannot use: the hosts differ in\nquantization, and in how long they take for a documentation prompt by\nmore than two orders of magnitude - one second on Baseten against seven\nminutes on GMICloud. So the hosts are named and everything outside the\nlist ruled out, which keeps a change in the generated code about the\nReadme rather than about which machine answered.\n\nThe list has to hold more than one, and not because a host might be down:\nOpenRouter reaches them through pools it shares between all of its users,\nrather than through our key, and those pools are regularly exhausted. Of\nten prompts pinned to Baseten alone, two came back rate-limited. A\nBaseten key of one\u0027s own, entered under Settings -\u003e Integrations, takes\nthat away for the host at the front; Relace and Z.ai carry what is left,\nat some fifteen seconds and tens of seconds against Baseten\u0027s one. The\ntimeout is five minutes for their sake, and\nRKORAP_OPENROUTER_PROVIDER overrides the whole list.\n\nRelace is the cheapest of the hosts and the quickest of those on shared\ncapacity, but it serves the model in fp4 where the others use fp8, which\nis why it is not at the front: what the tests measure should not depend\non how coarsely a machine was quantized. It solved the collocation task\nin five of five runs all the same.\n\nNeeds OPENROUTER_API_KEY as a masked variable in the GitLab project.\n\nChange-Id: Iba289424970aa933d58798be4c4b07b74c02f2f6\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "18e49583246446996f653974c7bbbdc859dd6776",
      "tree": "19417a718d16313944e84c85c1d0a89ff2137e4e",
      "parents": [
        "7e8c64eb58fd79a0b3f0ee85e9491f980bebb6e0"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 15:21:09 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 20:50:26 2026 +0200"
      },
      "message": "Record the documentation prompting tests, and cite them\n\nThey are nowhere in the Readme or the changelog, although they are what\nthe Readme is now checked by, and Kupietz/Feldmüller/Konieczny/Lang\n(2026) names them as an example of a practice that keeps LLM-written\nanalysis code honest. A reader arriving from there found nothing.\n\nTwo sentences at the end of the Readme say what they do and how they are\nswitched on, the changelog says how far they now reach - ten tasks - and\nthe paper goes into the references, where it also belongs as a\npublication about the package.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I961cb651ef3485919ec22f0ed23a21ca4fdf262b\n"
    },
    {
      "commit": "7e8c64eb58fd79a0b3f0ee85e9491f980bebb6e0",
      "tree": "eaba4a8ee0e8ba59570a7b8af3527ca1160d2104",
      "parents": [
        "db075d558b0732030bab2f2ccd8423db2bba4a85"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 14:59:47 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 20:50:26 2026 +0200"
      },
      "message": "NEWS: put the cacheAs changes into one entry\n\nSix entries described what is one story - cacheAs reaching the other\nquery functions, recording what produced a result, refusing a file that\ndoes not match, and the three functions around it - and a changelog is\nread to find out what changed, not to follow how it was built. They are\nnow one, and the entry from the development cycle about parameters being\nrecorded goes into it as well, that being the same thing said earlier.\n\nThe vc labels entry says \"consistently\", which is what the change is\nabout: collocationAnalysis() did this all along.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I24b6ec706b3e8b8c18ea61aacc96308ee9d21793\n"
    },
    {
      "commit": "db075d558b0732030bab2f2ccd8423db2bba4a85",
      "tree": "b3511783e2f1d8e9186a80e21782e57673e2b7f8",
      "parents": [
        "3d786570c905d28bd18e3954a6507da5edacf7a6"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 09:38:49 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 20:50:26 2026 +0200"
      },
      "message": "DocPrompting: cover keeping a result and labelling corpora\n\nTwo tasks for what 1.4.0 added, both phrased as the reason to reach for\nit rather than as the parameter to use: a report that must not query the\nserver on every knit, and two corpora whose rows are to carry given\nlabels. Neither names cacheAs or the vc vector, so what is tested is\nwhether the Readme leads there.\n\nBoth are solved on the documentation as it now stands.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I1977c5fe76450c1ae7a23aa15ef977d54f05dcbb\n"
    },
    {
      "commit": "3d786570c905d28bd18e3954a6507da5edacf7a6",
      "tree": "ab4765d58244966760d3b28bbdb3f4dd1fe3e859",
      "parents": [
        "c3de7021d07e2952c65af3243310a6fb8ba27995"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 09:38:49 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:44 2026 +0200"
      },
      "message": "Readme: say what a cacheAs file is good for besides speed\n\nThe passage introducing cacheAs framed it as a way around slow collocation\nanalyses, which is still its main use and now more so, since comparing\nthem across virtual corpora multiplies the waiting. But the parameter is\nno longer collocationAnalysis\u0027 alone, and for the quick functions that\nreason does not apply: a kept file holds the numbers a text was written\nabout, which KorAP answers differently once the corpus has grown, and it\nlets a script run again with no server at all - which was checked against\na connection whose requests all fail.\n\nThat a file is not reused for a call it was not written for is worth\nsaying too, since the alternative would be silently wrong numbers. And\nsince it is not, keeping one under version control next to the document\nis worth suggesting, with cacheAsInfo() to read back what it rests on,\nblessCacheAs() to vouch for a file that is sound all the same, and\nwithCachedResults() for when there is no time to recompute anything.\n\nAlso documents that a named vc vector labels the rows of corpusStats(),\nfrequencyQuery() and collocationScoreQuery(), which so far only\ncollocationAnalysis() was said to do. The connection\u0027s cache now points\nat cacheAs, the two being easy to confuse.\n\nChange-Id: I03e1b9cada8ad76cf7aeacb68d285315c8ab1499\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c3de7021d07e2952c65af3243310a6fb8ba27995",
      "tree": "042e2ad4c02c28cd62263ac6b972b30770c3b4a3",
      "parents": [
        "c6e77367a80526b44304365b815eb80a698cd9a4"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 14:08:12 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:41 2026 +0200"
      },
      "message": "Take cache files as they are where there is no time to recompute\n\nA file that does not match is recomputed, which is the right default and\nuseless ten minutes before a talk: a collocation analysis runs for hours,\nand the stale file is overwritten on the way. withCachedResults() takes\nthe files as they are while an expression is evaluated, and puts the mode\nback afterwards, so that a document can be knitted from what is on disk\nwithout a stray options() call outliving it. mode \u003d \"offline\" goes\nfurther and refuses to compute at all, which turns a missing file into an\nerror now rather than an unfinished talk later.\n\nThe same is available document-wide through options(rkorap.cacheAs\u003d) or\nKORAP_CACHE_AS, following the rkorap.verbose and KORAP_VERBOSE pair\nalready there. A file used although it does not match is still reported,\nso that outdated numbers do not pass unremarked, and the warning about a\nrefused file now names the two ways out.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ied5d88ea452f5cc39f8ceafbbb4035575641a682\n"
    },
    {
      "commit": "c6e77367a80526b44304365b815eb80a698cd9a4",
      "tree": "161b166cb180a82652ce764650fb1072569a2ce6",
      "parents": [
        "afac51424c6bc4d86449e863641a36067a22cd18"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 14:07:49 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:38 2026 +0200"
      },
      "message": "Add blessCacheAs() to vouch for a file an older version wrote\n\nFiles from the 1.3.0.9000 development cycle already hold correctly\ncomputed scores - the corrections landed there, before the release was\ncut - but they say nothing about what wrote them, so the check added for\n1.4.0 recomputes them. That is right in general and wrong for exactly\nthe files whose owners know better, and a collocation analysis they would\nhave to sit through again runs for hours.\n\nblessCacheAs() records that a file holds what this version would compute.\nWhat actually produced it is left as it stands and the blessing noted\nbeside it, so cacheAsInfo() goes on saying where the numbers come from\nrather than claiming a provenance the file does not have.\n\nA file recording no parameters, as those written before 1.3.0.9000 do,\nhas nothing left to compare against a call once blessed, and is reused\nfor any call naming it. Blessing one says so.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0c46322154441b11547da205b2aa0fb5cf98371d\n"
    },
    {
      "commit": "afac51424c6bc4d86449e863641a36067a22cd18",
      "tree": "c9732ec35c51a070771f4612f6d6a6601b10302c",
      "parents": [
        "a3a8cd90cdae30bcb9505e0adc24fd7c45022115"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 10:37:42 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:35 2026 +0200"
      },
      "message": "Add cacheAsInfo() to read back what produced a cache file\n\nA cacheAs file records the parameters of the call, the KorAP instance,\nthe index revision that instance\u0027s corpus had at the time and the version\nof RKorAPClient that wrote it - which is what makes such a file worth\nkeeping next to a document, and until now there was no documented way of\ngetting at it. cacheAsInfo() returns the record, or NULL for a file\nwritten before 1.4.0, which holds none.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: If39a8e331a008529fda06d91862e1c498534d78a\n"
    },
    {
      "commit": "a3a8cd90cdae30bcb9505e0adc24fd7c45022115",
      "tree": "7948d0d9a4fcc532cff79315920363e9975ebe3b",
      "parents": [
        "f632fe353ab3845b7bcce48ab95444e8ef474c8a"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 07:59:04 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:32 2026 +0200"
      },
      "message": "Offer cacheAs on the other query functions as well\n\nfrequencyQuery(), corpusStats(), collocationScoreQuery() and\ntextMetadata() take a cacheAs file too now, not because they are slow -\nthey are not, next to a collocation analysis running for hours - but\nbecause a file of one\u0027s own is what keeps an analysis reproducible. KorAP\ncorpora grow, so the same query returns different numbers next year, and\nthe scores computed from them may change with the package; a result kept\nnext to the script stays what it was, and the script runs without a\nserver at all.\n\nThe parameter is documented as what it is, next to the connection\u0027s\ncache, which is a transparent speed-up one can throw away.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I9bac8931e7a38a91adcbfe58ef4cb5bcdaaf3c47\n"
    },
    {
      "commit": "f632fe353ab3845b7bcce48ab95444e8ef474c8a",
      "tree": "cd56ea116cdd537cc30dc9f6f9dbada256071abc",
      "parents": [
        "c902c23dda52cf9b15e3c9bd37ed752e23af6989"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 07:58:46 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:30 2026 +0200"
      },
      "message": "Label virtual corpora by the names they were given\n\nPassing c(before \u003d ..., since \u003d ...) said what the two corpora are to be\ncalled, and only collocationAnalysis() listened. frequencyQuery() dropped\nthe names in the expand_grid() it builds its queries from and returned no\nlabel at all; corpusStats() let them become row names, which the first\nbind_rows() throws away; collocationScoreQuery() ignored them and derived\na label from the corpus definitions instead, so that the pair above came\nout as \"1990 \u0026 pubDat...\" and \"2010\".\n\nAll three now prefer the names, falling back to queryStringToLabel()\nwhere a vector is named only in part, as collocationAnalysis() has been\ndoing. A vector without names is left alone: no label column appears\nwhere there is nothing to put in it.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I72c7c8d5f14b649df853cae94a4d90c0be19d1f4\n"
    },
    {
      "commit": "c902c23dda52cf9b15e3c9bd37ed752e23af6989",
      "tree": "7873da65ecf85ce1c165a6192b7f78b18853423d",
      "parents": [
        "245813a01a48cefcaf18a10d4f9fe516d21dd73b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 07:58:01 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 08 16:02:26 2026 +0200"
      },
      "message": "Refuse cacheAs files written before the scores were corrected\n\nA cacheAs file holds a finished analysis, association scores included,\nand 1.4.0 computes those differently. A file written by 1.3.0 would\ntherefore be handed back with numbers that would not be arrived at again,\nand the comparison of parameters added during this cycle cannot notice\nit: the parameters did not change, the formula did. The version that\nwrote a file is now recorded in it, and one from before 1.4.0 is\nrecomputed and overwritten, with a warning saying why.\n\nThe machinery moves to a file of its own on the way, since it is no\nlonger about collocation analysis alone, and verbose drops out of what a\nfile records: how loud a query is does not change what it returns.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8af9eac21ae53fe5d583578c3689b37d140a4af4\n"
    },
    {
      "commit": "245813a01a48cefcaf18a10d4f9fe516d21dd73b",
      "tree": "c883ce51817423985a6b0f9a2f202564392d63e8",
      "parents": [
        "ffe28aa77ec85eeabb10aaedda5e4c712ea8eb44"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 17:59:25 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 19:41:49 2026 +0200"
      },
      "message": "Readme: say when an authorized application is needed, and when not\n\nThe authorization section explained how to get a token, but not when one\nis needed, so that every example reaching for auth() looked like a rule\nof collocationAnalysis() rather than a consequence of what it queries.\n\nThe distinction that matters is not corpus by corpus but frequency\nagainst KWIC: counts cover the whole corpus in either case, so\nfrequencyQuery(), corpusStats() and collocationScoreQuery() need no token\neven on DeReKo - as the Readme\u0027s own first example, which queries it\nunauthorized, showed all along. Only the snippets of copyrighted texts\nare withheld, which is what corpusQuery(metadataOnly \u003d FALSE) and\ncollocationAnalysis() are after.\n\nAnd even that follows the licenses of individual texts: DeReKo\u0027s Wikipedia\ncorpora hand out their snippets to anyone, and the Wikipedia talk pages at\ninstance/wiki and instance/english are under a Creative Commons license\nthroughout. Both were checked against the live servers: they answer a\nplain KorAPConnection() with KWIC snippets.\n\nChange-Id: Ic43cca97a4acf5b6dcc20bf384842d9171cf1d43\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ffe28aa77ec85eeabb10aaedda5e4c712ea8eb44",
      "tree": "37df71256b2474d7298c24ff6f2706e570ac53f6",
      "parents": [
        "c5143241fb90939fd0441cf3dcf6313946a4cdd7"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 17:50:45 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 19:41:49 2026 +0200"
      },
      "message": "DocPrompting: Prompt the way a user would\n\nWhat these tests send is also what we implicitly recommend, and it had\ngrown into something nobody would type: the task appeared twice, once\nbefore the Readme and once after it, in two slightly different wordings,\nwith the documentation wedged in between. It now appears once, after the\ndocumentation, where an instruction belongs when the context is long.\n\nThe persona goes with it. \"You are an expert R programmer\" moves the\nwording of an answer rather than its correctness, and what was actually\nwanted - clear tidyverse code, in the style of the Readme\u0027s own examples\n- is now asked for. Asking for a single code block addresses at its\nsource what extract_r_code() has to repair afterwards.\n\nRemoving the repetition cost the collocation task its second mention of\n\"lemma\", which turned out to be carrying it: the answers fell back to the\nword form. That is a gap in the Readme rather than in the prompt, and is\nfixed in the commit before this one; three runs pass with both changes in\nplace.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I85c8256d6c066768bd816af28fd4c1c78f969169\n"
    },
    {
      "commit": "c5143241fb90939fd0441cf3dcf6313946a4cdd7",
      "tree": "9034841d0aba3b8bd878e6812f5060fc8f71c0d6",
      "parents": [
        "e406514c455b08c3aad5b4961eb93c324b2dbaa4"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 17:50:45 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 19:41:49 2026 +0200"
      },
      "message": "Readme: show how to analyse the collocates of a lemma\n\nThe passage introducing collocationAnalysis() showed only how to pass a\nword form, and left the plain lemma case to be inferred from the light\nverb construction example, where the lemma layer appears inside a focus\nquery. lemmatizeNodeQuery was not mentioned at all, so that a model could\nonly arrive at it from prior knowledge of the package rather than from\nthe documentation - although the doc prompting tests accept it as a\ncorrect answer.\n\nAsked for the collocates of a lemma with this passage as it was, a model\nreached for the word form in two of three runs; with the two ways spelled\nout, in none of three.\n\nThe word form example was \"setzts\", which is a spoken contraction rather\nthan a form one would look for in a corpus, and reads oddly next to the\nlemma it is meant to contrast with. It is now \"setzte\".\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I4a40b33d6c7d77538f54529be1eee331fec97e05\n"
    },
    {
      "commit": "e406514c455b08c3aad5b4961eb93c324b2dbaa4",
      "tree": "c3ebd3f9a1cfc74bfd8930725477d4b198948cfc",
      "parents": [
        "10bb3bf034d7c3c77d9f37760ac75ec75e664aa7"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:47:17 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 16:49:25 2026 +0200"
      },
      "message": "CI: export the model list, which a project variable would override\n\nA variable defined for the project or the instance takes precedence over\none declared under variables: in this file, so whatever is configured\noutside decided which models the tests prompt - and, in the job that runs\neverything else, whether they run there at all. The comment warning\nagainst that is easy to miss and reaches nobody who sets the variable in\nthe GitLab UI. A shell assignment in the script cannot be overridden that\nway, so the file decides again.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I475b35750598a916858c55d917d953d27c2ce264\n"
    },
    {
      "commit": "10bb3bf034d7c3c77d9f37760ac75ec75e664aa7",
      "tree": "78931a3843bb842e6c37cb2dedfed2769bc62600",
      "parents": [
        "08cc2e53e9e46d2ffcaee20cd1e6a20e3f1a79da"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:47:17 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 16:49:25 2026 +0200"
      },
      "message": "CI: discard the cached R library when the image\u0027s R changes\n\nThe cache holds rlib/, which holds compiled code. A newer R in the image\ndoes not rebuild that code but refuses to load it, so the job died in its\nbefore_script with\n\n  rlib/vctrs/libs/vctrs.so: undefined symbol: SETLENGTH\n\nand never got to the tests. Since a cache key cannot be derived from the\nR version of an image that is only pulled later, the version is recorded\nin the library and the library discarded when it no longer matches.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I09fc147c114533987c82dd558c77ac36f00904a0\n"
    },
    {
      "commit": "08cc2e53e9e46d2ffcaee20cd1e6a20e3f1a79da",
      "tree": "32168102030f21a6b774eec057bd35bb00c6c7b5",
      "parents": [
        "73e3f370407130bfab98c1e3167e5e4d9c4dd920"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 16:49:25 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 16:49:25 2026 +0200"
      },
      "message": "DocPrompting: Take the first code block of a reply, not all of them\n\nAsked for code alone, a model may still explain itself around it, or\noffer a second way of doing the same in a block of its own. Stripping the\nfences and keeping the rest put the sentence introducing that second\nblock into the middle of the code, where it does not parse - so a reply\nthat answered the task twice failed for being invalid R.\n\nThe first block is what was asked for, and it is now the only one taken.\nFour checks cover it, and they need no API key, so they also run in the\njob that has the model list empty.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0cb6f8eecaefe11b9fb78c44ec5fc995c269114e\n"
    },
    {
      "commit": "73e3f370407130bfab98c1e3167e5e4d9c4dd920",
      "tree": "df4398cad5f878860862535442b7179b426ca78e",
      "parents": [
        "3321dae56c86331be91c799ec6bcea88760587dc"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:30:52 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:30:52 2026 +0200"
      },
      "message": "DocPrompting: Accept a vc vector built before the call\n\nThe test required the named vector of virtual corpora to be written into\nthe collocationAnalysis call itself and counted binding it to a variable\nfirst as a failure, although the labels of the comparison columns come\nout the same either way.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I85f5452f90cf996e65477e54eb3728a483837962\n"
    },
    {
      "commit": "3321dae56c86331be91c799ec6bcea88760587dc",
      "tree": "ff57adf00e7548a630a76d4ec3548b4a98bfeaea",
      "parents": [
        "c38d8fb443384a6febac1508c3fea5b24ecb810e"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:30:52 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Sep 05 15:30:52 2026 +0200"
      },
      "message": "DocPrompting: Accept lemmatizeNodeQuery as a lemma search\n\nThe test required the lemma to be asked for through the annotation layer,\nas the Readme shows it, and counted collocationAnalysis\u0027 own\nlemmatizeNodeQuery as a failure - although that parameter builds the very\nsame query from a plain word, so that both are correct answers to the\ntask.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I231e5104d9dca0ed3720ef104a0d1146ed4ceb23\n"
    },
    {
      "commit": "c38d8fb443384a6febac1508c3fea5b24ecb810e",
      "tree": "a8d0c8a98843e5dc112e7f297a3033d64ed2fc20",
      "parents": [
        "d4a7b306b2ea21b18e65ac211ca358d8d9f501a5"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 04 17:51:58 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 04 17:57:58 2026 +0200"
      },
      "message": "Scale the whole log-likelihood table with the window size\n\nca_ll\u0027s contingency table multiplied only its row total by the window\nsize, leaving cells that do not add up to one sample: the row was\ncounted in window positions while the column and the sample size were\ncounted in corpus tokens.\n\nFollowing Evert (2004), which the function cites, the sample consists of\nco-occurrence tokens rather than corpus tokens. With a window of\nwindow_size positions, every occurrence of either word takes part in\nthat many pairs, so the sample size and both marginals scale with it.\n\nThe expected co-occurrence frequency comes out as window_size * O1 * O2\n/ N either way, which is why pmi, mi2 and mi3 never depended on this and\nwhy it went unnoticed for so long. Only ll needs the rest of the table,\nand there the values differ, by 0.1% for a frequent collocate up to well\nover 100% for a frequent node in a wide window. The ll column of the\ncollocationScoreQuery example in the Readme was recomputed accordingly.\nThe light verb construction table is unaffected, its total window size\nbeing 1, where the two formulations are identical.\n\nIt also removes a pathology rather than papering over it: N -\nwindow_size * O1 could turn negative, at which point the score became\nNaN through a log of a negative number. window_size * (N - O1) cannot,\nso the warning added earlier in this development version is dropped\nagain - it treated a symptom of exactly this inconsistency.\n\nReported-by: Tim Feldmüller \u003chttps://github.com/feldmueller\u003e\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8b912c5bd870a0c9913d019043b2447f951f1891\n"
    },
    {
      "commit": "d4a7b306b2ea21b18e65ac211ca358d8d9f501a5",
      "tree": "35c45b749621dc7150c0fa1eb51becf0e2a58c26",
      "parents": [
        "1d400f6a1c37ae095eb9ed3613236c766f191c93"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 04 10:40:48 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 04 10:40:48 2026 +0200"
      },
      "message": "Fix cache file test broken by recording the analysis parameters\n\nSince cacheAs files record the parameters they were created with, in an\nattribute, while the returned value deliberately does not carry it, the\ntest comparing the file against the returned value failed:\n\n  Expected `readRDS(cache_file)` to equal `first`.\n  Attributes: \u003c Names: 1 string mismatch \u003e\n\nThe test now strips the attribute before comparing, and asserts that it\nis there in the first place, which is the behaviour that broke it.\n\nThe failure only showed up in CI because the test needs network access\nand is guarded by skip_if_offline(), which skips unless NOT_CRAN is set,\nas devtools::test() does but plain R CMD check does not.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I48bada5f923df661404627efc58ed623fc093440\n"
    },
    {
      "commit": "1d400f6a1c37ae095eb9ed3613236c766f191c93",
      "tree": "4c104f08038e061e3ff876691b6ca536be6d50b2",
      "parents": [
        "b6416be4b6192a6f498acca1e4fc3b05127c7dd6"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:46:16 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:46:16 2026 +0200"
      },
      "message": "CA: drop collocates occurring less often than expected by default\n\ncollocationAnalysis() ranks and thresholds by logDice, which expresses\nhow salient a pair is rather than how surprising it is. A frequent word\ncan therefore appear among the top collocates although the node does not\nattract it at all: among the collocates of Grund in a 5+5 window,\n\"Berlin\" reaches a logDice of 3.84, close to \"triftiger\" at 3.96, while\nco-occurring 1.74 bits less often than expected.\n\nFiltering these out was documented as a recipe, dplyr::filter(O \u003e E),\nbut a default that quietly rewards frequent, unattracted collocates is a\ntrap for exactly those users who do not know the measure well enough to\napply the recipe. The new minObservedExpectedRatio parameter therefore\ndefaults to 1, keeping only collocates that occur at least as often as\nexpected, which corresponds to a non-negative pmi. It can be raised to\ndemand a stronger contrast, or set to 0 for the unfiltered result of\nearlier versions, e.g. in order to study repulsion.\n\nThe filter is applied wherever minOccur is, so it also governs which\ncollocates are recursed into, and it is passed on to the per virtual\ncorpus analyses. Rows without an expected frequency are kept rather than\nsilently dropped. collocationScoreQuery() is deliberately left alone:\nthere the pairs to score are given explicitly, so filtering them would\nthrow away the answer that was asked for.\n\nBeing collected from the call frame rather than from a list, the cacheAs\nparameter check picked the new parameter up by itself, so a cache file\nwritten with a different ratio is recomputed.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I98328a8766847b4c95363211a939403b1912e9b7\n"
    },
    {
      "commit": "b6416be4b6192a6f498acca1e4fc3b05127c7dd6",
      "tree": "38ea04c1560562af4a4a75ad8754dd9ecd36dcf6",
      "parents": [
        "bccdf70f626be8d0efb3b63701caf2e789fe8dbf"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:37:37 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:37:37 2026 +0200"
      },
      "message": "Document that logDice measures salience, not surprise\n\nA collocate that co-occurs less often than expected can still reach a\nlogDice close to that of a strongly attracted one, which is puzzling\nuntil one sees that logDice never compares against an expected\nfrequency. Since it only puts O into the numerator of the Dice\ncoefficient, the difference between the score of a pair and the score it\nwould get if it co-occurred exactly as often as expected is precisely\nthe pointwise mutual information:\n\n  logDice(O) - logDice(E) \u003d log2(O / E) \u003d pmi\n\nThe level a pair starts from thus depends on the marginal frequencies\nalone. Among the collocates of Grund in a 5+5 window, the rare\n\"triftiger\" starts at -4.60 and reaches 3.96, exceeding what is expected\nby a pmi of 8.57, while the frequent \"Berlin\" starts at 5.58 and still\nreaches 3.84 while co-occurring 1.74 bits less often than expected.\n\nThis is a property of the measure rather than a defect: logDice was\ndesigned to be corpus size independent and comparable across corpora,\nnot to express surprise. But since collocationAnalysis() ranks and\nthresholds by it, users should know to drop pairs that are not attested\nmore often than expected, with dplyr::filter(O \u003e E) or a minimum pmi or\nll. This is now explained in a section of the association score\ndocumentation, referred to from the thresholdScore parameter where the\ndefault takes effect, and summarized in the Readme.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I9059cd064e2a612d9327cc009da0b4856612e41d\n"
    },
    {
      "commit": "bccdf70f626be8d0efb3b63701caf2e789fe8dbf",
      "tree": "543f2e984b656b1f856e4a4f7c1e7d2e4d3149e7",
      "parents": [
        "8bacebb64a582d71eee5005a2de377fb1027da69"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:26:48 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:26:48 2026 +0200"
      },
      "message": "Guard log-likelihood against windows covering the whole corpus\n\nThe contingency table of ll() classifies all N corpus tokens by whether\nthey lie inside a window around the node, using window_size * O1 as the\nrow total. That stops being a partition once the windows cover more than\nthe corpus: N - window_size * O1 turns negative, and the score became\nNaN through a log() of a negative number, with only a warning from log()\nitself to indicate what had happened.\n\nSuch a node has to cover more than 1/w of the corpus, so with the\ndefault window it is out of reach, but in DeReKo \"der\" (2.90% of all\ntokens) gets there from a context of 18 left and 18 right, \"die\" from\n19+19 and \"und\" from 24+24.\n\nThese cases now yield NA with a warning that names the condition and\nsuggests a smaller window. The check is vectorized, so that only the\naffected values become NA.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I5e11396c67bc9103ec73745726d052857536df7f\n"
    },
    {
      "commit": "8bacebb64a582d71eee5005a2de377fb1027da69",
      "tree": "82d0cb70ae7ca471f2dd268d395a199c91ad80ae",
      "parents": [
        "1e9f79174b3cb0b5983ab321db0c9e34d0f781ce"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:26:36 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 14:26:36 2026 +0200"
      },
      "message": "Compute logDice as defined by Rychly, comparable to other tools\n\nlogDice was computed as 14 + log2(2 * O / (w * O1 + O2)), multiplying\nthe node frequency by the window size, while the documentation cites\nRychly (2008), who defines it as 14 + log2(2 * O / (O1 + O2)).\n\nThe window size factor does not belong here. It is correct in the\nexpected frequency E, where w * O1 counts the positions in which a\ncollocate can occur, and the other scores take the window into account\nthrough E alone. The Dice coefficient, however, relates the\nco-occurrence frequency to how often the two words occur at all, so its\ndenominator sums marginal frequencies. Adding w * O1, a count of window\npositions, to O2, a count of word tokens, mixes units, and it makes the\ncoefficient asymmetric: for Grund/triftiger it gave 0.64, for\ntriftiger/Grund 3.96, from the same counts.\n\nThe practical effect was that a frequent node made w * O1 dominate the\ndenominator - for Grund and triftiger in a 5+5 window, O2 contributed\n0.006% of it - so that rare collocates were penalised. triftiger scored\n0.64, below Berlin at 2.03, although Berlin co-occurs with Grund less\noften than chance predicts (pmi -1.74). They are now 3.96 and 3.84.\n\nScores rise by up to log2(w), so up to 3.32 for the default context of\n5 left and 5 right, which makes collocationAnalysis() somewhat more\npermissive when recursing with the default thresholdScore \u003d \"logDice\"\nand threshold \u003d 2. Results computed with a total window size of 1 are\nunaffected, the two formulas being identical there, which is why the\nlight verb construction table in the Readme stays as it is, while the\ncollocationScoreQuery example, which uses the default window, was rerun.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I190fd65d0c53517df74c26c007a6440d974f700c\n"
    },
    {
      "commit": "1e9f79174b3cb0b5983ab321db0c9e34d0f781ce",
      "tree": "e4357bbcc0c0fe7b31b49349c6c37054307b31dd",
      "parents": [
        "81ddc344bdb4f93cfe0b498c35a05f0b70d6a9c9"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:23:42 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:49:12 2026 +0200"
      },
      "message": "Doc prompting tests: cover authorization and multi-VC comparison\n\nThe two Readme sections that are hardest to follow were not covered by\nany documentation task: authorization, which readers most often get\nwrong, and the multi-VC collocation comparison, whose section is new and\nwhose columns are easy to misread.\n\nUnlike the other tasks, the code of these two cannot reasonably be\nexecuted in a test: authorization needs a browser flow or a token for\nrestricted data, and a multi-VC collocation analysis runs for minutes.\nOnly the generated code is inspected, which is what these tests are\nabout anyway - whether the Readme can be followed.\n\nThe expectations therefore aim at the parts that are easy to get wrong\nand that the sections explicitly explain: metadataOnly \u003d FALSE for\nreceiving KWIC snippets, a *named* vc vector, since the names become the\nlabels of the comparison columns, reducing the result to one row per\ncollocate, since it holds one per collocate and vc, and taking the\nimputed flag into account, since imputed scores describe presence or\nabsence rather than a measured contrast.\n\nGLM-5.3-Flash solves both from the Readme alone, in the multi-VC case\nincluding filter(label \u003d\u003d ..., !imputed) and arranging by delta_logDice.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I25865ef32bb6c3ee894cfb081f93d51bfb28b915\n"
    },
    {
      "commit": "81ddc344bdb4f93cfe0b498c35a05f0b70d6a9c9",
      "tree": "f08d3677c408a8db5b5c0bdd81f6f68a9df59de4",
      "parents": [
        "efec8634852c4e4d2cf4352fbb063bf425a3312e"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:18:53 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:49:12 2026 +0200"
      },
      "message": "Readme: document corpusStats, textMetadata and collocationScoreQuery\n\nThese three are exported, useful and were shown nowhere in the Readme,\nwhich not only leaves readers to find them in the reference\ndocumentation, but effectively hides them from an LLM whose context is\nthe Readme: it cannot use what it has not been shown.\n\ncorpusStats answers how large a (virtual) corpus is, textMetadata\nretrieves everything KorAP knows about a text given its sigle, and\ncollocationScoreQuery scores collocation candidates that are already\nknown, as opposed to collocationAnalysis, which searches for them. The\nlatter also demonstrates passing a vector of collocates, which was added\nin 1.3.0 but not shown anywhere either.\n\nAll examples and their output were run against DeReKo. The three\ndocumentation prompting tasks added cover exactly these\nfunctions, and GLM-5.3-Flash solves all three from the new sections\nalone, including as.df \u003d TRUE and the vector of collocates.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ia760750d10825bb2220c807ef0fc6e25e2cdd821\n"
    },
    {
      "commit": "efec8634852c4e4d2cf4352fbb063bf425a3312e",
      "tree": "a31f620b8fe51a33a045854dfac66e75d8c3da37",
      "parents": [
        "6957ac9ceaf4b0de7ce1e350ed5f10b4bcfca2ce"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:13:37 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:49:12 2026 +0200"
      },
      "message": "Check the Readme against the package on every test run\n\nThe Readme is the entry point for readers, and, since generated code is\ncopied from it verbatim, for LLMs too. Nothing so far noticed when it\ndrifted away from the package: the \"available since RKorAPClient\n0.9.0.9000\" claim named a version that never existed and survived for\nyears, and the code in it is never executed.\n\nFour checks, all offline and in milliseconds, so unlike the\ndocumentation tests they can run on every commit:\n\n* every R code block parses\n* every function called exists, those of this package as exports, the\n  others through the packages the Readme itself loads\n* every named argument exists in the signature of the function it is\n  passed to, which is where a renamed parameter would otherwise turn\n  the Readme into a source of broken code\n* every version mentioned has a NEWS.md section, which is what the\n  0.9.0.9000 claim failed\n\nSignatures are taken from the .local wrapper that setMethod() creates\nfor S4 methods whose arguments differ from the generic, since the\nformals of the method itself are only those of the generic.\n\nAll four were verified to fail on an injected fault of their kind. They\nskip when Readme.md is absent, as it is in the built package, being in\n.Rbuildignore.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ic1aefea5d964956ca46132ec3d97e2318b4fe931\n"
    },
    {
      "commit": "6957ac9ceaf4b0de7ce1e350ed5f10b4bcfca2ce",
      "tree": "2f472382e2dbeb87241e9e6577edec0de530a4c1",
      "parents": [
        "323a4d399c1b52943d8cd72d8a7c31fe2dcddc57"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 12:18:27 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:49:12 2026 +0200"
      },
      "message": "CI: run the doc prompting tests in their own, non-blocking job\n\nThe Readme documentation prompting tests query LLMs, so they are neither\ndeterministic nor free: a model can miss an expectation on one run and\nmeet it on the next, and an empty API account fails them regardless of\nthe state of the package. Letting them decide whether the pipeline is\ngreen means red builds for commits that changed nothing related.\n\nThey therefore move into their own job with allow_failure: true, where a\nfailure is visible as what it is, a hint that the documentation may have\nbecome unclear, without blocking anything. That job runs GLM-5.3-Flash,\nwhich solved all three documentation tasks in every trial run, while\ngemini-3.5-flash-lite still missed an expectation every few runs.\n\nKeeping them out of the main job needs more than a testthat filter,\nsince devtools::check() runs the tests as well, and blanking the API\nkeys in the job would not work either, because project level variables\nset in the GitLab UI take precedence over those in the yml. The model\nlist is used as the switch instead: RKORAP_LLM_MODELS unset means the\ndefault models, set but empty means none at all, so the main job\ngenerates no LLM tests in either of its two steps.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ia1f29f05a0b8401f61307859e97948f4be977565\n"
    },
    {
      "commit": "323a4d399c1b52943d8cd72d8a7c31fe2dcddc57",
      "tree": "72193c6a46d2ead305d9765f85019f6f137b6c07",
      "parents": [
        "37f96075e1fdcab348c358be3ce2820eb5ac0a50"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 12:04:35 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 13:48:31 2026 +0200"
      },
      "message": "Doc prompting tests: run against several current low cost models\n\nThe Readme documentation tests ran against a single hardcoded model,\ngemini-2.5-pro. Since the tasks are simple, and since what is being\ntested is the Readme rather than the model, cheap and fast models are\nthe better fit: if such a model cannot follow the Readme, that is a\nfinding about the Readme. They are also considerably cheaper to run,\nin money and in energy.\n\nThe model is therefore no longer a constant but a list, run one test per\nmodel and task, and overridable via RKORAP_LLM_MODELS. The defaults are\ngemini-3.5-flash-lite, claude-sonnet-5 and GLM-5.3-Flash, the latter via\nthe OpenAI compatible Synthetic API at https://api.synthetic.new/openai/v1,\nauthorized with SYNTHETIC_API_KEY. tidyllm\u0027s openai provider takes no\ncustom base url, so that endpoint is queried directly with httr2, which\nis a hard dependency anyway.\n\nEach model is skipped individually if its API key is missing, so a\npartial set of keys tests whatever it can. Conditions of the account\nrather than of the documentation - rate limits, failed authorization\nand, newly, exhausted credits - lead to a skip instead of a failure.\n\nAlso fixes a problem that was independent of all this: the file called\nlibrary(tidyllm) at top level, although tidyllm is only suggested. Where\nit is not installed, as when checking with _R_CHECK_DEPENDS_ONLY_, that\nmade the whole file fail instead of skip. tidyllm is now qualified at\nits call sites and skipped on when missing.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8be20b040f7549f39996af1d02afcefa69e63ce2\n"
    },
    {
      "commit": "37f96075e1fdcab348c358be3ce2820eb5ac0a50",
      "tree": "d46205219fa10a6373ca793dbdbefbc8ccf96fc1",
      "parents": [
        "ef5b7c1b03f9e83b0d6ef9a4f10d56d4e1a44c5d"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 07:18:11 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Sep 03 07:18:11 2026 +0200"
      },
      "message": "CA: check the parameters a cacheAs file was created with\n\nUntil now, a cacheAs file was used whenever it existed. Changing a\nparameter and forgetting to delete the file therefore silently returned\nan analysis computed with the old parameters. Inferring the parameters\nfrom the cached data frame would not help much: of the 23 parameters\nthat affect the result, only node, vc, leftContextSize and\nrightContextSize are recoverable from it, which leaves out exactly the\nones that are typically tuned between runs, such as minOccur,\ntopCollocatesLimit, searchHitsSampleLimit, exactFrequencies, stopwords\nand threshold.\n\nThe parameters are therefore recorded when the file is written, and\ncompared on the next call. They are collected from the call frame rather\nthan listed explicitly, so that parameters added later are covered\nwithout having to remember to register them. Also recorded is the API\nURL, since reusing one cache file for two KorAP instances is a mistake\nworth catching, and, for reference only, the index revision: corpus\nupdates should not invalidate an analysis that was deliberately kept.\n\nIf parameters differ, the analysis is recomputed and the file\noverwritten, with a warning naming the differing parameters. That is\npreferred over an error: it never returns results that disagree with the\nrequested parameters, and never breaks a long pipeline. Users who want\nto keep an old analysis can pass a different cacheAs file name.\n\nThe parameters are stored in an attribute, so the file stays a plain\ndata frame for anyone reading it with readRDS(), and the attribute is\nstripped when loading, so the returned value is the same whether it came\nfrom the cache or not. Cache files written by 1.3.0 carry no attribute\nand are used as they are.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ib21aa93fa3c2bf1cd42dd07dbfcbd2970841a412\n"
    },
    {
      "commit": "ef5b7c1b03f9e83b0d6ef9a4f10d56d4e1a44c5d",
      "tree": "f3ba890b684e12eba03776fe47806facc8667312",
      "parents": [
        "ae4079aee782740315e3c8d7cb6f19dbe1f73df8"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 07:24:43 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 07:24:43 2026 +0200"
      },
      "message": "Drop the PTXQC dependency and bump to 1.3.0.9000\n\nPTXQC was imported for exactly two small string functions, lcpCount()\nand lcsCount(), both used only by queryStringToLabel(). It brought\nrmzqc, jsonvalidate, seqinr and V8 with it, and V8 was the only\ndependency in the whole tree that required a libv8 installation, which\nmade it by far the most expensive part of installing RKorAPClient on\nLinux. The recursive dependency closure shrinks from 128 to 90 packages.\n\nBoth functions are pure R in PTXQC, so reimplementing them costs no\ncompiled code. The replacements determine the length of the common\nprefix and suffix by binary search over vectorized startsWith() and\nendsWith() calls, instead of comparing character by character (and, for\nthe suffix, reversing every string with strsplit/rev/paste first). That\nmakes them 10 to 65 times faster, depending on the number and length of\nthe strings:\n\n                                      PTXQC      here\n  10 query strings, 37 chars   prefix   183 us    16 us\n                               suffix   127 us    13 us\n  121 vcs, 42 chars            prefix   413 us    29 us\n                               suffix  1029 us    26 us\n  50 strings, 563 chars        prefix  1405 us    64 us\n                               suffix  4362 us    67 us\n\nResults are unchanged: the two functions were compared against their\nPTXQC counterparts over 3020 inputs, and queryStringToLabel() over 8044\ninput/argument combinations, without a single difference. Empty vectors,\nempty strings and the single string case (where a string is its own\nprefix and suffix) behave exactly as before. The only deviation is for\nNA input, where PTXQC\u0027s lcsCount() silently treats NA as the literal\nstring \"NA\"; queryStringToLabel() never reaches it in that case, because\nthe prefix function errors on NA in both implementations.\n\nSince V8 is gone, and keyring no longer needs sodium either, libv8-dev\nand libsodium-dev can be dropped from the Linux installation\ninstructions in the Readme.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Icad4bc76b773b1586922dd05458b82409d112932\n"
    },
    {
      "commit": "ae4079aee782740315e3c8d7cb6f19dbe1f73df8",
      "tree": "a25b6cb22654fda2c031b5839cd4fcbd44562077",
      "parents": [
        "81024dd4d92c2f926dbae0405802871d490765d1"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:57:17 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:57:42 2026 +0200"
      },
      "message": "CI: create GitHub releases from NEWS.md on version tags\n\nPushing a v\u003cversion\u003e tag now creates the corresponding GitHub release\nautomatically, with the matching section of NEWS.md as release notes,\nfollowing the naming used so far (\"RKorAPClient v1.2.1 (CRAN-Release)\").\n\nThe notes are cut out between the level 1 NEWS.md heading that mentions\nthe tagged version and the next level 1 heading, so that headings like\n\"# RKorAPClient 0.7.5 (CRAN release)\" are matched as well, while level 2\nheadings inside a section are kept. Versions are matched as whole\ntokens, so that v1.2.1 does not pick up a \"1.2.1.9000\" dev section.\n\nThe job fails if NEWS.md has no section for the tagged version, rather\nthan publishing an empty release, and warns if the tag disagrees with\nthe version in DESCRIPTION. Tags that are not x.y.z are marked as\npre-releases. Re-running on an existing release updates it instead of\nfailing, and workflow_dispatch allows generating the notes for a tag\nthat was pushed before this workflow existed.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I2bee9d30e3894c92d5f35f077895388b19c5e5cc\n"
    },
    {
      "commit": "81024dd4d92c2f926dbae0405802871d490765d1",
      "tree": "8270728812f4dd7258df3ad6c374f1bcf12e0b79",
      "parents": [
        "f365ed95caa4c3f4c57a2905e33e066304649bb5"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 11:36:07 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:49:06 2026 +0200"
      },
      "message": "Prepare release 1.3.0\n\nBump the version out of its development suffix, turn the dev NEWS\nheading into the 1.3.0 release heading and record the new\nimputation-flag, verbose-reporting and duplicate-warning entries, and\nadd cran-comments for the release. Label the previously unlabelled\ncran-comments section 1.2.1.\n\nAlso record the KorAPConnection() documentation fix of the preceding\ncommit in NEWS.md and explain it in cran-comments.md: the first 1.3.0\nsubmission was rejected by the incoming pretest with the \"Rd files\nwithout \\usage\" NOTE on r-devel-linux-x86_64-debian-gcc and -clang.\n\nR CMD check --as-cran Status OK (0 errors, 0 warnings, 0 notes) locally\non Fedora 44 with R 4.6.1, including the Rd fix. The macOS builder and\nwin-builder runs listed in cran-comments.md were made for the first\n1.3.0 submission and are to be repeated before resubmitting.\n\nThe last state without the Rd fix was confirmed green on GitHub Actions\n(https://github.com/KorAP/RKorAPClient/actions/runs/33394690107):\nR-CMD-check passing on ubuntu-latest (devel, release, oldrel-1),\nmacOS-latest (release) and windows-latest (release), plus test-coverage\npassing.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I87fb5ec5c587fa5d947a0d2d3b3c9af1a4c221cb\n"
    },
    {
      "commit": "f365ed95caa4c3f4c57a2905e33e066304649bb5",
      "tree": "17dfcc60a297c1365def3958396745dd521caa78",
      "parents": [
        "eed0858ff96597b843de708c012a42ec12af790b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:33:07 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:33:07 2026 +0200"
      },
      "message": "Readme: document comparing collocates across virtual corpora\n\nDescribe the multi-VC comparison that collocationAnalysis() performs\nwhen vc is given as a named vector: which comparison columns are added\nper association score, and the two properties that are easy to trip\nover when using them, namely that the result holds one row per\ncollocate *and* virtual corpus with the comparison columns repeated on\neach, and that scores of collocates attested in only one of the\ncompared corpora are imputed from a floor value.\n\nThe example was run against the live DeReKo instance and the shown\ndplyr pipeline was verified on its result. No result table is included:\nwithout an access token the comparison only sees the freely available\nsubset, where the compared corpora are covered too unevenly for the\nnumbers to illustrate anything.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: If845cf72c3de90d13a0bab68fa6e8928c36330cd\n"
    },
    {
      "commit": "eed0858ff96597b843de708c012a42ec12af790b",
      "tree": "a8af7be52dd9567f2c5be93ade388de9f57ff3be",
      "parents": [
        "6a16d7d95259a25874f6dd6f37ae709325229a16"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:14:00 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 01 06:14:00 2026 +0200"
      },
      "message": "Readme: fix outdated statements and document caching\n\n* The two auth() flows were announced as \"available since RKorAPClient\n  0.9.0.9000\", a development version nobody can install. They were\n  released in 1.0.0.\n* collocationAnalysis() has not been new since 0.7.x, so drop the \"new\"\n  from its section heading.\n* Document the cacheAs parameter of collocationAnalysis(), which is\n  particularly useful for the long running analyses shown in that\n  section.\n* Document that API responses are cached locally by default, where they\n  end up, how to switch the cache off and how to clear it, including the\n  DeReKo in/outside IDS caveat that so far was only mentioned in\n  ?KorAPConnection.\n* Use verbose \u003d TRUE instead of verbose \u003d T, as everywhere else.\n* Recommend libcurl4-openssl-dev over libcurl4-gnutls-dev on Debian, as\n  the curl package itself does.\n* Bump the copyright year.\n\nLeft as is on purpose: libv8-dev/v8-devel is still required, since V8\nremains in the dependency chain via PTXQC -\u003e rmzqc -\u003e jsonvalidate, and\nall external links in the Readme still resolve.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ibaf9789a8a07d10a14549ba9714e9416f0b54a0c\n"
    },
    {
      "commit": "6a16d7d95259a25874f6dd6f37ae709325229a16",
      "tree": "e5fcf010d0c8deb3ba9437a43e4c7ce2676a1576",
      "parents": [
        "6a0bad4e589d158c409b50238f51c4d6868bc230"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 21:36:01 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 21:36:03 2026 +0200"
      },
      "message": "Document KorAPConnection() as a function to fix CRAN Rd NOTE\n\nCRAN\u0027s r-devel-linux-x86_64-debian-gcc and -clang checks report\n\n  Rd files without \\usage:\n    \u0027KorAPConnection-class.Rd\u0027\n  \\arguments should not be documented without \\usage.\n\nbecause the user facing documentation, with one @param per constructor\nargument, was attached to the setClass() call. The object exported under\nthe name KorAPConnection was the class generator, whose formals are just\n`function(...)`, so roxygen2 could not derive a \\usage section from it\nand the documented arguments ended up in an Rd file without one. Adding\na hand written \\usage is not an option either: it contradicts the\ngenerator\u0027s `...` signature and turns the NOTE into a much worse\n\"code/documentation mismatches\" WARNING.\n\nReplace the generator with a real KorAPConnection() function that\nforwards its arguments to new(\"KorAPConnection\", ...) and attach the\ndocumentation to it. roxygen2 now derives \\usage from the actual\nformals, so the manual page states how the constructor is really called,\nand the NOTE is gone.\n\nThe constructor forwards supplied arguments only, so that the defaults\nand the missing() based KORAP_VERBOSE / rkorap.verbose overrides of the\ninitialize method keep working unchanged. Its own defaults merely mirror\nthose of the initialize method in order to document them; the new tests\nasserts that the documented defaults are the ones a connection actually\nends up with, so that the two cannot drift apart silently. The KORAP_URL\ndefault is now shared by both signatures as defaultKorAPUrl().\n\nNAMESPACE is unchanged: KorAPConnection remains both an exported\nfunction and an exported S4 class, and new(\"KorAPConnection\", ...) keeps\nworking.\n\nR CMD check --as-cran: Status OK, and no Rd file in man/ has \\arguments\nwithout \\usage any more.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I789d42c01e1be98a989f8f4d9a5b14865ca48daa\n"
    },
    {
      "commit": "6a0bad4e589d158c409b50238f51c4d6868bc230",
      "tree": "b8d85f71a2c903912114ca31a9909efc0ef46993",
      "parents": [
        "7b7a73b665502e82133329d873d1d9800884a0f6"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 11:34:18 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 11:34:18 2026 +0200"
      },
      "message": "Regenerate documentation with roxygen2 8.1.0\n\nroxygen2 8.1.0 groups multiple importFrom() symbols from the same package\ninto a single multi-line call, which rewrites most of NAMESPACE. The change\nis purely cosmetic: the set of imports, exports and S3 methods is unchanged\n(136 entries before and after).\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I407afbf043c37aed60b4940cbf42026cd1a7ae73\n"
    },
    {
      "commit": "7b7a73b665502e82133329d873d1d9800884a0f6",
      "tree": "100bf8e6c281f489376fd4bf2f0d489441101e56",
      "parents": [
        "bceeb05254bec96f54236e92c7da40a65a09927e"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:31:27 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:31:27 2026 +0200"
      },
      "message": "CA: warn when duplicate rows are dropped from multi-VC comparisons\n\nThe pivots in add_multi_vc_comparisons() use values_fn \u003d dplyr::first, so\nrepeated node/collocate/label rows -- as produced when the same collocate is\nfound at several context positions -- were silently reduced to their first\noccurrence. Warn instead, naming mergeDuplicateCollocates() as the way to\ncombine those rows before comparing.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I832ea9a2bc0d28256bba5a37e8b94721809f3a68\n"
    },
    {
      "commit": "bceeb05254bec96f54236e92c7da40a65a09927e",
      "tree": "f6e2248ac6c468716ee5f97abd6b600f1864c801",
      "parents": [
        "ba15cffd49405e1ecf9b56ea6832a670f372b3a3"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:30:07 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:30:07 2026 +0200"
      },
      "message": "CA: add tests for the cacheAs parameter\n\ncacheAs shipped without any test coverage. Cover the three behaviours it\npromises: a cache hit returns the stored result before any server contact,\nthe .rds extension is appended when missing and not doubled when present,\nand a cache miss writes a file that the next call reuses.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I5c88ee510815ee13f5cda08a0c4a269871b47df7\n"
    },
    {
      "commit": "ba15cffd49405e1ecf9b56ea6832a670f372b3a3",
      "tree": "c74eeaa69334bff5b8011599750ed172596d6ef4",
      "parents": [
        "424cb78ed98fa885704bba4cdddf52e7d6f7962c"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:19:56 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:19:56 2026 +0200"
      },
      "message": "CA: mark multi-VC comparison columns as experimental\n\nThe comparison column layout is still settling. Badge the section\nexperimental and say plainly that names and semantics may change without a\ndeprecation cycle, so that shipping it does not lock the current column\nnames in place.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I75c0042607cc9ae61ce9b1a904982509276e00eb\n"
    },
    {
      "commit": "424cb78ed98fa885704bba4cdddf52e7d6f7962c",
      "tree": "abaaa79316bdbd2e1a20fdfe966f02349f13902f",
      "parents": [
        "9525334f18cff3af96782cdf92c3f8dc0b84d2ad"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:19:29 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:19:29 2026 +0200"
      },
      "message": "CA: report imputation in multi-VC comparisons when verbose\n\nImputation was silent, so a result whose top max_delta rows are entirely\npresence/absence artifacts looked no different from one built on observed\nscores throughout. Pass the connection\u0027s verbosity into\nadd_multi_vc_comparisons() and report how many node/collocate combinations\nand label cells were imputed, pointing at the `imputed` column and\nqueryMissingScores.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I5159483452595f38d09f06411b64a7327814977f\n"
    },
    {
      "commit": "9525334f18cff3af96782cdf92c3f8dc0b84d2ad",
      "tree": "d4c5a45efa5e0bdabfb3d5b48d93c2e12a6ffe4c",
      "parents": [
        "d7bb5cb7154a01e7493369ccb929aa2a3f237748"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:18:43 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:18:43 2026 +0200"
      },
      "message": "CA: document how to read multi-VC comparison columns\n\nAdd a \"Interpreting multi-VC comparisons\" section spelling out the three\nproperties that are easy to misread: deltas involving imputed cells describe\npresence/absence rather than contrast, imputed values are relative to the\nresult set they were computed from and so are not comparable across calls,\nand winner/loser columns order point estimates without any notion of\nuncertainty (unlike ci()). Also note that ranks and percentile ranks are\ncomputed within each label over candidate sets of differing size.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I4744d4d9742c7a46dcdb5b4bca9138190f6b73d2\n"
    },
    {
      "commit": "d7bb5cb7154a01e7493369ccb929aa2a3f237748",
      "tree": "9736188bd65f1107c2223bccc02da677f2bbc516",
      "parents": [
        "3b091c002f69701cfa4b40434dc3a9408d155493"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:18:02 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 31 10:18:02 2026 +0200"
      },
      "message": "CA: flag imputed cells in multi-VC comparisons\n\nWhen a collocate is attested in one virtual corpus but not in another,\nadd_multi_vc_comparisons() imputes the missing scores from a pooled floor.\nThe resulting delta/winner/loser columns then describe presence vs. absence\nrather than a measured contrast, and nothing in the output said so.\n\nRecord the missingness pattern before imputation and expose it as\n`imputed_\u003clabel\u003e` (per label), `n_imputed` (count) and `imputed` (any), so\nthat `filter(!imputed)` keeps only collocates attested in every compared\nvirtual corpus.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I25fb0196f1b75519c126130fc19bc62d40675e17\n"
    },
    {
      "commit": "3b091c002f69701cfa4b40434dc3a9408d155493",
      "tree": "db54d74d1544c57fa823a652af1922a05c980558",
      "parents": [
        "209b52ca4d0a81acbc761e9ebf759f9fc6f29e11"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Jul 06 15:33:12 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Jul 06 15:33:12 2026 +0200"
      },
      "message": "Make morph pipe-separator test resilient to transient API issues\n\nThe live korap.dnb.de call can occasionally return no morph data for\nthe fetched match (e.g. under concurrent CI matrix load), causing a\nhard test failure unrelated to actual code correctness. Skip instead\nof failing when no morphological data comes back.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I1694bcd3f1e51d2e33251949715f0d045e91b074\n"
    },
    {
      "commit": "209b52ca4d0a81acbc761e9ebf759f9fc6f29e11",
      "tree": "b85b07fb584c9213945c53da7c08b715fa1499ba",
      "parents": [
        "9c53e4171317c646bacdfe8d73b1ab128635700a"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:14:36 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:15:25 2026 +0200"
      },
      "message": "Bump roxygen2 version to 8.0.0\n\nChange-Id: Ib5f5c66bd3db80d147370d2f16fc1c340240477c\n"
    },
    {
      "commit": "9c53e4171317c646bacdfe8d73b1ab128635700a",
      "tree": "90b09d08c51d63a81248703053fe3c313459c24b",
      "parents": [
        "9db18916673b89e148edd7090480ece1a304c0fa"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:13:44 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:15:17 2026 +0200"
      },
      "message": "Make collocationScoreQuery() accept a vector of collocates\n\nChange-Id: I719c7577393f352fcfebe740a13fbf0daf790d3c\n"
    },
    {
      "commit": "9db18916673b89e148edd7090480ece1a304c0fa",
      "tree": "6cb3dbd3817c03b165dd9d92f0101baf95b6ac58",
      "parents": [
        "c728a351092f81b5ef34256b45a54f537a85f83e"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:11:29 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:11:29 2026 +0200"
      },
      "message": "Update .Rbuildignore\n\nChange-Id: I68bc6702b057f620cd563311e4661e3559719518\n"
    },
    {
      "commit": "c728a351092f81b5ef34256b45a54f537a85f83e",
      "tree": "4810fc3cc69297bf5a6e1bb61880a6cd924b7b7e",
      "parents": [
        "09b1c086fba9f2b0dc7b41caec65b7c2c3010403"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:07:00 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Jun 21 12:07:00 2026 +0200"
      },
      "message": "Fix accessToken in fetch annotations test\n\nChange-Id: I7cf5076ec49b25f2ee3ffbbdfc19bd2ea0cb1fbd\n"
    },
    {
      "commit": "09b1c086fba9f2b0dc7b41caec65b7c2c3010403",
      "tree": "e2a4a13c01e092a7a24dfded5da35b09992f754e",
      "parents": [
        "325a3ab7a5889d700bf002714ae27c28c6339147"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri May 01 14:45:47 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri May 01 15:48:45 2026 +0200"
      },
      "message": "Add winner and loser URLs to multi-VC collocation comparisons\n\nChange-Id: Ia3bea5f400713c6b513e1cc1033c9c5c869d957f\n"
    },
    {
      "commit": "325a3ab7a5889d700bf002714ae27c28c6339147",
      "tree": "a68d09234a9d05f14b088439ed2fa4b87c2e129f",
      "parents": [
        "db2fabd236f9a6cd9f8e5c835939e4fb9dc1275f"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri May 01 14:45:23 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri May 01 14:45:23 2026 +0200"
      },
      "message": "Update .gitignore and .Rbuildignore\n\nChange-Id: Ice83a1dd0b4aa93b4797e348824e577ce8fcf3a1\n"
    },
    {
      "commit": "db2fabd236f9a6cd9f8e5c835939e4fb9dc1275f",
      "tree": "00851274b27bbd69a55e33dcbf456b76940053b2",
      "parents": [
        "9ab905857faf08727edad6940ce27fca663f46ad"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Apr 27 15:01:37 2026 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri May 01 13:34:36 2026 +0200"
      },
      "message": "feat(collocationAnalysis): add cacheAs parameter for result caching\n\nAdd a `cacheAs` parameter that accepts a file path (with automatic\n`.rds` extension if omitted). If the file exists, the cached result\nis returned immediately without contacting the server. Otherwise the\nanalysis runs normally and the result is saved to the file.\n\nCo-authored-by: Copilot \u003ccopilot@github.com\u003e\nChange-Id: I60f73a5a824e637d572a7b21b6ea80868a31b4d4\n"
    },
    {
      "commit": "9ab905857faf08727edad6940ce27fca663f46ad",
      "tree": "b271fade8433bfaa2c2a2335a3443f79f1881c7e",
      "parents": [
        "2b0b0a18a6539813e9ff807c31c72171539fe0bf"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 14:59:38 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "Update NEWS.md\n\nChange-Id: Ib1cdb5735f4854bf2bd363aa87876cf943768ba8\n"
    },
    {
      "commit": "2b0b0a18a6539813e9ff807c31c72171539fe0bf",
      "tree": "01f09118f6165ad7579edb9f88a01c391d93ad97",
      "parents": [
        "0a29263ffc80e12affaa0de9ef87b5af37d66d0b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 14:49:14 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "CA: fix score threshold in recursive CA\n\nChange-Id: I439a29559fab741bbb80c23591d1c64e99d1b0b6\n"
    },
    {
      "commit": "0a29263ffc80e12affaa0de9ef87b5af37d66d0b",
      "tree": "7aafb8e96897645d9789ceafb65f1a46f8a7a13f",
      "parents": [
        "c79155bca7cd0732c0bcb2557c288626f0ca4539"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 14:04:36 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "CA: Inject focus into to result webUIRequestUrls\n\nif appropriate to improve the immediate visibility of the actual\ncollocations.\n\nChange-Id: I728e61701bf4fc620b40077da54a11506e6e941c\n"
    },
    {
      "commit": "c79155bca7cd0732c0bcb2557c288626f0ca4539",
      "tree": "3383d26d0a0b07b543a64076862a697f76abb84c",
      "parents": [
        "de679ea56c5092bd984d091afb62c2c630f473b5"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 13:42:55 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "Ignore first letter case in stopwords\n\nChange-Id: Ibe0301e89c2602bd59b4a6d91de3437e413e9c3f\n"
    },
    {
      "commit": "de679ea56c5092bd984d091afb62c2c630f473b5",
      "tree": "b50df090b7365662e2e246851a845835d6c190f8",
      "parents": [
        "4cbb547fd9e924a2c566f166924590189e75f7ed"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 13:14:51 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "CA: add queryMissingScores parameter\n\nIf TRUE, attempt to retrieve corpus-based association scores for\nvc/collocate combinations that would otherwise be imputed, by\nre-querying the KorAP backend without applying the collocate frequency\nthreshold.\n\nChange-Id: I7d2707e16d6efab3515e4cebef4985e8b780a116\n"
    },
    {
      "commit": "4cbb547fd9e924a2c566f166924590189e75f7ed",
      "tree": "e563439ab3c6b979e1e5b571bc30e45bedd0319a",
      "parents": [
        "91f35179c7604d541f3a9907eeb553b9f37043b5"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 12:15:25 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "CA: add some more info on how missing values are imputed\n\nChange-Id: I0268e5ad26d91300e425588c9f07eb32d45171d1\n"
    },
    {
      "commit": "91f35179c7604d541f3a9907eeb553b9f37043b5",
      "tree": "40d5ced599d30eda7657490337eaad47c8b43878",
      "parents": [
        "77852b2af68bdb578421aea4efb97ef2fa51320d"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 11:36:53 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "Add missing rlang dependency in DESCRIPTION\n\nChange-Id: I50749277dc1f3fb91d5ec944fa4cb8b173037f32\n"
    },
    {
      "commit": "77852b2af68bdb578421aea4efb97ef2fa51320d",
      "tree": "63a2852821497543071202e6e4a65431b0809934",
      "parents": [
        "130a2a29eb3b593878dc2ac410e8a2b716d64e01"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 11:35:34 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "Remove redundant thresholdScore parameter from add_multi_vc_comparisons function\n\nChange-Id: I3a0077497f52d94e0b63d90bca0812c7e3d0c9d6\n"
    },
    {
      "commit": "130a2a29eb3b593878dc2ac410e8a2b716d64e01",
      "tree": "3a50e5d226336ac30a7011ceec44a0e74e543919",
      "parents": [
        "9894a37ab8a660bca79e94c5480da5428e357e4f"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 16:09:23 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:02:21 2025 +0200"
      },
      "message": "CA: add percentile ranks and documentation\n\nChange-Id: I3a0c6aab970db5f4685b03164b20e0489e03799f\n"
    },
    {
      "commit": "9894a37ab8a660bca79e94c5480da5428e357e4f",
      "tree": "6ce7350d737c086589cbf2c37d97645896180cec",
      "parents": [
        "28a29845b877fb28ee76196b67f585fd89344877"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 14:51:29 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Oct 19 15:01:19 2025 +0200"
      },
      "message": "CA: replace NA dampening factor with missingScoreQuantile\n\nBetter use distributional priors instead of raw minima.\n\nChange-Id: I85d77a63c1bc06c8f6398ddac75deec52f1ca96a\n"
    },
    {
      "commit": "28a29845b877fb28ee76196b67f585fd89344877",
      "tree": "3e0b032275070a5fe2cfccc40a6ee04da49fa0f2",
      "parents": [
        "b2862d4cd478b6ec38f89cb38472dd4b416b3224"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 12:25:09 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 14:07:27 2025 +0200"
      },
      "message": "CA: add measure based ranks\n\nChange-Id: I84dacfe9f61e9b65268b241bc8adf82c4cc4adc3\n"
    },
    {
      "commit": "b2862d4cd478b6ec38f89cb38472dd4b416b3224",
      "tree": "b89753066c8baaa626421fc1097a19a9e60374b9",
      "parents": [
        "5e35d7a5e7713a91fe8672cf9d30402298a20a72"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 10:17:49 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 10:17:49 2025 +0200"
      },
      "message": "CA: introduce max_delta_\u003cscore\u003e\n\nChange-Id: I4c3ccf374017c46051bec11cf2a836df511ea586\n"
    },
    {
      "commit": "5e35d7a5e7713a91fe8672cf9d30402298a20a72",
      "tree": "c7a905d394c324cc5f7a61c4206e6e0b5ac6e319",
      "parents": [
        "e34a8be915170d1cc1bc61b63369d3e562ab3694"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Oct 17 21:21:22 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sat Oct 18 09:39:38 2025 +0200"
      },
      "message": "CA: add winner columns\n\nChange-Id: Ia6ec4821d08352f2044e8a7101880d75419d995d\n"
    },
    {
      "commit": "e34a8be915170d1cc1bc61b63369d3e562ab3694",
      "tree": "f17d8a4185aba582c01b0f0b58c9e857707b3e4e",
      "parents": [
        "e31322eb3446a24a30fb091b92ffe8ffd0c06d09"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Oct 17 20:13:42 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Oct 17 20:51:30 2025 +0200"
      },
      "message": "CA: support named vc list and vcLabel parameter to specify labels\n\nChange-Id: I983e589e9231f678141e8798effcfcc652ca63f5\n"
    },
    {
      "commit": "e31322eb3446a24a30fb091b92ffe8ffd0c06d09",
      "tree": "6f4b68ece27f7aebdeeb937deddf917ffc6acd8e",
      "parents": [
        "c4540a2d80f127afc94ec61c3a336fa7f79cb35e"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Oct 17 18:55:36 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Oct 17 18:55:36 2025 +0200"
      },
      "message": "Fix label issue in multi-vc CA\n\nChange-Id: I9df9c648851cd65812aec509a4ed9abe5c1691ba\n"
    },
    {
      "commit": "c4540a2d80f127afc94ec61c3a336fa7f79cb35e",
      "tree": "11308627deb705b1b68a098f4527dabbe73c93bb",
      "parents": [
        "a25fbd999afde4045580182feeca23ad719c1378"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Oct 14 17:39:53 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Oct 14 17:39:53 2025 +0200"
      },
      "message": "Add delta columns for CA with multiple VCs\n\nChange-Id: Ie7d7bbfec226277f07e0f089e8ed6e847ca048f2\n"
    },
    {
      "commit": "a25fbd999afde4045580182feeca23ad719c1378",
      "tree": "b8d933890c957563b387996c8368f71530d985aa",
      "parents": [
        "4a2fee0fc96d8913cb02026b37cc671f526a2f6d"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Oct 14 17:38:09 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Oct 14 17:38:09 2025 +0200"
      },
      "message": "Get rid of empty sequence warning in CA\n\nChange-Id: I39d239f1a49871e975b9f60db434c68703cd84fd\n"
    },
    {
      "commit": "4a2fee0fc96d8913cb02026b37cc671f526a2f6d",
      "tree": "f39f1275c6dd331632569ce6b6310d9bfeb83cd9",
      "parents": [
        "d9aa0637236840fc6220b5a47c2a643172ba435c"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Oct 13 13:27:09 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Oct 13 13:27:09 2025 +0200"
      },
      "message": "Add labels in collocationAnalysis when called with vectors\n\nChange-Id: I78f4e6a1eeb59302416d38d160b29267666d50b1\n"
    },
    {
      "commit": "d9aa0637236840fc6220b5a47c2a643172ba435c",
      "tree": "4edd1e83618660492a2704b5fb38ad525f0f88d8",
      "parents": [
        "1229bc6555b20fcb398e76437a6a4573ecf022b9"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Oct 13 10:11:52 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Oct 13 10:11:52 2025 +0200"
      },
      "message": "Bump to dev version 1.2.1.9000\n\nChange-Id: I0ae5285f110d02b3039031eb42f7458d432b39e2\n"
    },
    {
      "commit": "1229bc6555b20fcb398e76437a6a4573ecf022b9",
      "tree": "19a74e47623d5e4252c2420864cddedf4284d605",
      "parents": [
        "a6ab8a18b22b9975e2668cdb1598d53b5867d8ac"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 17:10:31 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 17:10:31 2025 +0200"
      },
      "message": "Update CRAN comments\n\nChange-Id: Iaa65826f0bf24f4c9250dc7d470ddbaea4ccf578\n"
    },
    {
      "commit": "a6ab8a18b22b9975e2668cdb1598d53b5867d8ac",
      "tree": "baa7a9d64b42ac22337d4e442f6e886ba6112aae",
      "parents": [
        "41420074bc26a3effcd7f574377df774274b8732"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 15:03:55 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 17:10:17 2025 +0200"
      },
      "message": "Prepare new bug fix version 1.2.1\n\nChange-Id: Ia8d7f7982940a57e56eaeccf59845c4c749737e0\n"
    },
    {
      "commit": "41420074bc26a3effcd7f574377df774274b8732",
      "tree": "344cbd7e9c19d311a1e3db00b45cd6e0d981f21c",
      "parents": [
        "bdedd0227361999a3c456de06a23988cf32c9744"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 15:13:40 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 15:16:52 2025 +0200"
      },
      "message": "Revert \"warn on rewrites\"\n\nThis reverts commit 336c85d5c1d3986e1846c2b7e5dee6a4c40192e9.\n\nChange-Id: I1948894db742a6dfbb81a2c6cc82dd012330081f\n"
    },
    {
      "commit": "bdedd0227361999a3c456de06a23988cf32c9744",
      "tree": "5e4038d30e6bc6e88bcbf0de9de4664d0f24bcf2",
      "parents": [
        "cd4521884fd23558757338fcbbf6e67702f9a780"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:14:15 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:53:00 2025 +0200"
      },
      "message": "Switch all annotation parsing to xml2\n\nChange-Id: I047b6ce1debb88ff20912c60743221fe33f70b7d\n"
    },
    {
      "commit": "cd4521884fd23558757338fcbbf6e67702f9a780",
      "tree": "db32df9430c4d52b629dbe9368782d8174f8a9b0",
      "parents": [
        "336c85d5c1d3986e1846c2b7e5dee6a4c40192e9"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 13:28:41 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:53:00 2025 +0200"
      },
      "message": "Fix fetchAnnotations getting all morph values\n\nNow using xml2 package to properly parse the query result\n\nresolves #30\n\nChange-Id: I827cae94791f14ce0955352fd64fd7e5683a92e6\n"
    },
    {
      "commit": "336c85d5c1d3986e1846c2b7e5dee6a4c40192e9",
      "tree": "06fbc56972df571c21f37751257dec3882783c54",
      "parents": [
        "a02f1935f26b9440a748a41feecac1c676e98c37"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Jul 24 13:52:03 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:42:38 2025 +0200"
      },
      "message": "warn on rewrites\n\nChange-Id: Ib7f86993eb3febaaaeeb25b0672e4f3ab91cba1c\n"
    },
    {
      "commit": "a02f1935f26b9440a748a41feecac1c676e98c37",
      "tree": "4495bb52d8a941b138648a68e0ad9672b17023dc",
      "parents": [
        "d617979cdcfbf445db94a8646ca70032908b419e"
      ],
      "author": {
        "name": "feldmueller",
        "email": "feldmueller@posteo.de",
        "time": "Mon Sep 15 16:38:06 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:41:53 2025 +0200"
      },
      "message": "change format of annotation_snippet column for compatibility with Python client\n\nChange-Id: Id6bd21cf45fe01d4646495e9d7a3ffde11f13d14\n"
    },
    {
      "commit": "d617979cdcfbf445db94a8646ca70032908b419e",
      "tree": "403f4b78a48a15f14c59777ffd5972b32a6e76ec",
      "parents": [
        "9de0c80a66378116f0d229120822ac9c4509f5b4"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 16 10:39:11 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Thu Oct 09 14:41:51 2025 +0200"
      },
      "message": "Bump to dev version 1.2.0.9000\n\nChange-Id: I36c1895fd7a47ca012b907585c8b809b937eb447\n"
    },
    {
      "commit": "9de0c80a66378116f0d229120822ac9c4509f5b4",
      "tree": "45ace3c8f304d4ed8c54d20c9682f29f7222be3e",
      "parents": [
        "2052bde488066f2d3731aece905e3a4d6f5ec235"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 17:23:33 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 17:26:55 2025 +0200"
      },
      "message": "Bump version to v1.2.0\n\nChange-Id: Ieed0bb859c79b0344018c7324bea79a513edb15e\n"
    },
    {
      "commit": "2052bde488066f2d3731aece905e3a4d6f5ec235",
      "tree": "7866c7f32bf5343f6f5cdfa88e5380b910f6a371",
      "parents": [
        "39da9dcff91c473fbf9211e18d821ba62ccb1d2c"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 14:44:49 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 14:44:49 2025 +0200"
      },
      "message": "CI: Make codecov less demanding\n\nChange-Id: I80b4497b611ad5f0e4f3e595c5ee4e938a06daca\n"
    },
    {
      "commit": "39da9dcff91c473fbf9211e18d821ba62ccb1d2c",
      "tree": "923ba6d5b0918ef75661852730dc2770d117ad50",
      "parents": [
        "1a295ad676d3e47ca4098f19af6b0a6ab00bb6f1"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 13:54:40 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 13:54:40 2025 +0200"
      },
      "message": "Allow overriding verbosity default via env var KORAP_VERBOSE\n\nChange-Id: I8a2e32f24c22f2039b335cd000c610ba5ff3da08\n"
    },
    {
      "commit": "1a295ad676d3e47ca4098f19af6b0a6ab00bb6f1",
      "tree": "caa66267d1ab747a6b7d7b929bcc8f1ebf0a67ee",
      "parents": [
        "0af7593c5168aae13fad77846ced142bb93118a3"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 13:52:52 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 10 13:52:52 2025 +0200"
      },
      "message": "Bump RoxygenNote from 7.3.2 to 7.3.3\n\nChange-Id: I4c1a06f76f61d1d74942f863ee01d236bc331101\n"
    },
    {
      "commit": "0af7593c5168aae13fad77846ced142bb93118a3",
      "tree": "a5c074d6e8335e042266fc36c3611e1f782ea58e",
      "parents": [
        "6aa5a0d81be19ede35ca1edbd3f663aef6f3ec75"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 09 18:14:16 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Tue Sep 09 18:55:45 2025 +0200"
      },
      "message": "Fix fetchAnnotations documentation mismatches\n\nChange-Id: I2dc7bc69ce64492780ee1f67fea03e00bbc034ba\n"
    },
    {
      "commit": "6aa5a0d81be19ede35ca1edbd3f663aef6f3ec75",
      "tree": "94c1008a180b7ace1b0642bf543d9ed3a38230b6",
      "parents": [
        "0a726303ec556e738b401074e65ed29b8defa08b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 08 17:51:47 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 08 17:51:47 2025 +0200"
      },
      "message": "Fix some CRAN policy issues\n\nChange-Id: I6862ea1bfbadbaf5d6090b6655c21ecf66650c16\n"
    },
    {
      "commit": "0a726303ec556e738b401074e65ed29b8defa08b",
      "tree": "079da1b8fc631ed9ca08c65d2a99fc618db017e3",
      "parents": [
        "b6b34756d7cde0fbe12f6964ad640afb65fcfcd7"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 08 17:09:36 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 08 17:09:36 2025 +0200"
      },
      "message": "Update NEWS.md\n\nChange-Id: If8f451ee918da538a27643a6a6b9c66fcdecb51d\n"
    },
    {
      "commit": "b6b34756d7cde0fbe12f6964ad640afb65fcfcd7",
      "tree": "875330f6111fbf2da2a8d822fef225f7328350f4",
      "parents": [
        "2baf5c53cdb431735ce4006182344d817f6fa4dd"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 05 17:11:06 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 05 17:11:06 2025 +0200"
      },
      "message": "Add test for parse_xml_annotations\n\nChange-Id: Ib34b18aedd3fd0b52dea99141540bb7da2700b00\n"
    },
    {
      "commit": "2baf5c53cdb431735ce4006182344d817f6fa4dd",
      "tree": "f8df273f2ba60514760ae9b3614486c7e334a321",
      "parents": [
        "93787d52e349fae2d6b1a9e2a2ca07bf1ad5dd60"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 05 16:41:11 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Fri Sep 05 16:41:11 2025 +0200"
      },
      "message": "Increase fetchAnnotation test coverage according to codecov\n\nChange-Id: I0c8c0f0e7196082ddb42a37001f62a2958ea13e1\n"
    },
    {
      "commit": "93787d52e349fae2d6b1a9e2a2ca07bf1ad5dd60",
      "tree": "d42eabe0fd2b40c13e21cc31cebae12c301315d4",
      "parents": [
        "560b591ea7e4acefff9892d2a1f10cda0d139340"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 03 13:33:25 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Wed Sep 03 13:33:25 2025 +0200"
      },
      "message": "Add overwrite parameter to fetchAnnotations\n\nChange-Id: I395dbcb44a18e04679232bdc65b4e2912836e4fa\n"
    },
    {
      "commit": "560b591ea7e4acefff9892d2a1f10cda0d139340",
      "tree": "d0516854094348a767048130e087f6f105e6e497",
      "parents": [
        "705b9494b570e9142d2210290286cf0e0e97eb54"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 01 17:36:13 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Sep 01 17:36:13 2025 +0200"
      },
      "message": "Fix annotation parsing in fetchAnnotations\n\nResolves #27\n\nChange-Id: Id0fc0cc99835926f75e2679ce10c407763bf7dc3\n"
    },
    {
      "commit": "705b9494b570e9142d2210290286cf0e0e97eb54",
      "tree": "ef38ae28a9e7d9f2cd442e031b9562b8f6e454d5",
      "parents": [
        "c1bd08179072fde831f6e767fd185cb5d159fc25"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 18 10:38:04 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 18 10:38:04 2025 +0200"
      },
      "message": "Add Bremen to Bremen vc def in regional demo\n\nChange-Id: Ia65dc58e77efd9782c59a1636938d3c88376a3e9\n"
    },
    {
      "commit": "c1bd08179072fde831f6e767fd185cb5d159fc25",
      "tree": "b173feb2425daefa9d79c141878c2094968a5a34",
      "parents": [
        "9b4295a64d2fd2716f93cde688a04c006b1b3a28"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 18 10:10:26 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 18 10:10:26 2025 +0200"
      },
      "message": "Add Magdeburg to Sachsen-Anhalt vc def in regional demo\n\nChange-Id: Ieb4f794524fc1c1ff68c8d80e04ed5647195d13d\n"
    },
    {
      "commit": "9b4295a64d2fd2716f93cde688a04c006b1b3a28",
      "tree": "1731e3967d47dd556b1c9b98d98724b2bc953a4f",
      "parents": [
        "0b7c50d8e30dfccd550f8b8e06d1c13d3e4fce2c"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 18:10:24 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Mon Aug 18 10:09:19 2025 +0200"
      },
      "message": "Add interactive highcharter function to regional demo\n\nChange-Id: I049e04bb4ced706844bc341a12c82071f8685e40\n"
    },
    {
      "commit": "0b7c50d8e30dfccd550f8b8e06d1c13d3e4fce2c",
      "tree": "b3820c2ccfa46709c3477992e63924d7e4565154",
      "parents": [
        "0e18020e8bc820a0dc9de88aaa2026202b826fb3"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 18:09:20 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 18:09:20 2025 +0200"
      },
      "message": "Add map caching to regional demo\n\nChange-Id: I450130d35ba1c55a1b1b4327d805d5d3cb9bf4e9\n"
    },
    {
      "commit": "0e18020e8bc820a0dc9de88aaa2026202b826fb3",
      "tree": "9e36a901feb64837667997beffe7cbf641124926",
      "parents": [
        "4d8824c5c797bbd64f20c1c5c13b8223719a045b"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 14:09:20 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 14:09:20 2025 +0200"
      },
      "message": "Upgrade regional demo to GADM 4.1\n\nChange-Id: Ic170bb8162595cc0f4cbc32e7f9ebf4a3b534382\n"
    },
    {
      "commit": "4d8824c5c797bbd64f20c1c5c13b8223719a045b",
      "tree": "a4c0b8226bbc35235c9cefba7f07626daf1293fb",
      "parents": [
        "6b27e2f0ea51c824506daf56a0e2e9ef92bd49f6"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 12:37:24 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 12:37:24 2025 +0200"
      },
      "message": "Use sf package for sp tidying in regional demo\n\nResolves #29\n\nChange-Id: Ie169a9b7f421c7dcfc21e8eb7fb9fb5f90216555\n"
    },
    {
      "commit": "6b27e2f0ea51c824506daf56a0e2e9ef92bd49f6",
      "tree": "486848e0091f19dfea6ad45ebd41fce0afdf500a",
      "parents": [
        "16b9d0ce7449965dda0e481d86147a12fcf39aba"
      ],
      "author": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 12:18:58 2025 +0200"
      },
      "committer": {
        "name": "Marc Kupietz",
        "email": "kupietz@ids-mannheim.de",
        "time": "Sun Aug 17 12:18:58 2025 +0200"
      },
      "message": "Fix link for geo data download in regional demo\n\nResolves #28\n\nChange-Id: I1bec65bc3889f6c1acd3e0788ae125a48d368ac2\n"
    }
  ],
  "next": "16b9d0ce7449965dda0e481d86147a12fcf39aba"
}
