strom-research 1.23.0-beta.4 → 1.24.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.cs.md CHANGED
@@ -5,15 +5,44 @@
5
5
  Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou na
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases) (anglicky).
7
7
 
8
+ ## 1.24.0
9
+
10
+ *Připravuje se: bety do 1.24.0-beta.1. Oddíl bude úplný s vydáním.*
11
+
12
+ - **Místa zmapovaná jednou pro všechny výzkumy na tomto počítači.** Místo, které jiný výzkum tady už přiřadil k regionům
13
+ dějin, se převezme, když jde jistě o totéž místo (stejný název a stejné souřadnice, farnost nebo okres) a všechny
14
+ výzkumy ho přiřazují stejně; přechází jen přiřazení místa, nic z rodiny. Místo stejného jména, které jistě totéž
15
+ není, dostane agent jako návrh; sám přiřazuje jen zbytek. `strom history adopt --dry-run` řekne, co by se převzalo.
16
+ - **Opravy výzkumu pro aplikaci Strom.** Most vypíše, co `strom fixes` ve výzkumu nabízí (název, co dělá, kolik
17
+ položek, stav, jestli jde vrátit), zdarma a bez zápisu; odkaz `strom-research://fixes` otevře opravu v terminálu
18
+ výzkumu, kde se oprava i její vrácení vždy nejdřív potvrzuje.
19
+ - **Stránka každého skenu v aplikaci Strom.** Soubor pro Strom dává teď každému prameni stránku jeho skenu v online
20
+ archivu: stránku jeho prvního obrázku, jinak vlastní adresu pramene. Aplikace Strom ji nabídne u výřezů, které soubor
21
+ vynechává, a u pramenů bez výřezu. Jen veřejná webová stránka, nikdy adresa fondu; standardní soubor GEDCOM nechává
22
+ adresu v poznámce.
23
+ - **Číslo domu a věk tak, jak byly zapsány.** Slovo pro číslo domu („No.“, „čp.“) se dává jen před samotné číslo;
24
+ ulice s číslem jde do souboru tak, jak je. Věk „05y“ se čte jako 5 let. Obojí se z aplikace Strom vrací stejné,
25
+ není to úprava uživatele.
26
+ - **Otázka na dějiny říká, kde platí.** Zapnutí nebo vypnutí událostí dějin platí pro všechny výzkumy na tomto
27
+ počítači; otázka to říká, i jak to změnit jen pro jeden výzkum.
28
+ - **Slabý nebo odmítnutý model agenta hlásí doctor.** Když výzkum nemá zvolený model a vlastní výchozí model agenta je
29
+ ten, který výzkum shledal pro svou práci slabým nebo odmítnutým, `strom doctor` varuje a dá příkaz k volbě; sám
30
+ nikdy nevolí.
31
+ - **strom z npm drží svůj kanál.** strom nainstalovaný přes npm zůstává na kanálu, ze kterého byl nainstalován, i po
32
+ vydání; kanál zvolený přes `strom update --channel` se pro něj také pamatuje.
33
+ - **Příkaz, který selže, vrátí jen své.** Příkaz, který cestou uložil a pak selhal, vrátí jen to, co přišlo po jeho
34
+ uložení, takže výzkum nikdy nevypadá změněný mimo strom.
35
+
8
36
  ## 1.23.0
9
37
 
10
- *Připravuje se: bety do 1.23.0-beta.4. Oddíl bude úplný s vydáním.*
38
+ *30. 10. 2026 · patří k aplikaci Strom 3.18.0.*
11
39
 
12
40
  - **Osoba ukázaná zvoleným jménem.** Žena narozená pod jedním jménem, provdaná pod druhým a po rozvodu zase u prvního
13
41
  se dá ukazovat tímto jménem znovu, aniž by se přidávalo podruhé: `strom name primary <osoba> "<jméno>"` (a
14
42
  `--clear`), nebo `strom name add --primary`. Volba patří jen uživateli, nikdy se nečte ze záznamu; opravy, citace
15
43
  i synchronizace s aplikací Strom se dál řídí rodným jménem. Soubor pro Strom zvolené jméno označí, standardní soubor
16
- GEDCOM ho dá na první místo.
44
+ GEDCOM ho dá na první místo. Aplikace Strom 3.18.0 osobu tímto jménem ukazuje a jméno zvolené v ní se synchronizací
45
+ vrací do výzkumu.
17
46
  - **Soubor pro aplikaci Strom bez varování.** Export pro aplikaci Strom varoval před nestandardní značkou u každé
18
47
  osoby se zvoleným jménem a u několika značek zdrojů; kontrola teď zná všechny vlastní značky Stromu.
19
48
  - **Commit gitem navrch výzkumu zapečetěného dvěma klíči (Windows).** `strom check` radil zároveň `strom repair` i
package/CHANGELOG.de.md CHANGED
@@ -5,16 +5,48 @@
5
5
  Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Installationszeilen stehen bei
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases) (auf Englisch).
7
7
 
8
+ ## 1.24.0
9
+
10
+ *In Vorbereitung: die Betas bis 1.24.0-beta.1. Der Abschnitt ist mit dem Release vollständig.*
11
+
12
+ - **Orte einmal zugeordnet für jede Forschung auf diesem Computer.** Ein Ort, den eine andere Forschung hier schon den
13
+ Regionen der Geschichte zugeordnet hat, wird übernommen, wenn es sicher derselbe Ort ist (derselbe Name und dieselben
14
+ Koordinaten, Pfarrei oder derselbe Bezirk) und jede Forschung ihn gleich zuordnet; nur die Zuordnung des Orts geht
15
+ über, nichts von der Familie. Ein Ort gleichen Namens, der nicht sicher derselbe ist, geht als Vorschlag an den
16
+ Agenten; er ordnet nur den Rest zu. `strom history adopt --dry-run` sagt, was übernommen würde.
17
+ - **Die Korrekturen einer Forschung für die Strom-App.** Die Brücke listet, was `strom fixes` in der Forschung anbietet
18
+ (Titel, was sie tut, wie viele Einträge, ihr Stand, ob sie sich zurücknehmen lässt), kostenlos und ohne etwas zu
19
+ schreiben; der Link `strom-research://fixes` öffnet eine Korrektur im Terminal der Forschung, wo sie und ihre
20
+ Rücknahme immer zuerst bestätigt werden.
21
+ - **Die Seite jedes Scans in der Strom-App.** Die Strom-Datei gibt jetzt jeder Quelle die Seite ihres Scans im
22
+ Online-Archiv: die Seite ihres ersten Bildes, sonst die eigene Adresse der Quelle. Die Strom-App verlinkt sie bei den
23
+ Ausschnitten, die die Datei auslässt, und bei Quellen ohne Ausschnitt. Nur eine öffentliche Webseite, nie die Adresse
24
+ eines Bestands; die Standard-GEDCOM-Datei behält die Adresse in der Notiz.
25
+ - **Hausnummer und Alter, wie sie geschrieben wurden.** Das Wort für eine Hausnummer („No.“, „čp.“) steht nur vor
26
+ einer Zahl allein; eine Straße mit Nummer geht so in die Datei, wie sie ist. Ein Alter „05y“ gilt als 5 Jahre.
27
+ Beides kommt aus der Strom-App gleich zurück, keine Änderung des Benutzers.
28
+ - **Die Frage nach der Geschichte sagt, wo sie gilt.** Die Ereignisse der Geschichte ein- oder auszuschalten gilt für
29
+ jede Forschung auf diesem Computer; die Frage sagt es, und wie es sich für eine Forschung allein ändern lässt.
30
+ - **Ein schwaches oder abgelehntes Modell des Agenten meldet der Doctor.** Ist für die Forschung kein Modell gewählt und
31
+ das eigene Standardmodell des Agenten eines, das die Forschung für ihre Arbeit schwach oder abgelehnt fand, warnt
32
+ `strom doctor` und nennt den Befehl zur Wahl; selbst wählt er nie.
33
+ - **strom aus npm behält seinen Kanal.** Mit npm installiertes strom bleibt auf dem Kanal, aus dem es installiert
34
+ wurde, auch nach einer Veröffentlichung; ein mit `strom update --channel` gewählter Kanal bleibt dafür ebenfalls
35
+ gemerkt.
36
+ - **Ein gescheiterter Befehl nimmt nur das Seine zurück.** Ein Befehl, der unterwegs gespeichert hat und dann scheitert,
37
+ nimmt nur zurück, was nach dieser Speicherung kam, so wirkt die Forschung nie außerhalb von strom geändert.
38
+
8
39
  ## 1.23.0
9
40
 
10
- *In Vorbereitung: die Betas bis 1.23.0-beta.4. Der Abschnitt ist mit dem Release vollständig.*
41
+ *30.10.2026 · gehört zur Strom-App 3.18.0.*
11
42
 
12
43
  - **Eine Person unter dem gewählten Namen.** Eine Frau, unter einem Namen geboren, unter einem anderen verheiratet und
13
44
  nach einer Scheidung wieder beim ersten, lässt sich wieder unter diesem Namen zeigen, ohne dass er ein zweites Mal
14
45
  hinzukommt: `strom name primary <Person> "<Name>"` (und `--clear`) oder `strom name add --primary`. Die Wahl trifft
15
46
  allein der Nutzer, nie wird sie aus einem Eintrag gelesen; Korrekturen, Zitate und der Abgleich mit der Strom-App
16
47
  richten sich weiter nach dem Geburtsnamen. Die Strom-Datei markiert den gewählten Namen, die Standard-GEDCOM-Datei
17
- setzt ihn an die erste Stelle.
48
+ setzt ihn an die erste Stelle. Die Strom-App 3.18.0 zeigt die Person unter diesem Namen, und ein dort gewählter Name
49
+ kommt mit dem Abgleich zurück.
18
50
  - **Die Datei für die Strom-App ohne Warnungen.** Der Export für die Strom-App warnte bei jeder Person mit gewähltem
19
51
  Namen und bei mehreren Kennzeichen von Quellen vor einem nicht standardisierten Tag; die Prüfung kennt jetzt alle
20
52
  eigenen Tags von Strom.
package/CHANGELOG.md CHANGED
@@ -5,15 +5,46 @@ English · [Čeština](CHANGELOG.cs.md) · [Deutsch](CHANGELOG.de.md)
5
5
  The changes of each version in short. The full notes and the install lines are on
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases).
7
7
 
8
+ ## 1.24.0
9
+
10
+ *In preparation: the betas up to 1.24.0-beta.1. The section is complete with the release.*
11
+
12
+ - **Places mapped once for every research on this computer.** A place another research here has mapped to its
13
+ regions of history is taken over when it is surely the same place (the same name and the same coordinates, parish
14
+ or district) and every research maps it alike; only the place's map crosses, nothing of the family. A place of the
15
+ same name that is not surely the same is offered to the agent as a suggestion; the agent maps only the rest.
16
+ `strom history adopt --dry-run` says what would be taken.
17
+ - **The fixes of a research for the Strom app.** The bridge lists what `strom fixes` offers in the research (title,
18
+ what it does, how many items, its state, whether it can be put back), free and without writing anything; the link
19
+ `strom-research://fixes` opens a fix in the research's terminal, where setting it right or putting it back is
20
+ always asked first.
21
+ - **The page of each scan in the Strom app.** The Strom file now gives each source the page of its scan in the online
22
+ archive: the page of its first image, else the source's own address. The Strom app links it for the excerpts the
23
+ file leaves out and for the sources without an excerpt. Only a public web page, never a recordset's address; the
24
+ standard GEDCOM file keeps the address in the note.
25
+ - **A house number and an age as they were written.** The word for a house number ("No.", "čp.") is put only before
26
+ a number standing alone; a street with its number goes into the file as it is. An age of "05y" is read as 5 years.
27
+ Both come back from the Strom app the same, no edit of the user's.
28
+ - **The question about history says where it holds.** Turning the events of history on or off holds for every
29
+ research on this computer; the question says so, and how to change it for one research alone.
30
+ - **A weak or refused model of the agent said by the doctor.** When no model is chosen for the research and the
31
+ agent's own default is one the research found weak or refused for its work, `strom doctor` warns and gives the
32
+ command to choose one; it never chooses itself.
33
+ - **strom from npm keeps its channel.** strom installed with npm stays on the channel it was installed from, also
34
+ after a release; a channel chosen with `strom update --channel` is kept for it too.
35
+ - **A failed command takes back only its own.** A command that saved on the way and then failed takes back only what
36
+ came after its save, so the research never looks changed outside strom.
37
+
8
38
  ## 1.23.0
9
39
 
10
- *In preparation: the betas up to 1.23.0-beta.4. The section is complete with the release.*
40
+ *2026-10-30 · goes with the Strom app 3.18.0.*
11
41
 
12
42
  - **A person shown by the name chosen.** A woman born under one name, married under another and back at the first
13
43
  after a divorce can be shown by that name again without it being added twice: `strom name primary <person>
14
44
  "<name>"` (and `--clear`), or `strom name add --primary`. The choice is the user's alone, never read from a record;
15
45
  corrections, citations and the sync with the Strom app still go by the birth name. The Strom file marks the chosen
16
- name, the standard GEDCOM file gives it first.
46
+ name, the standard GEDCOM file gives it first. The Strom app 3.18.0 shows the person by it, and a name chosen there
47
+ comes back with the sync.
17
48
  - **The file for the Strom app without warnings.** Exporting for the Strom app warned of a non-standard tag on each
18
49
  person with a chosen name and on several marks of sources; the check now knows every tag of Strom's own.
19
50
  - **A commit made with git on top of a research sealed with two keys (Windows).** `strom check` advised `strom repair`
@@ -581,7 +581,7 @@
581
581
  "ui.timing": "Jak dlouho trvaly jednotlivé kroky (řádek k odeslání, když je strom pomalý):",
582
582
  "ui.doc.place": "kde výzkum leží",
583
583
  "ui.doc.place.cloud": "{where}: v {what} – každý soubor, do kterého strom nahlédne, může jít nejdřív po síti",
584
- "ui.doc.place.online": "z {looked} prohlédnutých souborů je {online} jen online (každý se při otevření stáhne celý)",
584
+ "ui.doc.place.online": "z {looked, plural, one {# prohlédnutého souboru} other {# prohlédnutých souborů}} {online, plural, one {je # jen online} few {jsou # jen online} other {je # jen online}} (každý se při otevření stáhne celý)",
585
585
  "ui.doc.place.network": "{where}: na síťovém disku ({what}) – každý soubor, do kterého strom nahlédne, se čte po síti, u tisíců skenů pomalu",
586
586
  "ui.doc.place.cloud.fix": "složku nechat vždy v tomto zařízení (OneDrive: v nabídce složky „Vždy zachovat na tomto zařízení“), nebo výzkum přesunout na disk tohoto počítače (strom setup v terminálu ho přesune); strom sám nic nestahuje",
587
587
  "ui.doc.place.network.fix": "výzkum přesunout na disk tohoto počítače (strom setup v terminálu ho přesune)",
@@ -604,6 +604,8 @@
604
604
  "ui.doc.knows": "agenti znají strom",
605
605
  "ui.doc.level": "agent smí",
606
606
  "ui.doc.model": "model",
607
+ "ui.doc.model.own.weak": "model pro výzkum není zvolen: {agent} pracuje se svým, {model} – rychlým či malým, na staré rukopisy slabým",
608
+ "ui.doc.model.own.refused": "model pro výzkum není zvolen: {agent} pracuje se svým, {model}, který v jeho seznamu pro tento účet není – odmítl by ho",
607
609
  "ui.doc.shortcut": "zástupce na ploše",
608
610
  "ui.doc.links": "odkazy z aplikace Strom",
609
611
  "ui.doc.links.ours": "ano",
@@ -2829,7 +2831,7 @@
2829
2831
  "ui.history.pace.default": " (výchozí)",
2830
2832
  "ui.history.pace.later": "Jak často, jde později změnit: strom config set experiments.historyPace sometimes|rare|idle.",
2831
2833
  "ui.history.pace.off": "vypnuto – dějiny se nehledají",
2832
- "ui.setup.history": "Hledat i události dějin v místech předků – války, epidemie, sčítání, změny státu (agent je hledá mezi sezeními rodinného výzkumu)? Jak často:",
2834
+ "ui.setup.history": "Hledat i události dějin v místech předků – války, epidemie, sčítání, změny státu (agent je hledá mezi sezeními rodinného výzkumu)? Platí pro všechny výzkumy na tomto počítači. Jak často:",
2833
2835
  "ui.alone.history": "Dějiny: {state}",
2834
2836
  "ui.alone.places": "Dějiny jednotlivých míst automaticky: {state}",
2835
2837
  "ui.alone.places.about": "Dějiny každého místa se souřadnicemi a jeho okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola – se hledají samy, jedno místo po druhém v tempu dějin, nejdřív místa, kde žilo nejvíc lidí. Jednou prohledané místo se znovu nehledá. Jedno místo se hledá na požádání vždy, i když je tohle vypnuté.",
@@ -2839,10 +2841,10 @@
2839
2841
  "ui.alone.regions.tree": "Dějiny regionů v tomto výzkumu: {state}",
2840
2842
  "ui.alone.placeHistory.tree": "Dějiny míst v tomto výzkumu: {state}",
2841
2843
  "ui.alone.tree.about": "Jen pro tento výzkum, přednost před nastavením tohoto počítače. Co se našlo, zůstává.",
2842
- "ui.history.offer": "Novinka této verze: události dějin v místech předků – války, epidemie, sčítání, změny státu, každá se zdrojem; aplikace Strom je ukáže v průběhu života. Zatím se nehledají a samo se nic nezapne.",
2844
+ "ui.history.offer": "Novinka této verze: události dějin v místech předků – války, epidemie, sčítání, změny státu, každá se zdrojem; aplikace Strom je ukáže v průběhu života. Zatím se nehledají a samo se nic nezapne. Volba platí pro všechny výzkumy na tomto počítači.",
2843
2845
  "ui.history.offer.no": "teď ne – nic se nezapne",
2844
- "ui.history.offer.later": "Dějiny se nehledají. Později: Nastavení → Samostatná práce agenta → Dějiny, nebo z aplikace Strom.",
2845
- "ui.history.offer.on": "Dějiny se hledají: {pace}. Jak často, jde změnit: Nastavení → Samostatná práce agenta → Dějiny, nebo z aplikace Strom.",
2846
+ "ui.history.offer.later": "Dějiny se nehledají. Později: Nastavení → Samostatná práce agenta → Dějiny, nebo z aplikace Strom. Jen pro jeden výzkum: Nastavení → Samostatná práce agenta → Dějiny regionů v tomto výzkumu (v menu toho výzkumu), nebo strom config set experiments.history on --for-tree.",
2847
+ "ui.history.offer.on": "Dějiny se hledají ve všech výzkumech na tomto počítači: {pace}. Jak často, jde změnit: Nastavení → Samostatná práce agenta → Dějiny, nebo z aplikace Strom. Jen pro jeden výzkum: Nastavení → Samostatná práce agenta → Dějiny regionů v tomto výzkumu (v menu toho výzkumu), nebo strom config set experiments.history off --for-tree.",
2846
2848
  "ui.consent.history.pace": "Hledat události dějin častěji – {pace}? Stojí to víc času agenta i čerpání předplatného.",
2847
2849
  "ui.consent.history.tree": "Hledat události dějin regionů v místech tohoto výzkumu – války, epidemie, sčítání, změny státu? Agent je hledá průběžně mezi sezeními rodinného výzkumu a stojí to jeho čas i čerpání předplatného.",
2848
2850
  "ui.consent.placeHistory": "Hledat na vyžádání dějiny místa a jeho okolí ve všech výzkumech na tomto počítači – požáry, povodně, bitvy poblíž, panství, farnost, škola? Každé vyžádané místo je jedno sezení agenta; stojí to jeho čas i čerpání předplatného.",
@@ -2871,6 +2873,7 @@
2871
2873
  "ui.link.experiment.archive": "Dokud je výzkum vedený jako archiv, události dějin se nehledají. Nic se nestalo.",
2872
2874
  "ui.link.experiment.waiting": "Na tomto výzkumu se na tomto počítači nepracuje, a tak se události dějin nehledají. Nic se nestalo.",
2873
2875
  "ui.link.what.history.place": "hledat dějiny místa {place} a okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola",
2876
+ "ui.link.what.fixes.undo": "vrátit, co oprava „{name}“ opravila",
2874
2877
  "ui.link.history.place.minutes": "Jedno sezení agenta, zhruba {from}–{to} minut; stojí to čas agenta i čerpání předplatného.",
2875
2878
  "ui.link.history.place.usd": "Taková sezení tu zatím stála {from}–{to}.",
2876
2879
  "ui.link.history.place.done": "Dějiny místa {place} a okolí jsou ve frontě první.",
@@ -581,7 +581,7 @@
581
581
  "ui.timing": "Wie lange die einzelnen Schritte dauerten (die Zeile zum Senden, wenn strom langsam ist):",
582
582
  "ui.doc.place": "wo die Forschung liegt",
583
583
  "ui.doc.place.cloud": "{where}: in {what} – jede Datei, in die strom schaut, kann zuerst über das Netz kommen",
584
- "ui.doc.place.online": "von {looked} angesehenen Dateien sind {online} nur online (jede wird beim Öffnen ganz heruntergeladen)",
584
+ "ui.doc.place.online": "von {looked, plural, one {# angesehenen Datei} other {# angesehenen Dateien}} {online, plural, one {ist # nur online} other {sind # nur online}} (jede wird beim Öffnen ganz heruntergeladen)",
585
585
  "ui.doc.place.network": "{where}: auf einem Netzlaufwerk ({what}) – jede Datei, in die strom schaut, wird über das Netz gelesen, bei Tausenden Scans langsam",
586
586
  "ui.doc.place.cloud.fix": "den Ordner immer auf diesem Gerät behalten (OneDrive: im Menü des Ordners „Immer auf diesem Gerät beibehalten“), oder die Forschung auf eine Platte dieses Computers verschieben (strom setup im Terminal verschiebt sie mit); strom selbst lädt nichts herunter",
587
587
  "ui.doc.place.network.fix": "die Forschung auf eine Platte dieses Computers verschieben (strom setup im Terminal verschiebt sie mit)",
@@ -604,6 +604,8 @@
604
604
  "ui.doc.knows": "Agenten kennen strom",
605
605
  "ui.doc.level": "der Agent darf",
606
606
  "ui.doc.model": "Modell",
607
+ "ui.doc.model.own.weak": "für die Forschung ist kein Modell gewählt: {agent} arbeitet mit dem eigenen, {model} – einem schnellen oder kleinen, für alte Handschriften zu schwach",
608
+ "ui.doc.model.own.refused": "für die Forschung ist kein Modell gewählt: {agent} arbeitet mit dem eigenen, {model}, das in seiner Liste für dieses Konto fehlt – es würde abgelehnt",
607
609
  "ui.doc.shortcut": "Desktop-Verknüpfung",
608
610
  "ui.doc.links": "Links aus der Strom-App",
609
611
  "ui.doc.links.ours": "ja",
@@ -2829,7 +2831,7 @@
2829
2831
  "ui.history.pace.default": " (Standard)",
2830
2832
  "ui.history.pace.later": "Wie oft, lässt sich später ändern: strom config set experiments.historyPace sometimes|rare|idle.",
2831
2833
  "ui.history.pace.off": "aus – keine Geschichte gesucht",
2832
- "ui.setup.history": "Auch die Ereignisse der Geschichte an den Orten der Vorfahren suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates (der Agent sucht sie zwischen den Sitzungen der Familienforschung)? Wie oft:",
2834
+ "ui.setup.history": "Auch die Ereignisse der Geschichte an den Orten der Vorfahren suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates (der Agent sucht sie zwischen den Sitzungen der Familienforschung)? Gilt für alle Forschungen auf diesem Computer. Wie oft:",
2833
2835
  "ui.alone.history": "Geschichte: {state}",
2834
2836
  "ui.alone.places": "Geschichte der einzelnen Orte automatisch: {state}",
2835
2837
  "ui.alone.places.about": "Die Geschichte jedes Ortes mit Koordinaten und seiner Umgebung – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule – wird von selbst gesucht, ein Ort nach dem anderen im Tempo der Geschichte, zuerst die Orte mit den meisten Menschen. Ein einmal durchsuchter Ort wird nicht wieder gesucht. Ein einzelner Ort wird auf Wunsch immer gesucht, auch wenn dies aus ist.",
@@ -2839,10 +2841,10 @@
2839
2841
  "ui.alone.regions.tree": "Geschichte der Regionen in dieser Forschung: {state}",
2840
2842
  "ui.alone.placeHistory.tree": "Geschichte der Orte in dieser Forschung: {state}",
2841
2843
  "ui.alone.tree.about": "Nur für diese Forschung, vor den Einstellungen dieses Computers. Was gefunden wurde, bleibt.",
2842
- "ui.history.offer": "Neu in dieser Version: die Ereignisse der Geschichte an den Orten der Vorfahren – Kriege, Epidemien, Volkszählungen, Änderungen des Staates, jedes mit seiner Quelle; die Strom-App zeigt sie im Lebenslauf. Noch nicht gesucht, nichts schaltet sich von selbst ein.",
2844
+ "ui.history.offer": "Neu in dieser Version: die Ereignisse der Geschichte an den Orten der Vorfahren – Kriege, Epidemien, Volkszählungen, Änderungen des Staates, jedes mit seiner Quelle; die Strom-App zeigt sie im Lebenslauf. Noch nicht gesucht, nichts schaltet sich von selbst ein. Die Wahl gilt für alle Forschungen auf diesem Computer.",
2843
2845
  "ui.history.offer.no": "jetzt nicht – nichts wird eingeschaltet",
2844
- "ui.history.offer.later": "Nicht gesucht. Später: Einstellungen → Der Agent allein → Geschichte, oder aus der Strom-App.",
2845
- "ui.history.offer.on": "Geschichte wird gesucht: {pace}. Wie oft, lässt sich ändern: Einstellungen → Der Agent allein → Geschichte, oder aus der Strom-App.",
2846
+ "ui.history.offer.later": "Nicht gesucht. Später: Einstellungen → Der Agent allein → Geschichte, oder aus der Strom-App. Nur für eine Forschung: Einstellungen → Der Agent allein → Geschichte der Regionen in dieser Forschung (im Menü dieser Forschung), oder strom config set experiments.history on --for-tree.",
2847
+ "ui.history.offer.on": "Geschichte wird in allen Forschungen auf diesem Computer gesucht: {pace}. Wie oft, lässt sich ändern: Einstellungen → Der Agent allein → Geschichte, oder aus der Strom-App. Nur für eine Forschung: Einstellungen → Der Agent allein → Geschichte der Regionen in dieser Forschung (im Menü dieser Forschung), oder strom config set experiments.history off --for-tree.",
2846
2848
  "ui.consent.history.pace": "Öfter nach den Ereignissen der Geschichte suchen – {pace}? Das kostet mehr Zeit des Agenten und mehr von der Nutzung des Abos.",
2847
2849
  "ui.consent.history.tree": "Die Ereignisse der Geschichte der Regionen an den Orten dieser Forschung suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates? Der Agent sucht sie ab und zu zwischen den Sitzungen der Familienforschung, und es kostet seine Zeit und die Nutzung des Abos.",
2848
2850
  "ui.consent.placeHistory": "Die Geschichte eines Ortes und seiner Umgebung auf Anfrage suchen, in allen Forschungen auf diesem Computer – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule? Jeder angefragte Ort ist eine Sitzung des Agenten; das kostet seine Zeit und die Nutzung des Abos.",
@@ -2871,6 +2873,7 @@
2871
2873
  "ui.link.experiment.archive": "Solange die Forschung als Archiv geführt wird, wird nach Ereignissen der Geschichte nicht gesucht. Es ist nichts geschehen.",
2872
2874
  "ui.link.experiment.waiting": "An dieser Forschung wird auf diesem Computer nicht gearbeitet, daher wird nach Ereignissen der Geschichte nicht gesucht. Es ist nichts geschehen.",
2873
2875
  "ui.link.what.history.place": "die Geschichte von {place} und Umgebung suchen – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule",
2876
+ "ui.link.what.fixes.undo": "zurücksetzen, was die Korrektur „{name}“ berichtigt hat",
2874
2877
  "ui.link.history.place.minutes": "Eine Sitzung des Agenten, etwa {from}–{to} Minuten; das kostet Zeit des Agenten und Nutzung des Abos.",
2875
2878
  "ui.link.history.place.usd": "Solche Sitzungen kosteten hier bisher {from}–{to}.",
2876
2879
  "ui.link.history.place.done": "Die Geschichte von {place} und Umgebung steht in der Warteschlange an erster Stelle.",
@@ -9,6 +9,8 @@ import { userHome } from "../core/paths.js";
9
9
  import { findAgent, withoutAgentMarks } from "../core/which.js";
10
10
  import { spawnAgent, stopTree } from "../runners/runner.js";
11
11
  import { PROFILES } from "./profiles.js";
12
+ import { agentSettingsSaid } from "./effort.js";
13
+ import { resolveKey, splitKey } from "../core/modelkey.js";
12
14
  /** Claude Code: its aliases (always the newest of each line). */
13
15
  const CLAUDE = [{ id: "opus" }, { id: "sonnet" }];
14
16
  /**
@@ -77,13 +79,17 @@ export function sameLineNewer(before, now) {
77
79
  return id(before) !== id(now) && line(before) === line(now) && !!line(now) && newer(version(before), version(now)) > 0;
78
80
  }
79
81
  const id = (m) => m.trim().toLowerCase();
82
+ /** Whether a model's name, or its maker's description of it, says it is a fast, small, cheap or older one. */
83
+ export function weakModel(m) {
84
+ return words(m.id).some((w) => WEAK.has(w)) || words(m.label ?? "").some((w) => WEAK.has(w)) || words(m.about ?? "").some((w) => WEAK_ABOUT.has(w));
85
+ }
80
86
  /**
81
87
  * The strong models of a list, in the order to offer them: never a fast, small or cheap one; the strongest line of a
82
88
  * maker first (Opus, Pro, Astra), then the one below (Sonnet, Sol), then the rest; makers in the order the agent lists
83
89
  * them (its own first), the newest version first, at most two of one line, three in all.
84
90
  */
85
91
  export function strongModels(list, max = 3) {
86
- const kept = list.filter((m) => !words(m.id).some((w) => WEAK.has(w)) && !words(m.label ?? "").some((w) => WEAK.has(w)) && !words(m.about ?? "").some((w) => WEAK_ABOUT.has(w)));
92
+ const kept = list.filter((m) => !weakModel(m));
87
93
  const tier = (m) => {
88
94
  const w = [...words(m.id), ...words(m.label ?? "")];
89
95
  return w.some((x) => TOP.has(x)) ? 2 : w.some((x) => HIGH.has(x)) ? 1 : 0;
@@ -255,3 +261,42 @@ export async function modelChoices(agent, env, ms = Number(env.STROM_MODELS_TIME
255
261
  return fallback();
256
262
  return { models: strong, source: "agent", ...(agentDefault ? { agentDefault } : {}) };
257
263
  }
264
+ /** Antigravity's own model when this was written (it names no model in its stream): a Flash one. */
265
+ const OWN_KNOWN = { antigravity: "Gemini Flash" };
266
+ /** Codex's catalog for the account as it keeps it beside its config (every model, hidden ones too; none: unknown). */
267
+ function codexCatalog(env) {
268
+ try {
269
+ const raw = JSON.parse(fs.readFileSync(path.join(env.CODEX_HOME || path.join(userHome(env), ".codex"), "models_cache.json"), "utf8"));
270
+ if (!Array.isArray(raw?.models))
271
+ return [];
272
+ return raw.models
273
+ .filter((m) => typeof m?.slug === "string")
274
+ .map((m) => ({ id: m.slug, ...(m.display_name ? { label: m.display_name } : {}), ...(m.description ? { about: m.description } : {}) }));
275
+ }
276
+ catch {
277
+ return [];
278
+ }
279
+ }
280
+ /**
281
+ * The model an agent takes on its own (none set in strom), as strom knows it without starting anything: Codex's from
282
+ * its config.toml (its profile's too); another agent's as this research saw it run (.strom/metrics/models.json: what
283
+ * the agent alone ran on); Antigravity names none it runs on — its own when this was written is a Flash one (why its
284
+ * readers read with the research's model: core/config.ts models). `weak`: by its name or the maker's description; `refused`: Codex's catalog for the account
285
+ * (models_cache.json) is known and does not hold it — Codex says "the model is not supported" to it. Nothing known:
286
+ * undefined (never a guess).
287
+ */
288
+ export function ownModel(agent, env, aliases) {
289
+ if (agent === "codex") {
290
+ const said = agentSettingsSaid(env, "codex", {});
291
+ if (said.model) {
292
+ const catalog = codexCatalog(env);
293
+ const known = catalog.find((m) => m.id === said.model);
294
+ return { model: said.model, from: "config", weak: weakModel(known ?? { id: said.model }), refused: catalog.length > 0 && !known };
295
+ }
296
+ }
297
+ const seen = aliases ? splitKey(resolveKey(agent, aliases)).model : undefined;
298
+ if (seen)
299
+ return { model: seen, from: "seen", weak: weakModel({ id: seen }), refused: false };
300
+ const known = OWN_KNOWN[agent];
301
+ return known ? { model: known, from: "known", weak: true, refused: false } : undefined;
302
+ }
@@ -3,10 +3,10 @@
3
3
  // records, one line on the local events read in them. Only a brief of such a session speaks of it: the commands are
4
4
  // behind the experiment's gate (hidden), the guide, help and strom commands say nothing of them.
5
5
  import { langName } from "../core/lang.js";
6
- import { foldText } from "../core/text.js";
7
6
  import { match } from "../cli/registry.js";
8
7
  import { synopsis } from "./sheet.js";
9
- import { catalogIds, EVENT_KINDS, forGaps, GAP_DENSITY, gapsOfTask, gapText, HISTORY_PLACES_ORIGIN, HOLD_DAYS, placeNotes, readCatalog, readHidden, readPlaces, coveredBy, regionName, regionOfTask, regionPeriod, REGION_LANGS, LIVED_MARGIN, PRESENT_YEARS, searchedSpans, storyHistory, unmappedPlaces, historyPlaces, } from "../core/pastevents.js";
8
+ import { catalogIds, EVENT_KINDS, forGaps, GAP_DENSITY, gapsOfTask, gapText, HISTORY_PLACES_ORIGIN, HOLD_DAYS, placeNotes, readCatalog, readHidden, readPlaces, coveredBy, regionName, regionOfTask, regionPeriod, REGION_LANGS, LIVED_MARGIN, PRESENT_YEARS, searchedSpans, storyHistory, unmappedPlaces, historyPlaces, placeNamed, } from "../core/pastevents.js";
9
+ import { adoptionPlan, regionArg, SAME_KM } from "../core/placeadopt.js";
10
10
  import { AREA_KM, defaultArea, factsByRecord, placeKeyOf, placeLabel, placeOfTask, placeRecord, readPlaceCatalog, regionEventsAt, yearsAt } from "../core/placehistory.js";
11
11
  /** About so many events a region at most: rather fewer. */
12
12
  export const REGION_DENSITY = 60;
@@ -259,12 +259,7 @@ function placesSections(tree, shared, alone) {
259
259
  const lang = tree.lang;
260
260
  const facts = historyPlaces(tree).facts;
261
261
  const pending = unmappedPlaces(tree);
262
- const records = tree.list("place").filter((p) => !p.retracted);
263
- const byName = (key) => {
264
- const f = foldText(key);
265
- const first = foldText(key.split(",")[0].trim());
266
- return records.find((p) => p.names.some((n) => foldText(n.name) === f)) ?? records.find((p) => p.names.some((n) => foldText(n.name) === first));
267
- };
262
+ const byName = placeNamed(tree.list("place"));
268
263
  const notes = placeNotes(tree);
269
264
  const placeLine = (key) => {
270
265
  const ys = facts.get(key) ?? [];
@@ -308,6 +303,7 @@ function placesSections(tree, shared, alone) {
308
303
  pending.length > PLACES_SHOWN ? ` … ${pending.length - PLACES_SHOWN} more: strom history status` : "",
309
304
  ].filter(Boolean).join("\n"),
310
305
  },
306
+ ...othersSection(tree, shared),
311
307
  {
312
308
  name: "regions",
313
309
  first: true,
@@ -329,6 +325,46 @@ function placesSections(tree, shared, alone) {
329
325
  ]));
330
326
  return out;
331
327
  }
328
+ /** What a place record of another research says of where the place is (its parish, district, coordinates). */
329
+ function signsText(o) {
330
+ const s = o.signs;
331
+ if (!s)
332
+ return "no place record there";
333
+ return [
334
+ s.kind ?? "",
335
+ s.parish?.length ? `parish ${s.parish.join(", ")}` : "",
336
+ s.district?.length ? `district ${s.district.join(", ")}` : "",
337
+ s.coords ? `${s.coords.lat.toFixed(3)}, ${s.coords.lon.toFixed(3)}` : "",
338
+ ]
339
+ .filter(Boolean)
340
+ .join(" · ") || "its record says nothing of where it is";
341
+ }
342
+ /**
343
+ * The places waiting that another research on this computer maps (core/placeadopt.ts): those it maps surely the same
344
+ * (strom history adopt takes them; strom takes them by itself before the next task), and a place of the name it maps
345
+ * where nothing tells it is the same place — the agent decides.
346
+ */
347
+ function othersSection(tree, shared) {
348
+ const plan = adoptionPlan(tree, shared);
349
+ if (!plan.taken.length && !plan.suggested.length)
350
+ return [];
351
+ const map = (place, regions) => `strom history map ${JSON.stringify(place)} ${regions.map((r) => `--region ${regionArg(r)}`).join(" ")}`;
352
+ return [
353
+ {
354
+ name: "other research",
355
+ first: true,
356
+ pointer: "strom history adopt --dry-run",
357
+ text: [
358
+ "## Places another research on this computer maps",
359
+ plan.taken.length
360
+ ? `- the same place surely (coordinates within ${SAME_KM} km, the same parish or district), mapped the same: ${plan.taken.length} — strom history adopt takes them as they are: ${plan.taken.slice(0, PLACES_SHOWN).map((t) => `"${t.place}"`).join(", ")}`
361
+ : "",
362
+ ...plan.suggested.slice(0, PLACES_SHOWN).flatMap((p) => p.options.map((o) => ` "${p.place}" — another research on this computer maps "${p.place}" (${signsText(o)}${o.sure ? `; the same ${o.sure === "coords" ? "coordinates" : o.sure} as here` : ""}) to ${o.regions.map(regionArg).join(", ")}${p.options.length > 1 ? " (the researches differ)" : ""} — use it only if it is the same place: ${map(p.place, o.regions)}`)),
363
+ plan.suggested.length > PLACES_SHOWN ? ` … ${plan.suggested.length - PLACES_SHOWN} more: strom history adopt --dry-run` : "",
364
+ ].filter(Boolean).join("\n"),
365
+ },
366
+ ];
367
+ }
332
368
  /** One short section for a session that reads records while the experiment is on: a local event read in them. */
333
369
  export function localEventsSection() {
334
370
  const line = cmd(["history", "local"]);
package/dist/cli/main.js CHANGED
@@ -30,7 +30,7 @@ import { isAgent } from "../core/which.js";
30
30
  import { noPermission } from "../core/writable.js";
31
31
  import { completePath, pathOf, pathToRemember } from "../core/userpath.js";
32
32
  import { appUrlShown, noticeStromApp } from "../core/stromapp.js";
33
- import { lastChannelOf, pendingTransition, updateChannel, whatsNewUrl } from "../core/update.js";
33
+ import { lastChannelOf, npmChannelKept, pendingTransition, updateChannel, whatsNewUrl } from "../core/update.js";
34
34
  import { backupBefore, backupSaid } from "./backups.js";
35
35
  import { guestOf, installation, ownFolder, refreshTreeShim } from "../core/self.js";
36
36
  import { refreshGlobal } from "../agents/global.js";
@@ -358,7 +358,7 @@ async function mainOf(argv, io, env, cwd) {
358
358
  // settings are backed up first — before this strom opens any of them, before any migration (Milan, 2026-10-07:
359
359
  // "přechod beta ↔ produkce nikdy nepřijde o data"). Made once (strom update made it already, or another strom of
360
360
  // this version a moment ago); in any strom of this version, a bridge too (it may write what the app sends).
361
- const channelNow = updateChannel(env);
361
+ const channelNow = updateChannel(env, undefined, undefined, ctx.settings.config);
362
362
  // an agent's hook (strom net web --hook, before each of its web requests; strom agents delegate --hook, before each
363
363
  // subagent call) does none of a new version's first run: it answers within the hook's time and changes nothing
364
364
  // outside the research's measurements
@@ -395,9 +395,19 @@ async function mainOf(argv, io, env, cwd) {
395
395
  catch {
396
396
  // asked again at the first look at an archive
397
397
  }
398
+ // …and its channel: another one than last time is a change of channel (npm's: a beta installed after strom update
399
+ // --channel stable, or an older release after --channel beta, is a choice made with npm since — taken as it is;
400
+ // the channel before the version is noted: a release older than the last one is a way back to npm's latest)
401
+ if (installation().kind === "npm") {
402
+ const kept = npmChannelKept(ctx.settings.config, VERSION);
403
+ if (kept)
404
+ ctx.settings.config.npmChannel = kept;
405
+ else
406
+ delete ctx.settings.config.npmChannel;
407
+ }
408
+ const channel = updateChannel(env, undefined, undefined, ctx.settings.config);
398
409
  ctx.settings.config.lastVersion = VERSION;
399
- // …and its channel: another one than last time is a change of channel
400
- ctx.settings.config.lastChannel = updateChannel(env);
410
+ ctx.settings.config.lastChannel = channel;
401
411
  ctx.settings.save();
402
412
  refreshGlobal(env);
403
413
  // …and the links from the Strom app lead to this strom again (where strom made them on this person's yes —
@@ -45,6 +45,7 @@ import { SENDABLE, waitGroupOf, waitKindOf } from "../core/waitkind.js";
45
45
  import { openForUser } from "../core/open.js";
46
46
  import { fileRefused } from "../core/taskfiles.js";
47
47
  import { placesPinned } from "../core/pastevents.js";
48
+ import { fixCheck, fixEnv, pendingFixes } from "../commands/fixchecks.js";
48
49
  import { placeEstimate, placeLabel, placeRecord, placesWithCoords, placeTask } from "../core/placehistory.js";
49
50
  /** What the Strom app asks, said before anything is done; true when the person goes on. */
50
51
  export async function asks(ctx, lang, root, what, note, suggested = true) {
@@ -301,6 +302,40 @@ export async function placeSearch(ctx, run, lang, root, id) {
301
302
  return true;
302
303
  return (await run(["run", "--task", task.id])) === 0;
303
304
  }
305
+ /**
306
+ * strom's fixes from a link (strom-research://fixes): what it names shown, and set right or put back only by the person
307
+ * here — strom fixes run and undo ask them themselves (never --yes, never the link's own answer). No fix named: the list,
308
+ * or each that waits in turn, as the menu's Maintenance does it; where nobody reads (an archive, a research waiting for
309
+ * its agent) only the checks that rewrite. A paid check named there is refused before (commands/links.ts).
310
+ */
311
+ export async function fixesDo(ctx, run, lang, root, id, what) {
312
+ const tree = Tree.open(root, ctx.env);
313
+ const check = id ? fixCheck(id) : undefined;
314
+ if (!check) {
315
+ const quiet = actsAsArchive(tree);
316
+ const waits = (pendingFixes(tree, fixEnv(ctx, tree)) ?? []).filter((p) => !quiet || p.check.remedy === "rewrite");
317
+ if (!waits.length)
318
+ return (await run(["fixes"])) === 0;
319
+ if (!quiet || isArchive(tree))
320
+ return (await run(["fixes", "run"])) === 0;
321
+ let done = true;
322
+ for (const p of waits)
323
+ done = (await run(["fixes", "run", p.check.id])) === 0 && done;
324
+ return done;
325
+ }
326
+ // put back: only what rewrites keeps what it set right — shown first, then the person's question here (strom fixes
327
+ // undo itself asks nothing more at a terminal); one that reads again is shown (nothing to put back)
328
+ if (what === "undo") {
329
+ if ((await run(["fixes", "show", check.id])) !== 0 || check.remedy !== "rewrite" || !check.applied?.(tree))
330
+ return false;
331
+ const t = translator(lang);
332
+ if (!(await asks(ctx, lang, root, t("ui.link.what.fixes.undo", { name: t(`ui.fixes.${check.id}.name`) }), undefined, false)))
333
+ return false;
334
+ return (await run(["fixes", "undo", check.id])) === 0;
335
+ }
336
+ const waits = (pendingFixes(tree, fixEnv(ctx, tree)) ?? []).some((p) => p.check.id === check.id);
337
+ return (await run(waits ? ["fixes", "run", check.id] : ["fixes", "show", check.id])) === 0;
338
+ }
304
339
  /** A direction of the research paused, ended (each with the person's reason, if they give one) or taken up again. */
305
340
  export async function directionDo(ctx, run, lang, root, id, what) {
306
341
  const t = translator(lang);
package/dist/cli/ui.js CHANGED
@@ -552,7 +552,7 @@ export const UI = {
552
552
  "ui.timing": "How long each step took (the line to send when strom is slow):",
553
553
  "ui.doc.place": "where the research lies",
554
554
  "ui.doc.place.cloud": "{where}: in {what} — each file strom looks at may come over the network first",
555
- "ui.doc.place.online": "of {looked} files looked at, {online} are kept only online (each downloaded whole when opened)",
555
+ "ui.doc.place.online": "of {looked, plural, one {# file looked at} other {# files looked at}}, {online, plural, one {# is} other {# are}} kept only online (each downloaded whole when opened)",
556
556
  "ui.doc.place.network": "{where}: on a network drive ({what}) — each file strom looks at is read over the network, with thousands of scans slowly",
557
557
  "ui.doc.place.cloud.fix": "the folder kept always on this device (OneDrive: in the folder's menu “Always keep on this device”), or the research moved to a disk of this computer (strom setup in a terminal moves it along); strom itself downloads nothing",
558
558
  "ui.doc.place.network.fix": "the research moved to a disk of this computer (strom setup in a terminal moves it along)",
@@ -575,6 +575,8 @@ export const UI = {
575
575
  "ui.doc.knows": "agents know strom",
576
576
  "ui.doc.level": "the agent may",
577
577
  "ui.doc.model": "model",
578
+ "ui.doc.model.own.weak": "no model chosen for the research: {agent} works with its own, {model} — a fast or small one, too weak for old handwriting",
579
+ "ui.doc.model.own.refused": "no model chosen for the research: {agent} works with its own, {model}, which is not in its list for this account — it would refuse it",
578
580
  "ui.doc.shortcut": "desktop shortcut",
579
581
  "ui.doc.links": "links from the Strom app",
580
582
  "ui.doc.links.ours": "yes",
@@ -2667,7 +2669,7 @@ export const UI = {
2667
2669
  "ui.history.pace.default": " (default)",
2668
2670
  "ui.history.pace.later": "To change how often later: strom config set experiments.historyPace sometimes|rare|idle.",
2669
2671
  "ui.history.pace.off": "off — not looked for",
2670
- "ui.setup.history": "The events of history at the ancestors' places too — wars, epidemics, censuses, changes of the state (the agent looks for them between the sessions of the family research)? How often:",
2672
+ "ui.setup.history": "The events of history at the ancestors' places too — wars, epidemics, censuses, changes of the state (the agent looks for them between the sessions of the family research)? For every research on this computer. How often:",
2671
2673
  "ui.alone.history": "History: {state}",
2672
2674
  "ui.alone.places": "History of each place, by itself: {state}",
2673
2675
  "ui.alone.places.about": "The history of each place with coordinates and its surroundings — fires, floods, battles nearby, the estate, the parish, the school — looked for by itself, one place at a time at the pace of the history, the places of the most people first. A place looked for once is not looked for again. A single place is looked for whenever asked for, also with this off.",
@@ -2677,10 +2679,10 @@ export const UI = {
2677
2679
  "ui.alone.regions.tree": "History of the regions in this research: {state}",
2678
2680
  "ui.alone.placeHistory.tree": "History of the places in this research: {state}",
2679
2681
  "ui.alone.tree.about": "For this research alone, before this computer's settings. What was found stays.",
2680
- "ui.history.offer": "New in this version: the events of history at the ancestors' places — wars, epidemics, censuses, changes of the state, each with its source; the Strom app shows them in the course of each life. Not looked for yet, nothing turns on by itself.",
2682
+ "ui.history.offer": "New in this version: the events of history at the ancestors' places — wars, epidemics, censuses, changes of the state, each with its source; the Strom app shows them in the course of each life. Not looked for yet, nothing turns on by itself. The choice holds for every research on this computer.",
2681
2683
  "ui.history.offer.no": "not now — nothing turns on",
2682
- "ui.history.offer.later": "Not looked for. Later: Settings → The agent working alone → History, or from the Strom app.",
2683
- "ui.history.offer.on": "History looked for: {pace}. To change how often: Settings → The agent working alone → History, or from the Strom app.",
2684
+ "ui.history.offer.later": "Not looked for. Later: Settings → The agent working alone → History, or from the Strom app. For one research alone: Settings → The agent working alone → History of the regions in this research (in the menu of that research), or strom config set experiments.history on --for-tree.",
2685
+ "ui.history.offer.on": "History looked for in every research on this computer: {pace}. To change how often: Settings → The agent working alone → History, or from the Strom app. For one research alone: Settings → The agent working alone → History of the regions in this research (in the menu of that research), or strom config set experiments.history off --for-tree.",
2684
2686
  "ui.consent.history.pace": "Look for the events of history more often — {pace}? It takes more of the agent's time and the plan's usage.",
2685
2687
  "ui.consent.history.tree": "Look for the events of history of the regions at the places of this research — wars, epidemics, censuses, changes of the state? The agent looks for them now and then between the sessions of the family research, and it takes its time and the plan's usage.",
2686
2688
  "ui.consent.placeHistory": "Look for the history of a place and its surroundings when it is asked for, in every research on this computer — fires, floods, battles nearby, the estate, the parish, the school? Each place asked for is one session of the agent; it takes its time and the plan's usage.",
@@ -2709,6 +2711,7 @@ export const UI = {
2709
2711
  "ui.link.experiment.archive": "Nothing of history is looked for while the research is kept as an archive. Nothing was done.",
2710
2712
  "ui.link.experiment.waiting": "Nobody works on this research on this computer, so nothing of history is looked for. Nothing was done.",
2711
2713
  "ui.link.what.history.place": "look for the history of {place} and its surroundings — fires, floods, battles nearby, the estate, the parish, the school",
2714
+ "ui.link.what.fixes.undo": "put back what the fix \"{name}\" set right",
2712
2715
  "ui.link.history.place.minutes": "One session of the agent, about {from}–{to} minutes; it takes the agent's time and the plan's usage.",
2713
2716
  "ui.link.history.place.usd": "Such sessions here cost {from}–{to} so far.",
2714
2717
  "ui.link.history.place.done": "The history of {place} and its surroundings is first in the queue.",