tags: tech, tmsr
---
-TODO: Merge downstream from tuvok
+This post is a regrind proposal for [Trinque][trinque]'s
+[botworks patchset][bot], including [ircbot][ircbot], [logbot][logbot]
+and [trilemabot][trilemabot], as a result of multiple discussion threads
+in the forum of the Most Serene Republic[^1].
+
+The new set of V patches is available in my [repository][botworks]. It
+can be pressed with e.g. [vk.pl][diana] as follows:
+
+~~~~ {.bash}
+$ mkdir botworks; cd botworks; mkdir .wot
+# Make sure to add spyked.asc key in .wot (via e.g. deedbot)
+$ vk.pl init http://lucian.mogosanu.ro/src/botworks/
+# Example: pressing to logbot-genesis
+$ vk.pl p v logbot-genesis logbot-genesis.vpatch
+~~~~
+
+Some notes, starting from the structure of the new V tree:
+
+<!-- ugh! -->
+<div style="text-align:center">
+<img class="thumb" src="/uploads/2018/11/botworks-v-tree.svg">
+</div>
+
+This particular organization of V patches was chosen in order to
+preserve both history and the "based on" relation between botworks
+components -- currently ircbot, logbot and trilemabot. Thus: a. both
+trilemabot and logbot are based on ircbot, and the Python command router
+is based on logbot; b. logbot-genesis flows directly from
+ircbot-genesis; c. trilemabot flows from
+ircbot-multiple-channels-corrected[^2]; and d. the
+{logbot,ircbot}-multiple-channels-corrected patches are also "merged"
+together in a new V patch[^3].
+
+A consequence of this organization is that trilemabot and logbot being
+on two separate sides of the tree, at the moment they cannot be pressed
+together[^4].
+
+Another consequence is that out of three tested V implementations, one
+([v.py][barksinthewind]) is not able to generate a correct press,
+requiring that only one side of the tree exist in the patches
+directory[^5]. The other two ([v.pl][diana] and [Esthlos V][esthlos])
+however work. For example:
+
+~~~~
+$ ls -1 patches .seals
+patches:
+ircbot-genesis.vpatch
+ircbot-logbot-multiple-channels-corrected.vpatch
+ircbot-multiple-channels-corrected.vpatch
+logbot_command_router_python_genesis.vpatch
+logbot-genesis.vpatch
+trilemabot-prefixed-cmd.vpatch
+trilemabot-voicer.vpatch
+
+.seals:
+ircbot-genesis.vpatch.spyked.sig
+ircbot-logbot-multiple-channels-corrected.vpatch.spyked.sig
+ircbot-multiple-channels-corrected.vpatch.spyked.sig
+logbot_command_router_python_genesis.vpatch.spyked.sig
+logbot-genesis.vpatch.spyked.sig
+trilemabot-prefixed-cmd.vpatch.spyked.sig
+trilemabot-voicer.vpatch.spyked.sig
+
+$ vk.pl pp logbot_command_router_python_genesis.vpatch
+ircbot-genesis.vpatch (spyked)
+logbot-genesis.vpatch (spyked)
+ircbot-logbot-multiple-channels-corrected.vpatch (spyked)
+logbot_command_router_python_genesis.vpatch (spyked)
+
+$ vk.pl pp trilemabot-prefixed-cmd.vpatch
+ircbot-genesis.vpatch (spyked)
+ircbot-multiple-channels-corrected.vpatch (spyked)
+trilemabot-voicer.vpatch (spyked)
+trilemabot-prefixed-cmd.vpatch (spyked)
+~~~~
+
+And yes, e.g. `vk.pl p v my-dir trilemabot-prefixed-cmd.vpatch` produces
+a correct press. Neat, huh? So go [grab the patches][botworks] and tell
+me what you think!
+
+[^1]: Long story short: a. the current Republican IRC bot components are
+ to be unified under a single V tree; and b. no new Vtronic work
+ shall be submitted using the heathen SHA hashes, which implies a
+ Keccak regrind before anything. A few references below:
+
+ * [Discussion][btcbase-1819005] on the organization of V trees and
+ the flow of V patches, and in particular those of ircbot, logbot
+ and similar.
+ * [I propose][btcbase-1832542] to do a regrind of the botworks tree.
+ * [I agree][btcbase-1832815] to do said regrind.
+ * [Discussion][btcbase-1820387] on the directory structure of V
+ presses, in particular that of botworks.
+ * Proposal for a [Keccak-based v.py][barksinthewind], a
+ [V in Common Lisp][esthlos], and a [Keccak-based v.pl][diana].
+ * All new Republican V patches
+ [must be based on Keccak][btcbase-1851879].
+
+ The last point solves my [earlier dilemma][trilemabot-ii] on what to
+ prioritize.
+
+[^2]: While trilemabot-voicer could in principle be a direct child of
+ ircbot-genesis, I, as a trilemabot user who keeps all his bots in
+ multiple channels, don't see any reason for keeping this
+ functionality out. If you feel strongly about this, you're free to
+ submit patches, test results and so on.
+
+[^3]: This is, as far as I can tell, the cleanest way to represent the
+ fact that the so-called "logbot-with-multiple-channels" depends on
+ both "logbot-genesis" and "ircbot-with-multiple-channels", while at
+ the same time adhering to the "V patch may have only one parent"
+ philosophy that arises from the use of [manifests][manifest].
+
+[^4]: Which suggests that this might be the wrong way to cut it (at
+ least for some). Let's take a deeper look at this problem, because
+ it informs other decisions, such as the
+ [eventual replacement][btcbase-1856367] of ASDF with V.
+
+ First off, we know from numerous discussions in the logs,
+ e.g. [1][btcbase-1862430], [2][btcbase-1862674] or
+ [3][btcbase-1873668], that manifests enforce a linear flow of V
+ patches, to sit well with the linear flow of history. Then a
+ divergence in the V chain, i.e. the existence of a branching point
+ in history, will denote changes that are (semantically) mutually
+ exclusive, such as the particularization of some functionality to a
+ specific hardware architecture.
+
+ This is all good, but I reground the trilemabot and logbot patches
+ -- that provide two disjunct but *not* mutually exclusive components
+ of the botworks set -- as two divergent branches for a different
+ reason: I for example want to exclude Postgres dependencies from the
+ trilemabot-based [spykedbot][spykedbot] (I might later want to add a
+ text or MySQL-based logging mechanism, or who knows), while on the
+ other hand [Lobbes][lobbes] [needs][btcbase-1862345] both logging
+ and voicing functionality into his own bot.
+
+ This problem could be solved for example by extending one of the
+ existing branches with the missing functionality -- but which one?
+ Since I'm not sure how to proceed here, I'm submitting this to the
+ forum for discussion. I'm eager to hear your comments!
+
+[^5]: See also [this discussion][btcbase-1833105].
+
+[trinque]: http://trinque.org/
+[bot]: http://btcbase.org/patches?patchset=bot
+[ircbot]: http://trinque.org/2016/08/10/ircbot-genesis/
+[logbot]: http://trinque.org/2016/08/11/logbot-genesis/
+[trilemabot]: /posts/y04/072-trilemabot-i.html
+[btcbase-1819005]: http://btcbase.org/log/2018-05-25#1819005
+[btcbase-1832542]: http://btcbase.org/log/2018-07-07#1832542
+[btcbase-1832815]: http://btcbase.org/log/2018-07-08#1832815
+[btcbase-1820387]: http://btcbase.org/log/2018-06-03#1820387
+[barksinthewind]: http://barksinthewind.com/2018/vpy-updated-for-vtools/
+[esthlos]: http://blog.esthlos.com/esthlos-v-release-with-working-keccak/
+[diana]: http://ossasepia.com/2018/11/13/v-with-vtools-keccak-hashes-and-its-own-tree/
+[btcbase-1851879]: http://btcbase.org/log/2018-09-19#1851879
+[trilemabot-ii]: /posts/y05/078-trilemabot-ii.html#selection-227.0-234.1
+[botworks]: http://lucian.mogosanu.ro/src/botworks/
+[manifest]: http://trinque.org/2018/06/02/v-manifest-specification/
+[btcbase-1856367]: http://btcbase.org/log/2018-10-01#1856367
+[btcbase-1862430]: http://btcbase.org/log/2018-10-14#1862430
+[btcbase-1862674]: http://btcbase.org/log/2018-10-15#1862674
+[btcbase-1873668]: http://btcbase.org/log/2018-11-19#1873668
+[spykedbot]: http://btcbase.org/log-search?q=from%3Aspykedbot
+[lobbes]: http://lobbesblog.com/
+[btcbase-1862345]: http://btcbase.org/log/2018-10-14#1862345
+[btcbase-1833105]: http://btcbase.org/log/2018-07-10#1833105
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: botworks Pages: 1 -->
+<svg width="424pt" height="260pt"
+ viewBox="0.00 0.00 423.50 260.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 256)">
+<title>botworks</title>
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-256 419.5,-256 419.5,4 -4,4"/>
+<!-- ircbot-genesis -->
+<g id="node1" class="node">
+<title>ircbot-genesis</title>
+<polygon fill="none" stroke="#000000" points="232.5,-252 140.5,-252 140.5,-216 232.5,-216 232.5,-252"/>
+<text text-anchor="middle" x="186.5" y="-230.3" font-family="Times,serif" font-size="14.00" fill="#000000">ircbot-genesis</text>
+</g>
+<!-- ircbot-multiple-channels-corrected -->
+<g id="node2" class="node">
+<title>ircbot-multiple-channels-corrected</title>
+<polygon fill="none" stroke="#000000" points="205,-180 0,-180 0,-144 205,-144 205,-180"/>
+<text text-anchor="middle" x="102.5" y="-158.3" font-family="Times,serif" font-size="14.00" fill="#000000">ircbot-multiple-channels-corrected</text>
+</g>
+<!-- ircbot-genesis->ircbot-multiple-channels-corrected -->
+<g id="edge1" class="edge">
+<title>ircbot-genesis->ircbot-multiple-channels-corrected</title>
+<path fill="none" stroke="#000000" d="M165.3033,-215.8314C155.0566,-207.0485 142.5997,-196.3712 131.4903,-186.8489"/>
+<polygon fill="#000000" stroke="#000000" points="133.5603,-184.0134 123.69,-180.1628 129.0048,-189.3282 133.5603,-184.0134"/>
+</g>
+<!-- logbot-genesis -->
+<g id="node5" class="node">
+<title>logbot-genesis</title>
+<polygon fill="none" stroke="#000000" points="325,-180 230,-180 230,-144 325,-144 325,-180"/>
+<text text-anchor="middle" x="277.5" y="-158.3" font-family="Times,serif" font-size="14.00" fill="#000000">logbot-genesis</text>
+</g>
+<!-- ircbot-genesis->logbot-genesis -->
+<g id="edge4" class="edge">
+<title>ircbot-genesis->logbot-genesis</title>
+<path fill="none" stroke="#000000" d="M209.4631,-215.8314C220.6715,-206.9632 234.3209,-196.1637 246.4439,-186.5718"/>
+<polygon fill="#000000" stroke="#000000" points="248.8737,-189.1125 254.5442,-180.1628 244.5303,-183.6229 248.8737,-189.1125"/>
+</g>
+<!-- trilemabot-voicer -->
+<g id="node3" class="node">
+<title>trilemabot-voicer</title>
+<polygon fill="none" stroke="#000000" points="144,-108 33,-108 33,-72 144,-72 144,-108"/>
+<text text-anchor="middle" x="88.5" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">trilemabot-voicer</text>
+</g>
+<!-- ircbot-multiple-channels-corrected->trilemabot-voicer -->
+<g id="edge2" class="edge">
+<title>ircbot-multiple-channels-corrected->trilemabot-voicer</title>
+<path fill="none" stroke="#000000" d="M98.9672,-143.8314C97.4699,-136.131 95.6895,-126.9743 94.0255,-118.4166"/>
+<polygon fill="#000000" stroke="#000000" points="97.4248,-117.5614 92.0804,-108.4133 90.5535,-118.8975 97.4248,-117.5614"/>
+</g>
+<!-- trilemabot-prefixed-cmd -->
+<g id="node4" class="node">
+<title>trilemabot-prefixed-cmd</title>
+<polygon fill="none" stroke="#000000" points="155,-36 4,-36 4,0 155,0 155,-36"/>
+<text text-anchor="middle" x="79.5" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">trilemabot-prefixed-cmd</text>
+</g>
+<!-- trilemabot-voicer->trilemabot-prefixed-cmd -->
+<g id="edge3" class="edge">
+<title>trilemabot-voicer->trilemabot-prefixed-cmd</title>
+<path fill="none" stroke="#000000" d="M86.2289,-71.8314C85.2664,-64.131 84.1218,-54.9743 83.0521,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="86.5151,-45.9019 81.8017,-36.4133 79.5691,-46.7702 86.5151,-45.9019"/>
+</g>
+<!-- ircbot-logbot-multiple-channels-corrected -->
+<g id="node6" class="node">
+<title>ircbot-logbot-multiple-channels-corrected</title>
+<polygon fill="none" stroke="#000000" points="411.5,-108 167.5,-108 167.5,-72 411.5,-72 411.5,-108"/>
+<text text-anchor="middle" x="289.5" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">ircbot-logbot-multiple-channels-corrected</text>
+</g>
+<!-- logbot-genesis->ircbot-logbot-multiple-channels-corrected -->
+<g id="edge5" class="edge">
+<title>logbot-genesis->ircbot-logbot-multiple-channels-corrected</title>
+<path fill="none" stroke="#000000" d="M280.5281,-143.8314C281.8115,-136.131 283.3376,-126.9743 284.7639,-118.4166"/>
+<polygon fill="#000000" stroke="#000000" points="288.2394,-118.8526 286.4311,-108.4133 281.3347,-117.7018 288.2394,-118.8526"/>
+</g>
+<!-- logbot_command_router_python_genesis -->
+<g id="node7" class="node">
+<title>logbot_command_router_python_genesis</title>
+<polygon fill="none" stroke="#000000" points="415.5,-36 173.5,-36 173.5,0 415.5,0 415.5,-36"/>
+<text text-anchor="middle" x="294.5" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">logbot_command_router_python_genesis</text>
+</g>
+<!-- ircbot-logbot-multiple-channels-corrected->logbot_command_router_python_genesis -->
+<g id="edge6" class="edge">
+<title>ircbot-logbot-multiple-channels-corrected->logbot_command_router_python_genesis</title>
+<path fill="none" stroke="#000000" d="M290.7617,-71.8314C291.2965,-64.131 291.9323,-54.9743 292.5266,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="296.02,-46.6317 293.2213,-36.4133 289.0368,-46.1467 296.02,-46.6317"/>
+</g>
+</g>
+</svg>