<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6426345363781422461</id><updated>2026-10-21T12:27:11.794+00:00</updated><title type='text'>The Return of Agent Zlerich</title><subtitle type='html'>As far as the Internet can tell me, no one uses &quot;Zlerich&quot;. I call dibs.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default?start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>191</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-8326195607001866144</id><published>2026-10-21T12:13:26.846+00:00</published><updated>2026-10-21T12:27:11.794+00:00</updated><title type='text'>A Reusable Review Procedure for Clankers</title><content type='html'>&lt;p&gt;&lt;i&gt;(Distilled/discovered from clanker-based editing processes for a lengthy personal writing project. To use: first, identify a possibly long list of concerns via an LLM. Second, tell it you want to apply this procedure via its URL.)&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;How to &lt;em&gt;run&lt;/em&gt; a structured review, independent of &lt;em&gt;what&lt;/em&gt; you are reviewing. A
checklist (&lt;code&gt;copy.md&lt;/code&gt;, &lt;code&gt;conceptual.md&lt;/code&gt;, or any other) supplies the
&lt;strong&gt;what&lt;/strong&gt; — the concerns to look for. This supplies the &lt;strong&gt;how&lt;/strong&gt; — the cadence
that turns a pile of concerns into a converged, auditable result without churn.
It applies to prose, code, specifications, designs — anything revised by
identifying concerns and proposing changes.&lt;/p&gt;
&lt;p&gt;Two roles run through it. The &lt;strong&gt;owner&lt;/strong&gt; decides; the &lt;strong&gt;reviewer&lt;/strong&gt; proposes and
reasons. When they are the same person, the roles still separate in time —
propose, then decide. Both feed the same proposal stream.&lt;/p&gt;
&lt;p&gt;Fix the &lt;strong&gt;scope&lt;/strong&gt; and &lt;strong&gt;mode&lt;/strong&gt; before starting. &lt;em&gt;Scope&lt;/em&gt; is the review’s unit —
a section, a file, a function — with how far out to load context: the neighbors
it hands off to, the parent it sits within, the targets it references. &lt;em&gt;Mode&lt;/em&gt; is
whether changes are applied as you go: a &lt;strong&gt;full&lt;/strong&gt; review edits and verifies in
place; a &lt;strong&gt;review-only&lt;/strong&gt; (dry-run) pass runs every applicable check and produces
the log but touches nothing — for a second reviewer, a pre-flight, or a
hand-off.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;identity-label-everything&quot;&gt;1. Identity: label everything&lt;/h2&gt;
&lt;p&gt;Nothing downstream works without stable identity, because every later step refers
to items by name.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enumerate and name concerns.&lt;/strong&gt; A &lt;em&gt;concern&lt;/em&gt; is one problem to solve, surfaced
as a discrete decision point — a claim, a reason, and where possible a
proposed fix — not a vague category.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File a root objection once.&lt;/strong&gt; One objection often bears on several
passages, and raising it at each makes the owner decide the same question
several times and inflates the false-positive count when it proves wrong.
File it under the one concern that owns it; elsewhere, cite that label rather
than restating the objection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Label what the checklist did not raise.&lt;/strong&gt; Work surfaced in conversation —
by the owner, or falling out of another concern — gets a label and a
disposition like anything else, in its own series so its provenance stays
visible. A register that carries only the checklist’s items silently claims
the checklist found everything, and the unlabelled work is what dissolves
back into the transcript when the register is archived.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concern label&lt;/strong&gt; (&lt;code&gt;C1&lt;/code&gt;, &lt;code&gt;C2&lt;/code&gt;, …): stable, assigned once, never reused or
renumbered. One lifecycle per concern: open –&amp;gt; resolved / accepted /
deferred / rejected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proposal sublabel&lt;/strong&gt; (&lt;code&gt;C1.1&lt;/code&gt;, &lt;code&gt;C1.2&lt;/code&gt;, …): a candidate resolution.
Author-agnostic and monotonic — whoever floats a candidate, it takes the next
number under that concern. A &lt;em&gt;distinct draft is a new sublabel&lt;/em&gt;, however small
the change, so the trail of tried-and-rejected drafts survives. Nest deeper
(&lt;code&gt;C1.4.2&lt;/code&gt;) only when a proposal itself forks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sublabel zero is reserved&lt;/strong&gt; (&lt;code&gt;C1.0&lt;/code&gt;): not a candidate but an analysis of what
the passage is for and what it is entitled to claim (Section 2). It takes a
number so the owner can call it like any other option and so the log records
whether it ran, but it is never &lt;em&gt;applied&lt;/em&gt; — there is nothing in it to apply.
Candidates keep numbering from &lt;code&gt;.1&lt;/code&gt; whether or not zero was run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retiring is a candidate, not the absence of one.&lt;/strong&gt; “Leave it as written”
takes the next sublabel like any draft, so the owner can select it by number
instead of by prose and the log records who proposed it and on what ground. A
concern settled that way closes &lt;em&gt;rejected&lt;/em&gt; when the finding was wrong, and
&lt;em&gt;accepted&lt;/em&gt; when it was right and the owner keeps the text anyway (Section 7).
Either way nothing reached the work, and the retire sublabel is marked
accepted. The two are not in tension: the disposition describes the
concern, the sublabel describes which resolution won.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A label is not a location.&lt;/strong&gt; Coordinates (line, paragraph, page) drift as
edits land; the label is the stable key and the location is a mutable attribute
re-derived on demand (see Section 5).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never write a coordinate into the work itself.&lt;/strong&gt; Annotations that ship with
the material — source comments, marginalia, editorial notes — outlive the
review that produced them and drift the moment anything above them is inserted
or cut, going silently &lt;em&gt;wrong&lt;/em&gt; rather than merely stale. Refer to content
instead: “the footnote below”, “the second ‘frequently’”, the quoted phrase.
The register may carry coordinates because Section 5 re-derives them on
demand; the work may not, because nothing re-derives the work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name the material in its own vocabulary.&lt;/strong&gt; Identify the units under review
by identifiers the material already carries — its labels, headings, block
markers, function names. Where it carries none at the granularity you need,
coin a semi-stable identifier from the content: a short descriptive name, or a
distinctive quote (Section 5). Coining is fine; the test is stability, not
provenance. What fails the test is any positional metric — a paragraph
index, “the third bullet”, a section number you numbered yourself — because
position moves the instant anything is inserted or cut. A bare deictic like
“here” or “the next one” is worse still, having had no referent to begin with.
The owner can resolve none of these and must guess or stop and ask; a proposal
the owner cannot judge is worse than no proposal. This binds the reviewer,
who reads the whole and finds any shorthand obvious, far more than the owner.&lt;/li&gt;
&lt;li&gt;Labels are the &lt;strong&gt;join key&lt;/strong&gt; for the ordering, the log (Section 6), and every
reference in discussion. “Apply C4, revert C2, C6 depends on C1” then becomes a one-line
exchange.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;propose-straightforwardly&quot;&gt;2. Propose straightforwardly&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claim, reason, fix.&lt;/strong&gt; Every proposal states what is wrong, &lt;em&gt;why&lt;/em&gt; it matters,
and a concrete remedy. The reason is what lets the owner judge rather than
rubber-stamp.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open a concern with the text itself.&lt;/strong&gt; Quote the offending material as a
blockquote before any analysis of it, verbatim and long enough to read
without the surrounding page. The owner then judges the finding against what
is actually written rather than against the reviewer’s paraphrase, and a
concern whose quote plainly does not look wrong is dismissed in a glance
instead of after a paragraph of argument. This also fixes the division of
block types: a blockquote is what the work says now, a fenced diff is what a
candidate would make it say (Section 4). Quote the same anchor the log
records, so the register and the conversation cannot drift apart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offer a purpose analysis as sublabel zero; never run it unasked.&lt;/strong&gt; A
word-level flag is sometimes the visible end of a missing idea rather than a
cosmetic fault, and nothing in the wording says which. So list &lt;code&gt;C1.0&lt;/code&gt; above
the candidates: an analysis of what the passage is for, what it is entitled to
claim, and whether the flagged text does that job. The owner spends a turn on
it when a concern smells deeper than its label; otherwise the candidates stand
and the offer costs a line. Running it by reflex would spend that turn on
every article and comma, which is how a false-positive budget gets eaten by
the findings that were fine. Report plainly what running it did — it can
retire the candidates beneath it, replace them, or leave them standing. Where
the passage’s job cannot be stated in a sentence, say so: that inability is
the finding, and it is usually worth more than any of the drafts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ground a specialist objection in the specialist’s sources before proposing
a fix.&lt;/strong&gt; When a finding turns on what a field means by a word, the
reviewer’s model of that field is the least reliable input in the pass, and
it is invisible as such: an off-the-cuff take reads exactly like a sourced
one. Check the field’s own literature first, undergraduate texts especially,
since what the median practitioner was taught sets the tone more than what
the specialist literature currently argues. Expect three outcomes, all
useful: the finding survives, the finding dissolves, or — the one worth
the cost — the finding is right that something is wrong and wrong about
which way it runs, and the grounding turns it into the real one. Feed what
you learn back into the reader profile, or the same false finding is
regenerated next pass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ground usage in the work itself before any outside source.&lt;/strong&gt; A finding
about register, tone, idiom, or vocabulary is a claim about the work’s own
voice, and the work is the cheapest and most authoritative witness to it.
Search it for the device, the word, or the construction before raising the
finding; a precedent elsewhere in the work usually retires it. Inventory
the current text, not a memory of an earlier draft. The same search serves
drafting: when candidates keep missing, the word the work already uses for
the idea often sits in a neighboring unit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Budget false positives, and fix the method rather than the threshold.&lt;/strong&gt;
The target is not zero findings; it is a low share of wrong ones. Record
the rate in the log — findings raised against findings that survived —
because the number is invisible from inside a pass, where every finding felt
reasonable when written. When it runs high, stop and diagnose before
surfacing anything further, and write the correction from &lt;em&gt;all&lt;/em&gt; the
instances at once. A rule drafted from the first error is fitted to that
error and will not catch its siblings; the pattern only shows once the set
is complete. Then re-screen every open finding against the correction
before presenting the next one. Findings raised under the old method carry
its error, and the re-screen dissolves them for the price of a read rather
than a decision round each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decompose a claim before matching it to a source.&lt;/strong&gt; A sentence usually
makes several claims, and a provenance finding raised against the whole is
really a finding against one part — or against none, once the parts are
checked separately. Split first, then look for each part on its own. The
half that carries the argument is the one most often skipped, because it is
the half that reads as obviously true.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match against the primary, not against your notes on it.&lt;/strong&gt; A reference
file, bibliography annotation, or earlier summary is a finding aid, not
evidence. Surface similarity to a paraphrase is not similarity to the
source: read the passage the note points at before asserting that the work
tracks it, borrows from it, or owes it a citation. Summaries compress
toward the reviewer’s own phrasing, which is exactly what makes them look
like a match, so a match against a note is weak evidence in either
direction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A match is agreement of claims, not of topic.&lt;/strong&gt; Lexical or topical overlap
is where a search starts, never what it concludes. Two passages match when
they agree on four things: what is claimed, about what object, by what
mechanism, and at what phase of the thing’s life. Name all four for each
side before asserting any relation. Divergence on one of them turns the
finding from borrowing into convergence. Say which it is; whether the
convergence matters is the owner’s call, not the reviewer’s. The failures
to look for: same verb
different object; same principle different mechanism; same duty at a
different phase, protecting the writing of a thing against protecting its
use; and shared material that turns out to be a general proposition no source
owns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check a finding before raising it, and aim at the truth rather than at the
finding.&lt;/strong&gt; The filtering duty above covers candidate fixes; it covers
findings too. A concern reported from resemblance alone is a suspicion, and
putting a suspicion to the owner spends a decision round on the reviewer’s
unfinished homework. So run the four-part test above before writing
anything — but run it neutrally. When the finding is a counterexample,
read the claim’s quantifier, direction, and object before matching the case
to it: a case that fails “some” does not fail “every”, detecting a
difference is not concluding sameness, and a case against how a thing is
done does not touch what it implies. Checking confirms as readily as it
dissolves, and a finding that has been checked arrives stronger, with the
reason it holds already in hand. Report what the check found either way,
including when it strengthened the case. Do not set out to disprove: that
is the mirror of the error it corrects, and it suppresses true findings as
reliably as credulity manufactures false ones. A pass that surfaces nothing
has probably not looked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Present only un-ruled-out options.&lt;/strong&gt; The reviewer does the filtering: what is
&lt;em&gt;dominated&lt;/em&gt; (strictly worse than a survivor) or &lt;em&gt;violates a hard constraint&lt;/em&gt;
gets ruled out and logged, not laid before the owner. What remains is genuine
tradeoffs; when one clearly wins, present a lean, not a menu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface a re-proposed dead end.&lt;/strong&gt; When the owner independently floats a
candidate the review already ruled out, neither silently accept it nor re-derive
from scratch — match it to its logged sublabel and give the recorded reason
(“that is C1.2, set aside because …”), framed as revisable, since the owner
may bring new information that retires the reason. This is the complement of
filtering: options are ruled &lt;em&gt;out&lt;/em&gt; of the presentation but their reasons stay
retrievable, so a rediscovered dead end is answered from the log in one line
rather than re-argued.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expose the open surface with every decision request.&lt;/strong&gt; Ask the owner to
decide only alongside a statement of what is still open: the concern, the live
alternatives, and whatever already-settled material the choice depends on. A
reviewer accumulates state the owner never saw — superseded drafts, closed
branches, notes taken between rounds — and a bare label (“decide C4.12”)
exposes none of it, forcing the owner to reconstruct the register or guess.
Keep the surface small by &lt;em&gt;closing&lt;/em&gt; branches, never by withholding them. If
more than one alternative is live, give each a sentence; if they will not fit
in a sentence apiece, the concern needs splitting rather than summarizing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put the decision request where it cannot be missed.&lt;/strong&gt; A request buried in
a closing clause — “say the word and I will”, “let me know if you want” —
reads as a pleasantry rather than as a question, especially at the end of a
long analysis the owner has just finished absorbing. The owner then either
overlooks it or must re-scan to find what is being asked. State the open
decision &lt;em&gt;first&lt;/em&gt;, in its own line, phrased as a question with the options
named. The analysis that justifies it belongs after, where the owner can
skip it if they have already decided. This is the presentation half of
exposing the open surface: the surface is useless if the owner has to hunt
for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface what dissolved; do not merely log it.&lt;/strong&gt; A concern that later
decisions render moot is closed by &lt;em&gt;inference&lt;/em&gt; rather than by the evidence
that raised it, and that inference is the reviewer’s own, unchecked. Put it
before the owner with its derivation: what raised it, which decision absorbed
it, and what would reopen it. Anything that caught the reviewer’s eye is
worth the owner’s glance if only as a double check — the owner is the guard
against a reviewer who has talked themselves out of a real finding. The cost
is a sentence; the failure mode is a genuine concern vanishing quietly between
two unrelated rulings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer a decision you can grep.&lt;/strong&gt; Where a ruling reduces to a mechanical
check, record the check beside it — the reserved word, the required column,
the pattern that must not appear, the form that must. A greppable constraint
survives fatigue, delegation, and the months between deciding and drafting,
and it lets a later pass confirm compliance without re-deriving the reasoning
that produced it. Scope the check to live text. A count that sweeps in
commented-out drafts, rejected sections, or the review’s own notes overstates
precedent, and filtering the matched fragments rather than the source lines
lets them back in unnoticed. Most interesting decisions resist this and
stay judgement calls; that is fine. But reach for the mechanical form
first, and where two formulations are otherwise equal, prefer the one that
admits a check — checkability is a legitimate tie-breaker, not merely a
convenience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name the operative principle.&lt;/strong&gt; When a recommendation rests on something
beyond the obvious, name it. That lets the owner judge the &lt;em&gt;principle&lt;/em&gt;, not
only the instance — and reuse it. Named principles are how a review
&lt;em&gt;compounds&lt;/em&gt; instead of evaporating; they are the raw material of the next
checklist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Triage: fix vs propose.&lt;/strong&gt; Objective errors are fixed directly; matters of
taste, voice, or owner judgment are proposed. Mis-triaging a taste call as a
fix oversteps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ruled-out and rejected candidates are not discarded — they go to the audit log
as sublabels with a reason (Section 6). Lean surface, complete record.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;order-the-work&quot;&gt;3. Order the work&lt;/h2&gt;
&lt;p&gt;The order you take concerns in decides how much effort you waste.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary sort: dependency.&lt;/strong&gt; Do the changes that &lt;em&gt;reshape&lt;/em&gt; the work — those
that would invalidate other pending changes if done later — before changes
that merely &lt;em&gt;polish&lt;/em&gt;. Polishing something a later change rewrites is wasted
effort, and worse, it anchors you to material you should have cut. This axis
dominates the others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary sort, within a dependency tier: merit, impact, simplicity.&lt;/strong&gt; Among
changes that do not affect one another, favor those most likely to be accepted,
with the largest effect on the result, and the cleanest fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Momentum is a tier-internal choice, not a cross-tier one.&lt;/strong&gt; Cheap, certain
wins build flow — take them first &lt;em&gt;within&lt;/em&gt; a tier if you like, but never let
them jump ahead of a reshaping change that sits in an earlier tier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase the tiers, coarse to fine, and keep each small.&lt;/strong&gt; Small phases bound
the blast radius, which keeps the drift you must re-confirm against (Section 5)
local and cheap. Reconcile a phase before advancing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm by deciding.&lt;/strong&gt; Do not give a concern a separate verification step
that merely restates the step that decided it. Fold verification into the phase
that settles the concern, or into the first phase where its inputs are stable.
A concern earns a second phase only when it has a genuine reshaping facet &lt;em&gt;and&lt;/em&gt; a
distinct fine facet that needs more stability — otherwise the second pass is
false re-review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope the checklist to the unit.&lt;/strong&gt; Not every check applies to every unit.
Run the ones the material can actually trigger — heaviest-yield first — and
mark the rest &lt;em&gt;not applicable&lt;/em&gt; (they are still coverage; Section 6). A claim in
a specialist’s domain needs that specialist’s pass; a plain prose beat needs
none. Do not spend the most expensive pass where the material cannot move it.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;apply-a-change&quot;&gt;4. Apply a change&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Separate the vocabulary of discussion from the vocabulary of application.&lt;/strong&gt;
Two distinct requests share most of their natural phrasing, so fix a word for
each at the start and never let one stand for the other. &lt;em&gt;Discuss&lt;/em&gt;, &lt;em&gt;assess&lt;/em&gt;,
&lt;em&gt;compare&lt;/em&gt;, &lt;em&gt;spec out&lt;/em&gt; ask for reasoning in the conversation and touch nothing.
&lt;em&gt;Exhibit&lt;/em&gt;, &lt;em&gt;apply&lt;/em&gt;, &lt;em&gt;make the change&lt;/em&gt;, &lt;em&gt;edit&lt;/em&gt; ask for the change in the work,
where it can be diffed and reverted. Words that straddle — “show”, “give
me”, “let’s see”, “what about” — name neither. Treat a straddling word as a
question, not as a coin flip: ask which is wanted before acting. The cost of
asking is one line. The cost of guessing wrong is asymmetric — applying
when discussion was wanted leaves the owner reviewing and reverting work they
never sanctioned, while discussing when application was wanted costs only a
round trip. So where asking is somehow impossible, guess discussion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Label every shown block by its state.&lt;/strong&gt; Proposal text and applied text
look identical on the page, so the owner cannot tell which they are reading
without opening the file — and the two ask for different work, judging
against auditing. Head each block with &lt;strong&gt;PROPOSED&lt;/strong&gt; when nothing is going to
disk, &lt;strong&gt;APPLYING&lt;/strong&gt; when the edit is about to run, and &lt;strong&gt;APPLIED&lt;/strong&gt; once it has
landed, naming the file it landed in. Put applied results first in the
message, before any discussion of what comes next, so the top of every reply
answers &lt;em&gt;what changed&lt;/em&gt; before it asks &lt;em&gt;what next&lt;/em&gt;. This is the presentation
half of separating the two vocabularies above: fixing the words is useless if
the owner cannot see which one is in force.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carry the sublabel in the state marker, and render the change as a diff.&lt;/strong&gt;
A bare &lt;strong&gt;PROPOSED&lt;/strong&gt; tells the owner what kind of block they are reading but
not which candidate it is, so accepting one costs a sentence of description
rather than a label. Head every candidate &lt;strong&gt;PROPOSED AS &lt;code&gt;C1.2&lt;/code&gt;&lt;/strong&gt;, name the
file, and show the change itself as a machine-generated diff rather than as
quoted prose: proposal text set as a blockquote reads like the analysis
around it, and markup is mangled in the bargain. Two blocks, in this order:
a line diff for the shape, so the owner can read each version as prose, then
a word diff (&lt;code&gt;git diff --word-diff=plain&lt;/code&gt;, &lt;code&gt;[-removed-]&lt;/code&gt; against &lt;code&gt;{+added+}&lt;/code&gt;)
for the substitution, so a near-identical line cannot slip past. Give the
pair to the candidate you lean toward; give the alternatives whichever single
block carries more — the word diff for a substitution inside a surviving
sentence, the line diff for a wholesale replacement. A candidate that
changes nothing, such as &lt;em&gt;accept&lt;/em&gt;, gets no block and says so, since an empty
diff is noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An insertion needs its neighbours.&lt;/strong&gt; A pure addition has nothing to
diff against, so a word diff of it shows the new text and no location —
the owner is told what would be added and not where, which is most of what
they are being asked to judge. Show an insertion as a line diff carrying at
least one unchanged line on each side, and skip the word diff, which for an
addition only repeats the line diff inside markers. Where placement is
itself the question, widen the context until the alternatives are visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope a diff to the sentence, never the paragraph.&lt;/strong&gt; Hand-wrapped prose
reflows, so a three-word change rewrites every line after it and the diff
shows six changed lines for one changed word. Diff the affected sentence
alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reflow is invisible work, and it waits for a clean board.&lt;/strong&gt; Rewrapping,
sentence spacing, column limits, and the artifacts they produce in a diff are
the reviewer’s problem, not the owner’s. They are also &lt;em&gt;never a concern while
any entry is outstanding&lt;/em&gt;. Wrapping is downstream of content: every later edit
rewraps whatever an earlier one tidied, so fixing it mid-review is work a
subsequent concern undoes, and it inflates each diff with lines the owner did
not change. Defer it until the register is clean, then take it in one pass.
Until then, do not fix it, do not apologise for it, and do not let a ragged
line in a shown diff become a topic — if the owner raises wrapping while
concerns are open, say it is parked and move on. Never spend a line of the
owner’s attention narrating a wrap, or explaining that a word diff fragmented
because the wrap point moved. The only reflow worth mentioning is a mistake
that reached disk and was corrected there, and then only as one clause inside
the applied note.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate the diff; do not type it.&lt;/strong&gt; A hand-written diff can disagree with
the edit it claims to describe. Produce it against a scratch copy of the
file so what the owner reads is what would land.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An argument for a change is not approval of it.&lt;/strong&gt; When the owner supplies
a reason a proposal is right — “hypotheses are records”, “that word is used
elsewhere” — they are reasoning toward a decision, not announcing one. The
trap is timing: a bare justification arriving right after a decision question
reads like an answer to it. The tell is the absence of any verb aimed at the
work. Reasons, reframings, and counter-proposals all mean keep discussing.
Terseness is not the signal — “take it” and “B” are terse and decisive.
The asymmetry above governs, so re-ask in one line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moving on is not a ruling.&lt;/strong&gt; “Next”, “continue”, or a fresh question
arriving while a decision is pending advances the review; it does not settle
the pending item. Record the item as pending, say so in one line, and ask.
An owner who wants it closed will say so, and a closure inferred from
momentum is the silent disposition Section 7 forbids.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serialize for control; batch only the independent and settled.&lt;/strong&gt; When the
owner must weigh each change, take them one at a time. Batch only changes that
are mutually independent and already decided.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply, then verify.&lt;/strong&gt; After each change, check the mechanical result — that
nothing was dropped, split, or broken by the edit itself. Verification catches
the actor’s &lt;em&gt;own&lt;/em&gt; slips, not just drift.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leave cosmetic reformatting to a formatter.&lt;/strong&gt; Reflow, rewrap, whitespace, and
the like carry no review value; do not spend proposal or verification effort on
them, and do not let them churn the diff. A separate automated pass owns them.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;stay-current-freshness-and-drift&quot;&gt;5. Stay current: freshness and drift&lt;/h2&gt;
&lt;p&gt;The work changes under you — from your own edits and from the owner’s
out-of-band ones. Two guards keep you from acting on a stale view.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Freshness guard — per file.&lt;/strong&gt; Record a file’s modification time or content
hash when you read it. The trigger to re-read is &lt;em&gt;that file’s own&lt;/em&gt; change, not
the tree’s: a different file moving, or a blanket “the tree was touched” signal,
is no reason to re-read this one, and re-reading everything on any tree
modification bogs the review down. Before acting on a file, re-check &lt;em&gt;it&lt;/em&gt;; if
it moved, &lt;em&gt;re-read and diff before proceeding&lt;/em&gt; — including the owner’s commits
to that file (&lt;code&gt;git log -- &amp;lt;file&amp;gt;&lt;/code&gt;), since a clean &lt;code&gt;git status&lt;/code&gt; does not mean it
is unchanged if the owner committed out-of-band. An external edit is a change
event like any other — log it (Section 6). This is “apply, then verify”
pointed at the &lt;em&gt;input&lt;/em&gt;: confirm the material is what you think before you touch
it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anchor concerns to content, not coordinates.&lt;/strong&gt; Pin a concern to a
distinctive quote or a stable landmark, never to a number that renumbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-confirm at point of use.&lt;/strong&gt; Before acting on a pending concern, re-check
both that it is &lt;em&gt;still relevant&lt;/em&gt; — an earlier change may have fixed it, or
created a new one — and &lt;em&gt;where it now lives&lt;/em&gt; — the referent may have moved,
or &lt;em&gt;changed shape&lt;/em&gt;, as when one unit splits into two. If the anchor is gone,
the concern is resolved-or-transformed, not merely relocated.&lt;/li&gt;
&lt;li&gt;Sweep the open concerns this way after any change to the material and at the
close of each phase. Small phases keep that sweep local.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;the-log&quot;&gt;6. The log&lt;/h2&gt;
&lt;p&gt;The log is a concrete artifact kept &lt;em&gt;beside&lt;/em&gt; the work, never inside it — a
scratch file, an issue list, an editor’s quickfix window: whatever holds a
navigable register of located items. It lives under &lt;code&gt;audits/&lt;/code&gt; at the root of
the work, one file per review, named &lt;code&gt;&amp;lt;YYYYMMDD&amp;gt;-&amp;lt;unit&amp;gt;-&amp;lt;source&amp;gt;.md&lt;/code&gt; so the
unit, the date, and the checklist that drove it are visible without opening it.
It is &lt;strong&gt;shared&lt;/strong&gt; state the owner may read at any moment, not the reviewer’s
private notebook; and its existence never substitutes for stating what is open
at the point of decision (Section 2). It is to a review what a &lt;strong&gt;Vim quickfix
list&lt;/strong&gt; is to an edit session: a separate window of entries, each carrying a
location and a message, that you populate from your passes, step through, jump
to, act on, and mark — so the review is driven by working the register, not by
memory. It is born when the review starts, grows as concerns are called out
(Section 1) and dispositioned, is reconciled at close (Section 7), and is then
archived or discarded. It can outlive the review as provenance — these
checklists were themselves extracted from one such log.&lt;/p&gt;
&lt;p&gt;Keep the log’s upkeep out of the conversation. Report the work — what
changed, what is open, what is asked — and let the log absorb its
bookkeeping silently. Narrating each entry spends the owner’s attention on the
register instead of on the decisions it serves, and the owner can read the log
whenever they choose.&lt;/p&gt;
&lt;p&gt;One record, two indexes into it, both keyed by label:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;By label — the audit view.&lt;/strong&gt; One entry per concern: its label, where it
arose, its disposition (&lt;strong&gt;addressed&lt;/strong&gt; / &lt;strong&gt;deferred&lt;/strong&gt; with a reason and a revisit
trigger / &lt;strong&gt;rejected&lt;/strong&gt; with a reason / &lt;strong&gt;superseded&lt;/strong&gt; — dissolved by another
concern’s resolution rather than decided on its own merits, naming the
absorbing label / &lt;strong&gt;outstanding&lt;/strong&gt;), and a one-line
resolution note. Proposals hang under it as sub-entries, each with its own
disposition, author, and derivation (&lt;code&gt;C1.4 = C1.2 + change&lt;/code&gt;; &lt;code&gt;C1.4 supersedes   C1.1&lt;/code&gt;). Rejected alternatives are recorded, not dropped, so a later reader —
or the owner rediscovering a dead end — sees the roads not taken. This view
is the completeness check: at close, no entry may remain &lt;em&gt;outstanding&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By location — the churn view.&lt;/strong&gt; Per-location edit history, keyed by the
&lt;em&gt;applied&lt;/em&gt; label. A new proposal touching a location that already carries an
applied label is a &lt;em&gt;revisit&lt;/em&gt; signal; if it &lt;em&gt;reverts&lt;/em&gt; that prior label, that is
&lt;em&gt;oscillation&lt;/em&gt;, as opposed to legitimate revision — “we are undoing settled
work” made visible instead of left to memory. Like a quickfix list, this view
goes stale when the material shifts underneath it, which is why locations are
re-anchored on demand (Section 5) rather than trusted as stored coordinates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Two completenesses.&lt;/strong&gt; The views above prove &lt;em&gt;resolution&lt;/em&gt; — every concern
closed. They do not prove &lt;em&gt;coverage&lt;/em&gt; — every check applied — because a check
that passes raises no concern and leaves no entry. Track coverage in its own
right: each check the unit’s scope admits is run and marked &lt;em&gt;passed&lt;/em&gt;,
&lt;em&gt;concern-raised&lt;/em&gt; (with the label), or &lt;em&gt;not applicable&lt;/em&gt;. &lt;strong&gt;Report coverage even
when it is null&lt;/strong&gt; — “ran the audience pass, nothing found” — so a clean review
still shows its work and progress stays visible. On a mature unit the findings
list is nearly empty while coverage is large; only reporting both keeps that
honest. A concrete layout for coverage, concerns, and churn together is in the
Appendix.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;close-reconcile-and-converge&quot;&gt;7. Close: reconcile and converge&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reconcile the log.&lt;/strong&gt; Read the whole once, for coherence and for regressions
from earlier changes. Then walk the log: every concern is addressed,
accepted, deferred, or rejected — and &lt;em&gt;call out by name any concern that
fell unaddressed&lt;/em&gt;, and resolve or deliberately defer it. Silence is not a
disposition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep &lt;em&gt;accepted&lt;/em&gt; distinct from &lt;em&gt;rejected&lt;/em&gt;.&lt;/strong&gt; A concern is &lt;em&gt;rejected&lt;/em&gt; when it
turns out to be wrong. It is &lt;em&gt;accepted&lt;/em&gt; when it is right and the owner
chooses to live with it — a real cost, knowingly paid, not coming back.
Collapsing the two erases the difference between “we checked and it was
wrong” and “we agreed and moved on”, which is most of what a closed register
is later read for. Record the owner’s ground either way; an accepted concern
without its ground reads as an oversight to whoever finds it next.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prove stability.&lt;/strong&gt; Repeat the read after the reconciliation’s changes. A
converged result &lt;em&gt;surfaces nothing new&lt;/em&gt;. If it does, the work has not
converged: log it, address it, repeat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stopping condition:&lt;/strong&gt; a stability read that raises nothing new over a log with
no outstanding entry. That, not exhaustion, is done.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vacuity.&lt;/strong&gt; If the reconcile produced no edits — a review-only run, or a
clean full review — the stability read is vacuously satisfied: nothing changed
to destabilize it. Record it passed; do not skip it in silence.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pairing-with-a-checklist&quot;&gt;Pairing with a checklist&lt;/h2&gt;
&lt;p&gt;The checklist and the procedure are orthogonal. A checklist names &lt;em&gt;what&lt;/em&gt; to look
for and may itself be tiered by dependency: its phases become this procedure’s
dependency tiers, its categories become the concern taxonomy. This procedure
names &lt;em&gt;how&lt;/em&gt; to run the pass over it. Run a reshaping checklist before a polishing
one for the same reason you order concerns by dependency — do not polish, or
copyedit, material a deeper pass will restructure.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;appendix-log-format&quot;&gt;Appendix: log format&lt;/h2&gt;
&lt;p&gt;One register per review, kept under &lt;code&gt;audits/&lt;/code&gt; beside the work. Its sections
mirror the procedure — coverage (Section 6), concerns (the audit view), churn
(the churn view), close (Section 7). The shape matters, not the syntax; adapt
it to the tool at hand. Wrap the register at 79 columns, as the rest of the
repository wraps: a log that reflows differently from the work it tracks is
harder to read beside it and harder to diff.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Review log --- &amp;lt;unit&amp;gt;
scope:    &amp;lt;what is in&amp;gt;; context loaded: &amp;lt;neighbors / parent / referenced targets&amp;gt;
mode:     full | review-only
baseline: &amp;lt;commit or mtime at start&amp;gt;        # freshness anchor (Section 5)

## Coverage        -- every check the scope admits; the record of effort
&amp;lt;check or phase&amp;gt; : pass | C&amp;lt;n&amp;gt; | n/a (&amp;lt;why&amp;gt;)

## Concerns        -- audit view, keyed by label
[C1] &amp;lt;short name&amp;gt;  (phase &amp;lt;n&amp;gt;)  &amp;lt;open|addressed|deferred|rejected|outstanding&amp;gt;
  anchor: &amp;quot;&amp;lt;distinctive quote or landmark&amp;gt;&amp;quot;     # re-derive location from this
  note:   &amp;lt;one line: resolution, or reason to defer/reject&amp;gt;
  C1.0 (reviewer): purpose analysis  -- offered | run (&amp;lt;what it settled&amp;gt;)
  C1.1 (&amp;lt;author&amp;gt;): &amp;lt;draft or approach&amp;gt;  -- rejected (&amp;lt;reason&amp;gt;)
  C1.2 (&amp;lt;author&amp;gt;): &amp;lt;draft or approach&amp;gt;  -- accepted   [supersedes C1.1]
  C1.3 (&amp;lt;author&amp;gt;): retire, leave as written  -- rejected (&amp;lt;reason&amp;gt;)

## Churn           -- by location; only entries touched more than once
&amp;quot;&amp;lt;anchor&amp;gt;&amp;quot;: C1.2 applied ; C4.1 applied (revisit) | reverted by C7.1 (oscillation)

## Close
outstanding: &amp;lt;count -- must be 0 to converge&amp;gt;
stability:   clean (nothing new) | not converged | vacuous (no edits)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Filled from the review-only dry-run of this procedure over &lt;code&gt;sec:perturbation&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Review log --- chapters/execution.tex : sec:perturbation
scope:    the section; context: chapter intro, siblings (methodology, baseline), 6 \ref targets
mode:     review-only
baseline: ebf6644

## Coverage
phase 1 context      : pass
phase 1 audience     : pass (7 personas, none tripped)
phase 1 argument     : pass
phase 1 forward-refs : pass (all six refs point backward)
phase 1 structure    : C1
phase 1 footnotes    : pass (2 notes, both merited)
phase 2 claim        : pass
phase 2 motif        : pass
phase 2 terminology  : pass (&amp;quot;prior&amp;quot; collision gone since revert to &amp;quot;past&amp;quot;)
phase 3 craft        : pass
phase 3 cross-ref    : C2
phase 3 voice        : pass (&amp;quot;often&amp;quot; at P2 consciously kept)

## Concerns
[C1] vetting-method beat: length / possible split at &amp;quot;A promising result that survives&amp;quot;  (phase 1)  deferred
  anchor: &amp;quot;To do this vetting, vary the choices you would otherwise leave unexamined&amp;quot;
  note:   two beats but tightly coupled; not worth a split
  C1.1 (reviewer): split it into probe / interpretation  -- rejected (coupling too tight)
[C2] irreversibility framing carries three \ref in five lines  (phase 3)  rejected
  anchor: &amp;quot;cost (Section~\ref{sec:longideal}).  High-stakes applications&amp;quot;
  note:   each anchors a distinct claim; not over-referencing

## Churn
(none -- review-only)

## Close
outstanding: 0
stability:   vacuous (no edits)&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;provenance&quot;&gt;Provenance&lt;/h2&gt;
&lt;p&gt;Distilled from a long collaborative revision in which the process became as much
the product as the text. It is deliberately domain-neutral: the same cadence
runs a copyedit, a conceptual edit, a code review, or a spec review. Extend it
as new kinds of friction surface.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/8326195607001866144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/8326195607001866144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8326195607001866144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8326195607001866144'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/10/a-reusable-review-procedure-for-clankers.html' title='A Reusable Review Procedure for Clankers'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-1771024529082746632</id><published>2026-10-08T13:30:01.230+00:00</published><updated>2026-10-08T13:30:01.230+00:00</updated><title type='text'>Sonnet of the Treasuries</title><content type='html'>&lt;p&gt;(&lt;i&gt;Clankered-up as a memory aid for treasury bills, etc...&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;
The bill, a year at most, defers all paying:&lt;br/&gt;
sold at a discount, coupons not appended.&lt;br/&gt;
The note sends coupons twice a year, while staying&lt;br/&gt;
from two to ten years, face paid when it&#39;s ended.&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
The bond pays likewise, only more extended:&lt;br/&gt;
twenty or thirty years is its duration.&lt;br/&gt;
TIPS, five or ten or thirty, are defended:&lt;br/&gt;
face is the floor; principal adds inflation.&lt;br/&gt;
&lt;/p&gt;
  
&lt;p&gt;
The two-year floater pays with fluctuation&lt;br/&gt;
each quarter, by the thirteen-week bill driven.&lt;br/&gt;
Cash management bills come with variation&lt;br/&gt;
in term, and have no auction schedule given.&lt;br/&gt;
&lt;/p&gt;
  
&lt;p&gt;
A thousand buys each one, no state tax owing,&lt;br/&gt;
but tax that&#39;s federal will keep on flowing.&lt;br/&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/1771024529082746632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/1771024529082746632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1771024529082746632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1771024529082746632'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/10/sonnet-of-treasuries.html' title='Sonnet of the Treasuries'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-8578977018888816729</id><published>2026-09-24T13:14:26.684+00:00</published><updated>2026-09-24T13:34:34.473+00:00</updated><title type='text'>Charlie Munger&#39;s Mental Models</title><content type='html'>&lt;style&gt;
.munger-tendencies { border-collapse: collapse; }
.munger-tendencies th, .munger-tendencies td { border: 1px solid #999; padding: 0.25em 0.6em; text-align: left; }
.munger-tendencies th { background: #eee; }
&lt;/style&gt;
&lt;p&gt;I bought, read, and enjoyed &lt;a href=&quot;https://www.stripe.press/poor-charlies-almanack/book&quot;&gt;&lt;em&gt;Poor
Charlie&#39;s Almanack&lt;/em&gt;&lt;/a&gt; from &lt;a href=&quot;https://stripe.press&quot;&gt;Stripe Press&lt;/a&gt;. Munger&#39;s mental models are interwoven throughout its text.  I wanted a model summary to ease use.&lt;/p&gt;
&lt;p&gt;
  The following summary was mechanically created with &lt;a href=&quot;https://claude.ai/&quot;&gt;Claude&lt;/a&gt;. Each model cites the talk where Munger states or uses it. Chapter
Three is the editors&#39; overview; a model found only there is marked as
their summary.
&lt;/p&gt;
&lt;h2&gt;Thinking with Models&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hang facts on a latticework of models.&lt;/strong&gt; Isolated
facts are unusable. Array direct and vicarious experience on a framework
of theory. &lt;em&gt;Talks Two, Three.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One model distorts reality to fit itself.&lt;/strong&gt; The man
with a hammer sees only nails. Carry a full kit. &lt;em&gt;Talks Two, Four,
Five, Nine, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Draw models from every basic discipline.&lt;/strong&gt; Take the
big ideas from each freshman course and ignore jurisdictional
boundaries. Roughly 80 to 100 models carry most of the load. &lt;em&gt;Talks
Two, Three, Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explain at the most fundamental level available.&lt;/strong&gt;
Know every big idea in disciplines more fundamental than yours, reduce
explanations to them, and attribute fully. &lt;em&gt;Talks Five,
Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze rational interests, then subconscious
distortions.&lt;/strong&gt; First weigh real interests and probabilities. Then
weigh the tendencies bending the actors&#39; judgment. &lt;em&gt;Talk
Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solve problems backward as well as forward.&lt;/strong&gt; Ask
what causes failure, then avoid it. Jacobi: &quot;Invert, always invert.&quot;
&lt;em&gt;Talks One, Three, Four, Ten, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settle the no-brainer questions first.&lt;/strong&gt; Obvious
decisions simplify the hard ones. &lt;em&gt;Talk Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reason quantitatively about practical life.&lt;/strong&gt;
Galileo&#39;s view that math reveals reality holds outside science. &lt;em&gt;Talk
Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply models by checklist, not by recall.&lt;/strong&gt; Run the
list; don&#39;t hope the right model surfaces. &lt;em&gt;Talks Three, Five, Nine,
Ten, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Train judgment the way pilots are trained.&lt;/strong&gt; Wide
coverage, practiced fluency, forward and reverse thinking, training
weighted by consequence, mandatory checklists, and simulator drills
against skill decay. &lt;em&gt;Talk Five.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hunt for evidence against your own theories.&lt;/strong&gt; Darwin
prioritized disconfirming evidence. Einstein credited self-criticism.
&lt;em&gt;Talks One, Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make models as simple as possible, no simpler.&lt;/strong&gt;
Craving physics-grade precision in soft systems produces false
precision. &lt;em&gt;Talks Three, Four, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heavy ideology destroys objectivity.&lt;/strong&gt; Avoid it in
yourself and in colleagues you choose. &lt;em&gt;Talks Three, Five, Ten.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Know the edge of your knowledge.&lt;/strong&gt; Override experts
whose incentives impair them. Defer when you have nothing to add.
&lt;em&gt;Talk Three.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask why, and always give reasons.&lt;/strong&gt; Reasons aid
understanding and compliance. Carl Braun fired writers who twice omitted
the why. &lt;em&gt;Talks Two, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Mathematics and Probability&lt;/h2&gt;
&lt;ol start=&quot;16&quot;&gt;
&lt;li&gt;&lt;strong&gt;Compound growth dominates long horizons.&lt;/strong&gt; Among the
most important models. Log paper shows the compounding rate as a straight
line. &lt;em&gt;Talks Two, Three.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Count outcomes with Fermat-Pascal probability.&lt;/strong&gt;
Elementary permutations and combinations, unnatural to the brain and so
worth drilling. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Map choices as decision trees.&lt;/strong&gt; Enumerate outcomes
and weight them. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Many quantities follow the bell curve.&lt;/strong&gt; Know its
shape well enough for rough estimates. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weigh costs against benefits algebraically.&lt;/strong&gt;
Cost-benefit analysis is high school algebra in jargon. &lt;em&gt;Talk
Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Most participants must get average results.&lt;/strong&gt; Only 20
percent can be in the top fifth. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Engineering, Physics, and
Chemistry&lt;/h2&gt;
&lt;ol start=&quot;22&quot;&gt;
&lt;li&gt;&lt;strong&gt;Redundant backups let systems survive component
failure.&lt;/strong&gt; &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systems change behavior abruptly past breakpoints.&lt;/strong&gt;
&lt;em&gt;Talks Two, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small additions past critical mass yield outsized
results.&lt;/strong&gt; &lt;em&gt;Talks Two, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality is a priced tradeoff against failure
probability.&lt;/strong&gt; Deming&#39;s quality control is Fermat-Pascal applied
to engineering. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-reinforcing processes accelerate on their own.&lt;/strong&gt;
Autocatalysis. Disney&#39;s film library earned videocassette profits
without new invention. &lt;em&gt;Talks Three, Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thermodynamics bounds the economics of production.&lt;/strong&gt;
Trace how inputs convert to delivered goods. &lt;em&gt;Chapter Three, editor&#39;s
summary.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Biology and Physiology&lt;/h2&gt;
&lt;ol start=&quot;28&quot;&gt;
&lt;li&gt;&lt;strong&gt;Economies behave like ecosystems; specialists own
niches.&lt;/strong&gt; &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New technology destroys incumbents.&lt;/strong&gt; Competitive
destruction: the horseless carriage killed the buggy whip factory.
&lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evolved physiology throttles consumption.&lt;/strong&gt;
Aftertaste enforces moderation; Coke must defeat it. &lt;em&gt;Talk
Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unowned shared resources get depleted.&lt;/strong&gt; Hardin&#39;s
tragedy of the commons, the &quot;invisible foot&quot; beside Smith&#39;s invisible
hand. &lt;em&gt;Talks Five, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Microeconomics and Business&lt;/h2&gt;
&lt;ol start=&quot;32&quot;&gt;
&lt;li&gt;&lt;strong&gt;Scale confers cost, information, and social-proof
advantages.&lt;/strong&gt; Experience curves, geometry, purchasing power,
advertising reach, brand familiarity, internal specialization, and
winner-take-all cascades. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scale breeds bureaucracy and invites specialist
attack.&lt;/strong&gt; Territoriality and perverse incentives slow big firms;
narrow competitors pick them off. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chain stores turn scale into buying power and
learning.&lt;/strong&gt; Central expert buying, many small experiments,
enforced best practice. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oligopolies compete either rationally or
destructively.&lt;/strong&gt; Cereal makers prosper while airlines lose.
Munger admits he lacks a full model. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal exclusivity creates small monopolies.&lt;/strong&gt;
Patents, trademarks, and franchises. Trademarks also give owners an
incentive to guard quality. &lt;em&gt;Talks Two, Three.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commodity producers pass technology gains to
customers.&lt;/strong&gt; A monopoly keeps them. &lt;em&gt;Talks Two,
Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ride a new technology wave from its front edge.&lt;/strong&gt;
Early leaders like NCR, Microsoft, and Intel hold long runs; those who
fall off get stuck in the shallows. &lt;em&gt;Talks Two, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cut away everything but the sound core.&lt;/strong&gt; The cancer
surgery formula saved GEICO. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unused pricing power is money in the street.&lt;/strong&gt;
Disney, See&#39;s, and Coke could raise prices without losing volume.
&lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A higher price can raise volume.&lt;/strong&gt; Price signals
quality. Munger asks whether the extra margin could bribe the buyer&#39;s
agent. &lt;em&gt;Talk Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specialization multiplies output by design or by
trade.&lt;/strong&gt; Smith&#39;s pin factory is planned; Ricardo&#39;s comparative
advantage arises spontaneously. &lt;em&gt;Talk Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extreme success follows four patterns.&lt;/strong&gt; Maximizing
one or two variables, combining factors past a breakpoint, excelling
across many factors, or riding a big wave. &lt;em&gt;Talk Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consequences have consequences.&lt;/strong&gt; Ignoring
second-order effects wrecked Medicare cost forecasts. &lt;em&gt;Talk
Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hidden embezzlement inflates perceived wealth.&lt;/strong&gt;
Febezzlement: costs that feel like gains to those paying them. &lt;em&gt;Talks
Seven, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtue raises economic output; vice lowers it.&lt;/strong&gt; A
reliability ethos and honest accounting pay. &lt;em&gt;Talks Eight,
Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accounting is an essential but crude approximation.&lt;/strong&gt;
Depreciation lives are guesses. Stock-option accounting is the central
abuse. &lt;em&gt;Talks Two, Eight.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Psychology&lt;/h2&gt;
&lt;p&gt;Talk Eleven lists 25 tendencies. Munger calls them overlapping,
suited to checklist use, and mostly beneficial despite misfiring.&lt;/p&gt;
&lt;table class=&quot;munger-tendencies&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Tendency&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Tendency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Reward- and punishment-superresponse&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;Deprival-superreaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Liking/loving&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;Social-proof&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Disliking/hating&lt;/td&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Contrast-misreaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Doubt-avoidance&lt;/td&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;Stress-influence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Inconsistency-avoidance&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;Availability-misweighing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;Curiosity&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Use-it-or-lose-it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;td&gt;Kantian fairness&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;Drug-misinfluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;Envy/jealousy&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;td&gt;Senescence-misinfluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Reciprocation&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;Authority-misinfluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;Influence-from-mere-association&lt;/td&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Twaddle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;Simple, pain-avoiding psychological denial&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Reason-respecting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Excessive self-regard&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;td&gt;Lollapalooza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;Overoptimism&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Models built on these tendencies:&lt;/p&gt;
&lt;ol start=&quot;48&quot;&gt;
&lt;li&gt;&lt;strong&gt;Incentives bias judgment without conscious malice.&lt;/strong&gt;
FedEx fixed its night shift by paying per shift, not per hour. Builds on
A. &lt;em&gt;Talks Two, Four, Five, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditioning creates buying reflexes.&lt;/strong&gt; Coca-Cola
sells operant rewards and Pavlovian associations. Builds on A and J.
&lt;em&gt;Talk Four.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People punish bearers of bad news.&lt;/strong&gt; Paley&#39;s CBS
heard only good news and drifted into unreality. Builds on J. &lt;em&gt;Talks
Two, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widespread misconduct recruits the honest.&lt;/strong&gt; The
Serpico effect. Builds on A and O. &lt;em&gt;Talks Three, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Near misses drive heavier gambling.&lt;/strong&gt; Slot machines
engineered for near misses outearn others. Builds on N. &lt;em&gt;Talks
Nine, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Converging forces produce extreme outcomes.&lt;/strong&gt;
Tuberculosis needed three drugs; Milgram and the McDonnell Douglas
evacuation test show psychological confluence. Builds on Y. &lt;em&gt;Talks
Four, Eleven.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Investing&lt;/h2&gt;
&lt;ol start=&quot;54&quot;&gt;
&lt;li&gt;&lt;strong&gt;Markets pay only for mispriced odds beyond the house
take.&lt;/strong&gt; The pari-mutuel model. Bet rarely and only on mispricing.
&lt;em&gt;Talks Two, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat market quotes as offers, not verdicts.&lt;/strong&gt;
Graham&#39;s manic-depressive Mr. Market offers options you may ignore.
&lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buy far below private-owner value.&lt;/strong&gt; Graham&#39;s margin
of safety. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-run stock returns track return on capital.&lt;/strong&gt; Over 40
years, a 6 percent business yields about 6 percent however cheaply
bought. &lt;em&gt;Talk
Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bet on the business before the manager.&lt;/strong&gt; Rarely,
follow an extraordinary manager. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compete only where you have an edge.&lt;/strong&gt; Know your
circle of competence. The best plumbing contractor in Bemidji is
attainable. &lt;em&gt;Talks Two, Three.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concentrate on your few real insights.&lt;/strong&gt; Buffett&#39;s
20-punch card. Ten insights made most of Berkshire&#39;s wealth. &lt;em&gt;Talk
Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deferring taxes compounds returns.&lt;/strong&gt; At a 35 percent
rate over 30 years, paying once at the end adds 2 to 3.5 points a
year. &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intermediary costs are a certain drag on all investors
combined.&lt;/strong&gt; Croupier costs. &lt;em&gt;Talks Six, Seven, Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rich institutions should self-insure against
volatility.&lt;/strong&gt; Overdiversifying buys insurance they don&#39;t need.
&lt;em&gt;Talk Six.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Products are built to sell, not to work.&lt;/strong&gt; &quot;I don&#39;t
sell to fish.&quot; &lt;em&gt;Talk Two.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;ol start=&quot;65&quot;&gt;
&lt;li&gt;&lt;strong&gt;Unreliability cancels every other virtue.&lt;/strong&gt;
Reliability is the most learnable advantage. &lt;em&gt;Talks One,
Ten.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn from others&#39; mistakes.&lt;/strong&gt; Most disasters are
unoriginal. Befriend the instructive dead. &lt;em&gt;Talks One, Ten.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Envy, resentment, and self-pity guarantee misery.&lt;/strong&gt;
&lt;em&gt;Talks One, Ten.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deserve your success.&lt;/strong&gt; Deliver what you would buy
yourself. Deserved success deflects envy. &lt;em&gt;Talks Four, Ten.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hold people accountable for outcomes regardless of
fault.&lt;/strong&gt; A captain whose ship runs aground is finished.
Individual injustice buys systemic care. &lt;em&gt;Talks Three,
Nine.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deserved trust beats bureaucratic procedure.&lt;/strong&gt; A
seamless web of trust is civilization&#39;s higher form. &lt;em&gt;Talk
Ten.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/8578977018888816729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/8578977018888816729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8578977018888816729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8578977018888816729'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/09/charlie-mungers-mental-models.html' title='Charlie Munger&#39;s Mental Models'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-8437719942721628952</id><published>2026-09-23T19:21:31.131+00:00</published><updated>2026-09-23T19:21:31.131+00:00</updated><title type='text'>Vera</title><content type='html'>&lt;p&gt;With apologies to whichever one&#39;s Pink:&lt;/p&gt;

&lt;blockquote&gt;
Does anybody here remember Larry Wall?&lt;br/&gt;
Remember how they said that 6 would be released on Christmas day?&lt;br/&gt;
Larry, Larry, what has become of you?&lt;br/&gt;
Does anybody else in here know about Raku?&lt;br/&gt;
&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/8437719942721628952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/8437719942721628952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8437719942721628952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8437719942721628952'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/09/vera.html' title='Vera'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-6686512766698790853</id><published>2026-09-21T13:59:11.947+00:00</published><updated>2026-09-21T13:59:36.891+00:00</updated><title type='text'>Mounting Google Drive on Ubuntu 26.04 with rclone</title><content type='html'>&lt;p&gt;(&lt;i&gt;Notes captured from a &lt;a href=&quot;https://assistant.kagi.com/&quot;&gt;Kagi Assistant&lt;/a&gt; thread&lt;/i&gt;...)&lt;/p&gt;

&lt;p&gt;Ubuntu 26.04 LTS ships GNOME 50, which &lt;strong&gt;removed the built-in Google Drive mount&lt;/strong&gt; — the old GVfs backend was dropped because it depended on unmaintained &lt;code&gt;libgdata&lt;/code&gt;/&lt;code&gt;libsoup2.4&lt;/code&gt;. The community replacement (fluhus&#39;s PPA backend) works, but the most robust distro-agnostic option is &lt;code&gt;rclone mount&lt;/code&gt;.&lt;/p&gt;

  &lt;h2&gt;Why not apt or snap?&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Ubuntu&#39;s apt package is rclone 1.60.1 — from 2022.&lt;/strong&gt; It&#39;s frozen for the entire LTS release.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;The snap blocks &lt;code&gt;rclone mount&lt;/code&gt; entirely&lt;/strong&gt; (&quot;Fatal error: mounting is not supported when running from snap&quot;) due to its FUSE sandbox.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Instead, install the current binary directly — rclone is a single static Go binary, and it updates &lt;em&gt;itself&lt;/em&gt; via &lt;code&gt;rclone selfupdate&lt;/code&gt; (manual command; wrap it in a systemd timer or cron if you want it scheduled):&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;cd /tmp
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
mkdir -p ~/bin
install rclone-*-linux-amd64/rclone ~/bin/rclone&lt;/code&gt;&lt;/pre&gt;

  &lt;h2&gt;Creating your own Google OAuth client ID&lt;/h2&gt;

  &lt;p&gt;rclone ships with a shared client ID, but Google rate-limits it across &lt;em&gt;all&lt;/em&gt; rclone users — so the official docs recommend creating your own. It takes about five minutes and only needs doing once. For more on Google&#39;s OAuth policies and how test-mode projects work, see my &lt;a href=&quot;https://rhysu.github.io/my-oauth-homepage&quot;&gt;companion page on the subject&lt;/a&gt;.&lt;/p&gt;

  &lt;h3&gt;Step 1: Create a new Google Cloud project&lt;/h3&gt;
  &lt;ol&gt;
    &lt;li&gt;Go to the &lt;strong&gt;Google Cloud Console&lt;/strong&gt; at &lt;a href=&quot;https://console.cloud.google.com/&quot;&gt;https://console.cloud.google.com/&lt;/a&gt; and sign in with your Google account.&lt;/li&gt;
    &lt;li&gt;Click the &lt;strong&gt;project picker&lt;/strong&gt; at the top of the page (next to the &quot;Google Cloud&quot; logo) → &lt;strong&gt;New Project&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Give it a name (e.g. &lt;code&gt;rclone&lt;/code&gt;) — you can leave the auto-generated Project ID as-is — and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Once created, make sure the new project is &lt;strong&gt;selected&lt;/strong&gt; in the project picker; everything below happens inside it.&lt;/li&gt;
  &lt;/ol&gt;

  &lt;p&gt;Keep this project dedicated to rclone — it makes the credentials easy to find later, and isolates anything you enable from other projects.&lt;/p&gt;

  &lt;h3&gt;Step 2: Enable the Google Drive API&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;APIs &amp;amp; Services → Library&lt;/strong&gt; → search for &lt;strong&gt;Google Drive API&lt;/strong&gt; → &lt;strong&gt;Enable&lt;/strong&gt;.&lt;/p&gt;

  &lt;h3&gt;Step 3: Configure the OAuth consent screen&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;APIs &amp;amp; Services → OAuth consent screen&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Choose &lt;strong&gt;External&lt;/strong&gt; (the only option for personal accounts) and continue.&lt;/li&gt;
    &lt;li&gt;Fill in an app name (e.g. &lt;code&gt;rclone&lt;/code&gt;) and your email as the support/contact email.&lt;/li&gt;
    &lt;li&gt;Add your own Google account as a &lt;strong&gt;test user&lt;/strong&gt; — required, since the project stays in test mode.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;No Google verification needed — test mode is fine for personal use as long as your account is a test user.&lt;/p&gt;

  &lt;h3&gt;Step 4: Create the OAuth client&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;APIs &amp;amp; Services → Credentials → Create Credentials → OAuth client ID&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Application type: &lt;strong&gt;Desktop app&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;, then copy the &lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt;.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3&gt;A note on the companion page&lt;/h3&gt;
  &lt;p&gt;The OAuth policy notes referenced above live on a &lt;a href=&quot;https://rhysu.github.io/my-oauth-homepage&quot;&gt;GitHub Pages site&lt;/a&gt;, and two things are worth knowing when publishing one:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Initial deployment takes a while.&lt;/strong&gt; After pushing the site and enabling Pages, the build and propagation can take several minutes to a few hours before the URL resolves and serves content. Don&#39;t panic if it 404s at first.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Verify the site with Google Search Console.&lt;/strong&gt; For Google to index and reference the page, verify ownership in &lt;a href=&quot;https://search.google.com/search-console&quot;&gt;Google Search Console&lt;/a&gt;. The easiest method for a GitHub Pages site is the &lt;strong&gt;HTML tag&lt;/strong&gt;: Search Console gives you a &lt;code&gt;&amp;lt;meta name=&quot;google-site-verification&quot; content=&quot;...&quot;&amp;gt;&lt;/code&gt; tag, which you add to the page&#39;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, push, and click Verify. Since you control the source directly, this is more convenient than a DNS TXT record — and it survives Pages rebuilds as long as the tag stays in your template.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Configuring the remote&lt;/h2&gt;
  &lt;p&gt;Run &lt;code&gt;rclone config&lt;/code&gt; as your normal user (never sudo — the token belongs in your config, not root&#39;s):&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;n) new remote → name: GDrive → storage: drive
client_id:     &amp;lt;paste your Client ID&amp;gt;
client_secret: &amp;lt;paste your Client Secret&amp;gt;
scope:         1 (full access)
root_folder_id: leave blank&lt;/code&gt;&lt;/pre&gt;

  &lt;h3&gt;The OAuth verification dance&lt;/h3&gt;
  &lt;p&gt;During setup you&#39;ll hit Google&#39;s security screening:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;rclone opens a browser to Google&#39;s consent page.&lt;/li&gt;
    &lt;li&gt;Google warns &lt;strong&gt;&quot;Google hasn&#39;t verified this app&quot;&lt;/strong&gt; — expected, because your project is in test mode rather than published/verified.&lt;/li&gt;
    &lt;li&gt;Click &lt;strong&gt;Advanced → Go to rclone (unsafe)&lt;/strong&gt; — it&#39;s safe; you&#39;re authorizing your own project to access &lt;em&gt;your own&lt;/em&gt; Drive.&lt;/li&gt;
    &lt;li&gt;Approve, and the token is saved to the config.&lt;/li&gt;
  &lt;/ol&gt;

  &lt;p&gt;The config lives at &lt;strong&gt;&lt;code&gt;~/.config/rclone/rclone.conf&lt;/code&gt;&lt;/strong&gt; (check with &lt;code&gt;rclone config file&lt;/code&gt;) — a plain text file containing your OAuth tokens, created &lt;code&gt;0600&lt;/code&gt;. Back it up like a password file; copying it to another machine carries the tokens with it.&lt;/p&gt;

  &lt;h2&gt;Test mount&lt;/h2&gt;
  &lt;pre&gt;&lt;code&gt;mkdir -p ~/GDrive
rclone mount GDrive: ~/GDrive --vfs-cache-mode writes --daemon&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&lt;code&gt;--vfs-cache-mode writes&lt;/code&gt; is essential for Drive — many apps fail writing directly to the mount without it.&lt;/p&gt;

  &lt;h2&gt;Running automatically at login: a systemd user unit&lt;/h2&gt;
  &lt;p&gt;Drop &lt;code&gt;--daemon&lt;/code&gt; (systemd backgrounds the process itself) and create &lt;code&gt;~/.config/systemd/user/rclone-gdrive.service&lt;/code&gt;:&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;[Unit]
Description=rclone mount of Google Drive
AssertPathIsDirectory=%h/GDrive
After=network-online.target

[Service]
Type=notify
ExecStart=%h/bin/rclone mount GDrive: %h/GDrive \
    --vfs-cache-mode writes \
    --dir-cache-time 12h \
    --cache-dir %h/.cache/rclone
ExecStop=/bin/fusermount -u %h/GDrive
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;Then:&lt;/p&gt;
  &lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user enable --now rclone-gdrive.service
systemctl --user status rclone-gdrive.service&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;Useful commands:&lt;/p&gt;
  &lt;pre&gt;&lt;code&gt;systemctl --user stop rclone-gdrive      # unmount
systemctl --user restart rclone-gdrive   # after config changes
journalctl --user -u rclone-gdrive -f    # live logs&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;To stop a manually-daemonized mount first: &lt;code&gt;fusermount -u ~/GDrive&lt;/code&gt; (lazy variant: &lt;code&gt;-uz&lt;/code&gt; if a file handle is stuck).&lt;/p&gt;

  &lt;p&gt;&lt;code&gt;Type=notify&lt;/code&gt; means systemd waits until the mount is genuinely ready; &lt;code&gt;Restart=on-failure&lt;/code&gt; recovers from network blips. If you want the mount alive even with no login session, add &lt;code&gt;sudo loginctl enable-linger $USER&lt;/code&gt;.&lt;/p&gt;

  &lt;h2&gt;Keeping it updated&lt;/h2&gt;
  &lt;pre&gt;&lt;code&gt;~/bin/rclone selfupdate        # run occasionally; it&#39;s a one-shot command&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;Or schedule it — a systemd user timer with &lt;code&gt;OnCalendar=weekly&lt;/code&gt; works nicely. Note a running mount keeps the old code until restarted.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/6686512766698790853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/6686512766698790853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/6686512766698790853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/6686512766698790853'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/09/mounting-google-drive-on-ubuntu-2604.html' title='Mounting Google Drive on Ubuntu 26.04 with rclone'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-2795495721009602296</id><published>2026-08-30T13:55:43.553+00:00</published><updated>2026-08-30T14:00:11.573+00:00</updated><title type='text'>Window, Workspace, and System keyboard shortcuts for Ubuntu 24.04 and 26.04</title><content type='html'>&lt;p&gt;&lt;i&gt;(Distilled from &lt;a href=&quot;https://www.glukhov.org/developer-tools/cheatsheets/ubuntu-keyboard-shortcuts-cheatsheet/&quot;&gt;a larger summary&lt;/a&gt;, augmented, reorganized, and saved here for posterity...)&lt;/i&gt;&lt;/p&gt;

&lt;h2&gt;Window Management&lt;/h2&gt;
&lt;table style=&quot;border-collapse:collapse;table-layout:fixed;width:680px&quot;&gt;
&lt;tr&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left;width:280px&quot;&gt;Shortcut&lt;/th&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Action&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; A&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Show all applications&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Tab&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Switch applications&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Tab&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Switch windows&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Shift &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Tab&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Switch windows in reverse&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; ↑&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;↓&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Maximize / restore window&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; ←&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;→&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Snap window to left / right half of screen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Shift &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; ←&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;→&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;↑&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;↓&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Move window to adjacent monitor&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; H&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Minimize/hide window&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; F4&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Close current window&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h2&gt;Workspace Navigation&lt;/h2&gt;
&lt;table style=&quot;border-collapse:collapse;table-layout:fixed;width:680px&quot;&gt;
&lt;tr&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left;width:280px&quot;&gt;Shortcut&lt;/th&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Action&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Page Up&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Page Down&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Switch to previous / next workspace&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Home&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;End&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Move to first / last workspace&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Shift &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Page Up&lt;/code&gt; | &lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Page Down&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Move window to previous / next workspace&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h2&gt;System Controls&lt;/h2&gt;
&lt;table style=&quot;border-collapse:collapse;table-layout:fixed;width:680px&quot;&gt;
&lt;tr&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left;width:280px&quot;&gt;Shortcut&lt;/th&gt;&lt;th style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Action&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Open Activities overview&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; S&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Quick settings menu&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; V&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Show notification list&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Super &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; L&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Lock screen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Ctrl &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Delete&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Log out menu&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Print Screen&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Open screenshot tool&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Print Screen&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Screenshot of current window&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Shift &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Print Screen&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Screenshot of entire screen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;&lt;code style=&quot;color:#c7254e;background:#f5f5f5;padding:2px 4px;border-radius:3px&quot;&gt;Ctrl &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; Alt &lt;span style=&quot;color:#000&quot;&gt;+&lt;/span&gt; T&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;border:1px solid #ccc;padding:4px 8px;text-align:left&quot;&gt;Open terminal&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/2795495721009602296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/2795495721009602296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2795495721009602296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2795495721009602296'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/08/window-workspace-and-system-keyboard.html' title='Window, Workspace, and System keyboard shortcuts for Ubuntu 24.04 and 26.04'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-2588421354487531980</id><published>2026-08-26T01:01:35.674+00:00</published><updated>2026-08-26T01:01:35.674+00:00</updated><title type='text'>Connecting a Nintendo Switch Pro Controller Wirelessly to Ubuntu 26.04</title><content type='html'>&lt;p&gt;&lt;i&gt;(Courtesy of the &lt;a href=&quot;https://assistant.kagi.com/&quot;&gt;Kagi Assistant&lt;/a&gt; and saved for posterity...)&lt;/i&gt;&lt;/p&gt;

&lt;h3&gt;Context &amp;amp; Symptoms&lt;/h3&gt;
&lt;p&gt;
  &lt;strong&gt;System:&lt;/strong&gt; Ubuntu 26.04 (Linux), using the in-kernel &lt;code&gt;hid_nintendo&lt;/code&gt; driver
  (&lt;code&gt;057e:2009&lt;/code&gt;), connecting a Nintendo Switch Pro Controller over Bluetooth.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Symptoms:&lt;/strong&gt; The controller paired successfully and &lt;code&gt;hid_nintendo&lt;/code&gt; bound to it
  in &lt;code&gt;dmesg&lt;/code&gt;, but two problems appeared:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    The controller would &lt;strong&gt;immediately disconnect&lt;/strong&gt; when &lt;code&gt;evtest&lt;/code&gt; (or any program)
    tried to read from the device, with the error:
    &lt;code&gt;expected 24 bytes, got -1 — No such device&lt;/code&gt;.
  &lt;/li&gt;
  &lt;li&gt;
    After fixing the disconnect, &lt;code&gt;evtest&lt;/code&gt; could see the controller&#39;s input node but
    &lt;strong&gt;no button or stick events appeared&lt;/strong&gt; when pressing anything. The controller worked
    perfectly when connected via USB-C cable — the problem was Bluetooth-only.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  The root causes were two separate BlueZ/Bluetooth configuration issues: a firmware quirk in the
  controller that rejects adapters with unexpected names, and BlueZ&#39;s default UHID transport silently
  failing to forward HID input reports to the kernel.
&lt;/p&gt;

&lt;hr&gt;

&lt;h3&gt;Step 1: Rename the Bluetooth adapter to &amp;ldquo;Nintendo&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;
  The Pro Controller&#39;s firmware has a quirk where it disconnects if the Bluetooth adapter name
  doesn&#39;t match what it expects. Renaming the adapter satisfies the handshake.
&lt;/p&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/bluetooth/main.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/bluetooth/main.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Under &lt;code&gt;[General]&lt;/code&gt;, set:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[General]
Name = Nintendo
Alias = Nintendo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart Bluetooth:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart bluetooth&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;This fixed the immediate disconnection&lt;/strong&gt; observed when &lt;code&gt;evtest&lt;/code&gt; tried to read from the device.&lt;/p&gt;

&lt;hr&gt;

&lt;h3&gt;Step 2: Disable UHID (use kernel HIDP instead)&lt;/h3&gt;
&lt;p&gt;
  BlueZ&#39;s default UHID (userspace HID) transport was creating the input device but
  &lt;strong&gt;not forwarding input reports&lt;/strong&gt; from the controller to the kernel — so
  &lt;code&gt;evtest&lt;/code&gt; saw the device but no button events ever arrived. Switching to kernel HIDP
  fixed this.
&lt;/p&gt;
&lt;p&gt;
  The telltale sign in &lt;code&gt;dmesg&lt;/code&gt; was the input device path containing
  &lt;code&gt;/devices/virtual/misc/uhid/&lt;/code&gt;, indicating the UHID transport was in use:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input: Pro Controller as /devices/virtual/misc/uhid/0005:057E:2009.000E/input/input31&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/bluetooth/input.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/bluetooth/input.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Under &lt;code&gt;[General]&lt;/code&gt;, set:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[General]
UserspaceHID=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart Bluetooth:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart bluetooth&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Note: This requires the &lt;code&gt;hidp&lt;/code&gt; kernel module. On stock Ubuntu it should be available,
  but if the controller fails to connect after this change, load it manually:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo modprobe hidp
echo &quot;hidp&quot; | sudo tee /etc/modules-load.d/hidp.conf&lt;/code&gt;&lt;/pre&gt;

&lt;hr&gt;

&lt;h3&gt;Step 3: Re-pair the controller&lt;/h3&gt;
&lt;p&gt;
  Remove the old pairing and re-pair fresh, since the Bluetooth configuration has changed:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bluetoothctl
[bluetooth]# remove &amp;lt;MAC_ADDRESS&amp;gt;
[bluetooth]# scan on
# (hold the Sync button on the Pro Controller until LEDs flash)
[bluetooth]# pair &amp;lt;MAC_ADDRESS&amp;gt;
[bluetooth]# trust &amp;lt;MAC_ADDRESS&amp;gt;
[bluetooth]# connect &amp;lt;MAC_ADDRESS&amp;gt;
[bluetooth]# quit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  The &lt;code&gt;trust&lt;/code&gt; command is important — without it, the controller may disconnect after pairing.
&lt;/p&gt;

&lt;hr&gt;

&lt;h3&gt;Step 4: Verify&lt;/h3&gt;
&lt;p&gt;Confirm the input device is no longer on the UHID path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dmesg | grep -i &quot;057e:2009&quot; | tail -10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  The &lt;code&gt;input:&lt;/code&gt; line should now reference a real Bluetooth device path rather than
  &lt;code&gt;/devices/virtual/misc/uhid/&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;Test with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo evtest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Select &lt;strong&gt;&amp;ldquo;Pro Controller&amp;rdquo;&lt;/strong&gt; (not &amp;ldquo;Pro Controller (IMU)&amp;rdquo;) and press
  buttons — events should now stream.
&lt;/p&gt;

&lt;hr&gt;

&lt;h3&gt;Summary of problems and fixes&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;border: 1px solid #999; padding: 8px 12px; text-align: left; background: #f0f0f0;&quot;&gt;Problem&lt;/th&gt;
      &lt;th style=&quot;border: 1px solid #999; padding: 8px 12px; text-align: left; background: #f0f0f0;&quot;&gt;Cause&lt;/th&gt;
      &lt;th style=&quot;border: 1px solid #999; padding: 8px 12px; text-align: left; background: #f0f0f0;&quot;&gt;Fix&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;Controller disconnects when &lt;code&gt;evtest&lt;/code&gt; opens it&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;BT adapter name doesn&#39;t match controller&#39;s firmware expectation&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;Rename adapter to &amp;ldquo;Nintendo&amp;rdquo; in &lt;code&gt;main.conf&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;&lt;code&gt;evtest&lt;/code&gt; sees the device but no button events&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;BlueZ UHID transport creates input node but doesn&#39;t forward HID reports&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;Set &lt;code&gt;UserspaceHID=false&lt;/code&gt; in &lt;code&gt;input.conf&lt;/code&gt; to use kernel HIDP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;USB worked but Bluetooth didn&#39;t&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;USB bypasses BlueZ entirely; Bluetooth was broken at the BlueZ &amp;rarr; UHID bridge&lt;/td&gt;
      &lt;td style=&quot;border: 1px solid #999; padding: 8px 12px;&quot;&gt;Same &amp;mdash; switching to HIDP bypasses the broken bridge&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/2588421354487531980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/2588421354487531980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2588421354487531980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2588421354487531980'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/08/connecting-nintendo-switch-pro.html' title='Connecting a Nintendo Switch Pro Controller Wirelessly to Ubuntu 26.04'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-1821750857922436110</id><published>2026-08-14T01:46:21.947+00:00</published><updated>2026-08-14T01:47:00.710+00:00</updated><title type='text'>Maternal Oddity</title><content type='html'>&lt;p&gt;&lt;i&gt;(I spotted this parody in my file of old writings.  Evidently, it&#39;s from June 2018.)&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Ground Control to Major Mom&lt;br&gt;
Ground Control to Major Mom&lt;br&gt;
Take your protein pills and put your make-up on&lt;br&gt;
Ground Control to Major Mom (ten, nine, eight, seven, six)&lt;br&gt;
Commencing countdown, footwear on (five, four, three)&lt;br&gt;
Odor suspicion!  Did you wash your hands too? (two, one, liftoff)
&lt;/p&gt;

&lt;p&gt;
This is Ground Control to Major Mom&lt;br&gt;
We&#39;ve really made the bed&lt;br&gt;
And the kiddos want to know which shirts to wear.&lt;br&gt;
Now it&#39;s time to leave the castle if you dare.
&lt;/p&gt;

&lt;p&gt;
&quot;This is Major Mom in Complete Control&lt;br&gt;
I&#39;m stepping out the door&lt;br&gt;
And no one&#39;s listening to what I say&lt;br&gt;
And I&#39;m haunted by forgetting something today
&lt;/p&gt;

&lt;p&gt;
For here&lt;br&gt;
Is coffee in my right hand&lt;br&gt;
No silence in the room&lt;br&gt;
The toddler is blue&lt;br&gt;
And there&#39;s nothing I can do
&lt;/p&gt;

&lt;p&gt;
Though we&#39;ve passed one hundred thousand smiles&lt;br&gt;
I&#39;ve misgivings still&lt;br&gt;
And I hope my husband knows which way to go&lt;br&gt;
That fool better love me very much he knows&quot;
&lt;/p&gt;

&lt;p&gt;
Ground Control to Major Mom&lt;br&gt;
Your mobile&#39;s dead, there&#39;s something wrong&lt;br&gt;
Can you hear me, Major Mom?&lt;br&gt;
Can you hear me, Major Mom?&lt;br&gt;
Can you hear me, Major Mom?&lt;br&gt;
Can you...
&lt;/p&gt;

&lt;p&gt;
&quot;Here am I coffee in my right hand&lt;br&gt;
No silence in the room&lt;br&gt;
The toddler is blue&lt;br&gt;
And there&#39;s nothing I can do&quot;
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/1821750857922436110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/1821750857922436110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1821750857922436110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1821750857922436110'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/08/maternal-oddity.html' title='Maternal Oddity'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-7600348059378598141</id><published>2026-08-04T00:22:51.196+00:00</published><updated>2026-08-04T00:22:51.197+00:00</updated><title type='text'>The Alexandrian Moment</title><content type='html'>&lt;p&gt;
For giggles, I put a short story up as an Amazon Kindle offering: &lt;a href=&quot;https://www.amazon.com/dp/B0HCQXZXZN/&quot;&gt;The Alexandrian Moment&lt;/a&gt;
&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/7600348059378598141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/7600348059378598141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7600348059378598141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7600348059378598141'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/08/the-alexandrian-moment.html' title='The Alexandrian Moment'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-8533995272694503871</id><published>2026-07-30T19:58:02.273+00:00</published><updated>2026-07-30T19:58:02.273+00:00</updated><title type='text'>Workaround gamescope invisible cursor bug in Ubuntu 26.04</title><content type='html'>&lt;h2&gt;The bug&lt;/h2&gt;

&lt;p&gt;On Ubuntu 26.04 (resolute, which ships gamescope 3.16.20), launching a game
through gamescope with &lt;code&gt;--force-grab-cursor&lt;/code&gt; can make the mouse
pointer vanish.  Upstream:
&lt;a href=&quot;https://github.com/ValveSoftware/gamescope/issues/2180&quot;&gt;https://github.com/ValveSoftware/gamescope/issues/2180&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dropping &lt;code&gt;--force-grab-cursor&lt;/code&gt; avoids the bug, but that flag is
what confines the pointer to the game window on a multi-monitor setup, so
removing it is not an acceptable fix here.&lt;/p&gt;

&lt;h2&gt;A Workaround&lt;/h2&gt;

&lt;p&gt;Only one thing worked for me: &lt;strong&gt;build the older questing gamescope
3.16.15 and run it instead of resolute&#39;s 3.16.20.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything else raised on #2180 and related threads failed or did not
apply:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;--hide-cursor-delay 99999&lt;/code&gt; — no effect.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;WLR_NO_HARDWARE_CURSORS=1&lt;/code&gt; — no effect.&lt;/li&gt;
  &lt;li&gt;Borderless-windowed / backend switching — unreliable.&lt;/li&gt;
  &lt;li&gt;winecfg / protontricks &quot;capture mouse in fullscreen&quot; — Proton/Wine only,
      so no help for a native-Linux game.&lt;/li&gt;
  &lt;li&gt;Downgrade further, to 3.14.x — unnecessary; 3.16.15 sufficed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both 3.16.15 and 3.16.20 are 3.16.x, so the regression landed in a commit
between those two tags.&lt;/p&gt;

&lt;h2&gt;Procedure for Agents&lt;/h2&gt;

&lt;p&gt;Build gamescope &lt;code&gt;3.16.15-2&lt;/code&gt; from Ubuntu questing sources and
install, self-contained, under &lt;code&gt;~/Stow/gamescope-questing&lt;/code&gt;.  No root,
no system changes.  resolute dropped wlroots 0.18 (ships 0.19), which 3.16.15
needs — Debian patch &lt;code&gt;0006&lt;/code&gt; wires gamescope to the system
&lt;code&gt;libwlroots-0.18-dev&lt;/code&gt;, and the Debian tarball strips the vendored
&lt;code&gt;subprojects/wlroots&lt;/code&gt; — so build wlroots 0.18 from its matching Ubuntu
source into the same prefix.&lt;/p&gt;

&lt;h3&gt;Sources&lt;/h3&gt;

&lt;p&gt;All from the Ubuntu archive.  Confirm each download&#39;s checksum against the
&lt;code&gt;Checksums-Sha256&lt;/code&gt; field of its &lt;code&gt;.dsc&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;gamescope &lt;code&gt;3.16.15-2&lt;/code&gt;, &lt;code&gt;pool/multiverse/g/gamescope/&lt;/code&gt;&lt;br&gt;
      &lt;a href=&quot;https://packages.ubuntu.com/source/questing/gamescope&quot;&gt;https://packages.ubuntu.com/source/questing/gamescope&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;wlroots &lt;code&gt;0.18.2-3&lt;/code&gt; (source behind questing&#39;s
      &lt;code&gt;libwlroots-0.18-dev&lt;/code&gt;), &lt;code&gt;pool/universe/w/wlroots/&lt;/code&gt;&lt;br&gt;
      &lt;a href=&quot;https://packages.ubuntu.com/questing/libwlroots-0.18-dev&quot;&gt;https://packages.ubuntu.com/questing/libwlroots-0.18-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Prerequisites&lt;/h3&gt;

&lt;p&gt;Install both packages&#39; &lt;code&gt;Build-Depends&lt;/code&gt; (see each &lt;code&gt;.dsc&lt;/code&gt;).
gamescope&#39;s &lt;code&gt;libwlroots-0.18-dev&lt;/code&gt; is supplied by the wlroots build
below; wlroots&#39; &lt;code&gt;libcairo2-dev&lt;/code&gt; is needed only for examples, which are
disabled.&lt;/p&gt;

&lt;h3&gt;Build&lt;/h3&gt;

&lt;p&gt;Prefix for both: &lt;code&gt;PREFIX=&quot;$HOME/Stow/gamescope-questing&quot;&lt;/code&gt;.  Apply
each package&#39;s Debian quilt patches before configuring:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;while read p; do patch -p1 -i debian/patches/$p; done &amp;lt; debian/patches/series&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;1. wlroots 0.18.2 -&amp;gt; $PREFIX&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;meson setup build --prefix=&quot;$PREFIX&quot; --libdir=lib --buildtype=release \
  -Dexamples=false -Dwerror=false
ninja -C build install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Installs &lt;code&gt;libwlroots-0.18.so&lt;/code&gt;, headers under
&lt;code&gt;include/wlroots-0.18&lt;/code&gt;, and &lt;code&gt;lib/pkgconfig/wlroots-0.18.pc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. gamescope 3.16.15 -&amp;gt; $PREFIX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two source edits after patching:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;src/meson.build&lt;/code&gt;: patch &lt;code&gt;0006&lt;/code&gt; hardcodes
      &lt;code&gt;/usr/include/wlroots-0.18&lt;/code&gt; in &lt;code&gt;reshade_include&lt;/code&gt;.
      Replace with
      &lt;code&gt;join_paths(get_option(&#39;prefix&#39;), &#39;include&#39;, &#39;wlroots-0.18&#39;)&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;src/meson.build&lt;/code&gt;: &lt;code&gt;vcs_tag()&lt;/code&gt; has no git tree, so the
      &lt;code&gt;--version&lt;/code&gt; banner is blank.  After
      &lt;code&gt;gamescope_version_conf = configuration_data()&lt;/code&gt; add
      &lt;code&gt;gamescope_version_conf.set(&#39;VCS_TAG&#39;, &#39;3.16.15&#39;)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;export PKG_CONFIG_PATH=&quot;$PREFIX/lib/pkgconfig:\
/usr/lib/x86_64-linux-gnu/pkgconfig:\
/usr/lib/pkgconfig:\
/usr/share/pkgconfig&quot;
meson setup build --prefix=&quot;$PREFIX&quot; --libdir=lib --bindir=bin --buildtype=release \
  -Dpipewire=enabled -Denable_openvr_support=false \
  -Dcpp_link_args=&#39;-Wl,-rpath,$ORIGIN/../lib&#39; \
  -Dc_link_args=&#39;-Wl,-rpath,$ORIGIN/../lib&#39;
ninja -C build install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Choices, matching the Debian &lt;code&gt;rules&lt;/code&gt; except where noted:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;-Dpipewire=enabled -Denable_openvr_support=false&lt;/code&gt; from Debian
      &lt;code&gt;rules&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;bindir=bin&lt;/code&gt;, &lt;code&gt;libdir=lib&lt;/code&gt; (Debian uses
      &lt;code&gt;/usr/games&lt;/code&gt;) so the tree suits a stow package.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;PKG_CONFIG_PATH&lt;/code&gt; puts &lt;code&gt;$PREFIX&lt;/code&gt; first so the staged
      wlroots-0.18 wins.&lt;/li&gt;
  &lt;li&gt;rpath &lt;code&gt;$ORIGIN/../lib&lt;/code&gt; lets &lt;code&gt;gamescope&lt;/code&gt; find its
      bundled &lt;code&gt;libwlroots-0.18.so&lt;/code&gt; both in the raw prefix and after
      stowing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Verify&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;readelf -d &quot;$PREFIX/bin/gamescope&quot; | grep RUNPATH        # $ORIGIN/../lib
ldd &quot;$PREFIX/bin/gamescope&quot; | grep wlroots               # resolves inside $PREFIX
&quot;$PREFIX/bin/gamescope&quot; --version                        # gamescope version 3.16.15&lt;/code&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/8533995272694503871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/8533995272694503871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8533995272694503871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8533995272694503871'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/workaround-gamescope-invisible-cursor.html' title='Workaround gamescope invisible cursor bug in Ubuntu 26.04'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-8594213182707835832</id><published>2026-07-24T15:03:34.041+00:00</published><updated>2026-07-24T15:03:34.041+00:00</updated><title type='text'>Time Machine Quick Reference</title><content type='html'>&lt;p&gt;
  The &lt;a href=&quot;https://www.spertilo.net/&quot;&gt;Spertilo Live Music Time Machine&lt;/a&gt; is a great little device, with a delightful interface.  It streams live shows from archive.org and phish.in, especially Grateful Dead for 1966&amp;ndash;1995.
&lt;/p&gt;

&lt;p&gt;
  I use it frequently but I infrequently need to comb their site/FAQ/etc to find button combinations for some Micro edition features.  Here&#39;s a quick reference:
&lt;/p&gt;

&lt;section id=&quot;micro-time-machine-quick-reference&quot;&gt;
  &lt;p&gt;
    Micro model reference only. No Bluetooth. No Experience Mode.
  &lt;/p&gt;

  &lt;h2&gt;Setup&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Audio&lt;/strong&gt;: analog out via 1/8&quot; headphone jack. Plug into powered speakers, an amp, or earphones.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Power&lt;/strong&gt;: USB cable, lower right corner.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;WiFi&lt;/strong&gt; (first boot, or after a failed connection):
      &lt;ul&gt;
        &lt;li&gt;Turn &lt;strong&gt;Year&lt;/strong&gt; to scroll network names; red name with &quot;&amp;gt;&quot; is the candidate. Press &lt;strong&gt;Select&lt;/strong&gt; to choose.&lt;/li&gt;
        &lt;li&gt;Hidden network: choose &lt;code&gt;HIDDEN_WIFI&lt;/code&gt; and enter the name manually.&lt;/li&gt;
        &lt;li&gt;Passkey entry: turn &lt;strong&gt;Year&lt;/strong&gt; to move the cursor, &lt;strong&gt;Day&lt;/strong&gt; to jump 10 characters, &lt;strong&gt;Select&lt;/strong&gt; to enter a character, &lt;code&gt;DEL&lt;/code&gt; to erase, &lt;strong&gt;Stop&lt;/strong&gt; to finish.&lt;/li&gt;
        &lt;li&gt;Credentials persist until the network changes.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Play a Show&lt;/h2&gt;
  &lt;ol&gt;
    &lt;li&gt;Stage a date with the &lt;strong&gt;Month&lt;/strong&gt;, &lt;strong&gt;Day&lt;/strong&gt;, &lt;strong&gt;Year&lt;/strong&gt; knobs. Venue appears if a tape exists; no venue, no show.&lt;/li&gt;
    &lt;li&gt;Press &lt;strong&gt;Select&lt;/strong&gt;. The best tape plays.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Play/Pause&lt;/strong&gt;, &lt;strong&gt;Stop&lt;/strong&gt;, &lt;strong&gt;Rewind&lt;/strong&gt;, &lt;strong&gt;FFwd&lt;/strong&gt; behave as expected.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Hold Select&lt;/strong&gt;: cycle through every tape on the staged date; release to play the one displayed. White id = soundboard, red id = audience.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Rew / FFwd&lt;/strong&gt;: previous / next track.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Stop&lt;/strong&gt;: halt playback, return play head to start of show.&lt;/li&gt;
    &lt;li&gt;Staged and selected dates are independent: browse while listening.&lt;/li&gt;
    &lt;li&gt;Set break: 10 minutes of silence between sets. FFwd skips it.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Knob Presses&lt;/h2&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;&lt;th&gt;Knob&lt;/th&gt;&lt;th&gt;Press&lt;/th&gt;&lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;&lt;td&gt;Month&lt;/td&gt;&lt;td&gt;Dim the screen&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Day&lt;/td&gt;&lt;td&gt;Jump to next date with a tape&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Year&lt;/td&gt;&lt;td&gt;Today-in-history for staged year; press again to cycle years with tapes&lt;/td&gt;&lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
  &lt;p&gt;&lt;strong&gt;Volume&lt;/strong&gt;: dim the screen (press &lt;strong&gt;Month&lt;/strong&gt;), then &lt;strong&gt;Rewind&lt;/strong&gt; lowers and &lt;strong&gt;FFwd&lt;/strong&gt; raises volume. Turn any knob to wake the screen.&lt;/p&gt;

  &lt;h2&gt;Screen&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;Top: staged date, MM-DD-YY.&lt;/li&gt;
    &lt;li&gt;Below: venue/city/state, alternating with tape id (scrolls if long).&lt;/li&gt;
    &lt;li&gt;Middle: current and next track, red text.&lt;/li&gt;
    &lt;li&gt;Bottom: selected date, MM-DD-YYYY. Bottom right: playstate.&lt;/li&gt;
    &lt;li&gt;Screen sleeps after 30 minutes idle. Any knob or button wakes it.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Menu &amp;mdash; Hold Power&lt;/h2&gt;
  &lt;p&gt;
    Hold &lt;strong&gt;Power&lt;/strong&gt; until the menu appears. The site says 3 seconds in one place, 5 in another; hold until you see it.&lt;br&gt;
    A short &lt;strong&gt;Power&lt;/strong&gt; press stops playback and dims the screen.
  &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Collections&lt;/strong&gt;: add artists. Spell the collection name with the Day and Year knobs; once under 30 matches, pick from the list, choose Finished. Device restarts.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;WiFi&lt;/strong&gt;: force reconnection to a different network.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Update Code&lt;/strong&gt;: wait ~1 minute for the &quot;Press Select Button&quot; prompt, then press &lt;strong&gt;Select&lt;/strong&gt;. No prompt, no update.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Update Firmware&lt;/strong&gt;: runs on its own. Update encouraged; pre-update units skip tracks since archive.org went https-only (March 2024).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Factory Reset&lt;/strong&gt;: restore shipped software.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Current versions as of April 2024: software 2.1.3, firmware 1.23.0 20240408.&lt;/p&gt;

  &lt;h2&gt;Troubleshooting&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Dead on arrival&lt;/strong&gt;: reseat both ends of the power cable, plug in, wait 10 seconds, unplug, plug back in.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Connected but silent&lt;/strong&gt;: check the audio connection.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Phish silent&lt;/strong&gt;: run Update Code.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Tape choice&lt;/strong&gt;: default ranks soundboard first, then favored taper, downloads, track count, named tracks, rating. Hold &lt;strong&gt;Select&lt;/strong&gt; to override.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/section&gt;

</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/8594213182707835832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/8594213182707835832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8594213182707835832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/8594213182707835832'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/time-machine-quick-reference.html' title='Time Machine Quick Reference'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-2091570491018073587</id><published>2026-07-21T12:46:02.947+00:00</published><updated>2026-07-21T12:46:02.947+00:00</updated><title type='text'>Disabling Ubuntu Tile Groups via gsettings</title><content type='html'>&lt;p&gt;In Ubuntu 25.10, clicking window B (to focus it) can unexpectedly raise a sibling window A above an overlapping window C. This happens because A and B are in the same &lt;strong&gt;Tile Group&lt;/strong&gt; — a spatial grouping the Ubuntu Tiling Assistant forms when windows are snapped/tiled edge-to-edge. The extension&#39;s &quot;Raise together&quot; rule raises the entire tile group whenever any member is raised, so raising B drags A upward too. The fix is to disable that group-raise behavior while keeping tiling itself intact:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gsettings set org.gnome.shell.extensions.tiling-assistant enable-raise-tile-group false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To verify it took, run &lt;code&gt;gsettings get org.gnome.shell.extensions.tiling-assistant enable-raise-tile-group&lt;/code&gt; — it should print &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/2091570491018073587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/2091570491018073587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2091570491018073587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2091570491018073587'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/disabling-ubuntu-tile-groups-via.html' title='Disabling Ubuntu Tile Groups via gsettings'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-2181925726614530615</id><published>2026-07-16T20:41:04.123+00:00</published><updated>2026-07-16T22:37:28.962+00:00</updated><title type='text'>Money and Recognition: The Two Axes of Compensation</title><content type='html'>&lt;p&gt;(&lt;i&gt;The following observation, including its linkage to Aristotle, is fun but not novel as noted at the end of the essay.  The text/references came from &lt;a href=&quot;https://help.kagi.com/kagi/ai/kagi-research.html&quot;&gt;Kagi&#39;s Research Assistant&lt;/a&gt;&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;Compensation has two parts that work like directions on a plane. One direction is &lt;strong&gt;money&lt;/strong&gt;. The other is &lt;strong&gt;recognition&lt;/strong&gt;. Every job pays out along both, but the mix is different for each one.  The mix is a two-vector and getting it right matters.&lt;/p&gt;

&lt;p&gt;Examples abound. A doctor earns good money and high respect. Both directions are strong. A ballet dancer earns little money but receives great prestige. The recognition direction does almost all the work. A soldier may earn modest pay but gains deep honor, especially in moments of sacrifice.  Respect, prestige, and honor are three words for the recognition axis — the one that money cannot buy.&lt;/p&gt;

&lt;p&gt;Money and recognition are different goods for different kinds of merit. Paying someone in the wrong way causes problems. A wealthy person does not need more money. A person who cannot buy groceries does not care about awards. The right reward is the two-vector that addresses what the person actually lacks on both axes.&lt;/p&gt;

&lt;p&gt;This is an old idea, with concepts going back to at least &lt;strong&gt;Aristotle&lt;/strong&gt;. He saw that honor (not &quot;recognition&quot;) and money were separate goods. He tied each to a different kind of contribution. He warned that mixing them up causes political trouble.  The passages below trace his argument.&lt;/p&gt;

&lt;table border=&quot;1&quot; cellpadding=&quot;8&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse: collapse;&quot;&gt;
  &lt;colgroup&gt;
     &lt;col/&gt;
     &lt;col/&gt;
     &lt;col style=&quot;width: 14ch;&quot;/&gt;
  &lt;/colgroup&gt;
  &lt;tr&gt;
    &lt;th&gt;Concept&lt;/th&gt;
    &lt;th&gt;Aristotle&#39;s Words&lt;/th&gt;
    &lt;th&gt;Source&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;!-- ONE --&gt;
    &lt;td&gt;Honor and profit are two distinct currencies of reward. In unequal friendships, each party should receive more — but not more of the same thing: the superior receives the larger share of honor; the needy party receives the larger share of material gain.&lt;/td&gt;
    &lt;td&gt;&quot;both parties should receive a larger share from the friendship, but not a larger share of the same thing: the superior should receive the larger share of honor, the needy one the larger share of profit; for honor is the due reward of virtue and beneficence, while need obtains the aid it requires in pecuniary gain.&quot;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&quot;https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.01.0054:book=8:chapter=14&quot;&gt;Nicomachean Ethics VIII.14&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;!-- TWO --&gt;
    &lt;td&gt;Honor and property are independent axes of competition. People compete for them separately, and inequality along each axis produces discontent in opposite directions: the masses resent unequal property; the upper classes resent equally distributed honors.&lt;/td&gt;
    &lt;td&gt;&quot;civil strife is caused not only by inequality of property but also by inequality of honors, though the two motives operate in opposite ways—the masses are discontented if possessions are unequally distributed, the upper classes if honors are equally distributed.&quot;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&quot;https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.01.0058:book=2:section=1266b&quot;&gt;Politics II.7 (1266b)&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;!-- THREE --&gt;
    &lt;td&gt;&quot;Merit&quot; is not a single dimension. Different political traditions measure it differently — by free birth, by wealth, or by virtue — so what counts as a fair reward depends on which axis of merit is being applied.&lt;/td&gt;
    &lt;td&gt; &quot;all men agree that what is just in distribution must be according to merit in some sense, though they do not all specify the same sort of merit, but democrats identify it with the status of freeman, supporters of oligarchy with wealth (or with noble birth), and supporters of aristocracy with excellence.&quot;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&quot;https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.01.0054:book=5:chapter=3&quot;&gt;Nicomachean Ethics V.3&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;!-- FOUR --&gt;
    &lt;td&gt;Paying along only one axis gives poor outcomes. Each group is partly right but wrong when it claims the whole.&lt;/td&gt;
    &lt;td&gt;&quot;All those who dispute about the forms of constitution assert a part of the just principle.&quot;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&quot;https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.01.0058:book=3:section=1281a&quot;&gt;Politics III.9 (1281a)&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;This article&#39;s two-axes presentation is not original.  For example, Nancy Fraser, in her contribution to &lt;a href=&quot;https://books.google.com/books/about/Redistribution_or_Recognition.html?id=Iu1OEAAAQBAJ&quot;&gt;Redistribution or Recognition?&lt;/a&gt; (co-authored with Axel Honneth), proposes a two-dimensional theory of justice in which economic redistribution and cultural recognition are distinct, irreducible axes. Her redistribution and recognition map directly onto the money and recognition axes described here.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/2181925726614530615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/2181925726614530615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2181925726614530615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/2181925726614530615'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/money-and-prestige-two-axes-of.html' title='Money and Recognition: The Two Axes of Compensation'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-5635617676266137318</id><published>2026-07-11T21:24:03.370+00:00</published><updated>2026-07-11T21:45:42.468+00:00</updated><title type='text'>Screen Time extensions are Intermittent Reinforcement</title><content type='html'>&lt;p&gt;(&lt;i&gt;The following observation/structure is mine but the text/references came from &lt;a href=&quot;https://help.kagi.com/kagi/ai/kagi-research.html&quot;&gt;Kagi&#39;s Research Assistant&lt;/a&gt; per &lt;a href=&quot;https://assistant.kagi.com/share/90c37524-7c9a-422e-be16-e3e13d8dd434&quot;&gt;this specific prompting&lt;/a&gt;.&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;Your child&#39;s iPhone or iPad locks. They look up at you. &quot;Can I just have a little more time?&quot;&lt;/p&gt;

  &lt;p&gt;You say yes. Or maybe no. Next time, you say the opposite. It feels like parenting. It isn&#39;t. It is one of the most powerful addiction triggers in psychology, and Apple has built it directly into Screen Time.&lt;/p&gt;

  &lt;p&gt;Psychologists call it intermittent reinforcement. The concept is simple. When a behavior is rewarded sometimes, but not always, that behavior becomes more persistent, not less. The uncertainty is the point. As one introduction to the subject puts it, &quot;unpredictability can create a stronger association between the behavior and the reward, making it more compelling and often more difficult to extinguish.&quot; &lt;a href=&quot;#ref1&quot;&gt;[1]&lt;/a&gt; This is why slot machines work. You keep pulling the lever because this time might be the one. The reward doesn&#39;t have to come often. It just has to come sometimes.&lt;/p&gt;

  &lt;p&gt;Apple&#39;s Screen Time feature is marketed as a parental control tool. It lets parents set daily limits on how long a child can use an app or a device. When a child hits that limit, the iPhone or iPad locks. Apple describes what happens next on its own child safety page: the child &quot;can ask parents for more time.&quot; &lt;a href=&quot;#ref2&quot;&gt;[2]&lt;/a&gt; CNET, reviewing the feature approvingly, puts it plainly: &quot;your child can send a request for more time if more time is needed.&quot; &lt;a href=&quot;#ref3&quot;&gt;[3]&lt;/a&gt; The parent then decides. Yes, no, or no answer at all. The child never knows which it will be.&lt;/p&gt;

  &lt;p&gt;That uncertainty is not a minor flaw. It is the mechanism. The behavior is using the phone until the limit hits, then sending the request. The reward is more screen time. The schedule is unpredictable. That is a textbook variable-ratio reinforcement schedule. It is the same structure that makes gambling compulsive. &lt;a href=&quot;#ref1&quot;&gt;[1]&lt;/a&gt; The child is not being taught that the phone has limits. The child is being taught that the phone has a lever. Pull it enough times and it pays out. The parent, intending to set a boundary, has instead become the slot machine.&lt;/p&gt;

  &lt;p&gt;The fix is not complicated. Set the limit. Hold it. Every time. No exceptions. A limit that bends is not a limit. It is a reward on a variable schedule. The parent who always says no to extension requests is not being cruel. They are being consistent. And consistency is the one thing that intermittent reinforcement cannot survive. &lt;a href=&quot;#ref1&quot;&gt;[1]&lt;/a&gt; Your child does not need more time on their phone. They need a parent who means what they say. Do not use time extensions.&lt;/p&gt;

    &lt;h2&gt;References&lt;/h2&gt;
    &lt;ol&gt;
      &lt;li id=&quot;ref1&quot;&gt;&quot;The Power of Intermittent Reinforcement in Psychology.&quot; &lt;em&gt;Unplugged Psych.&lt;/em&gt; &lt;a href=&quot;https://www.unpluggedpsych.com/the-power-of-intermittent-reinforcement-in-psychology/&quot;&gt;https://www.unpluggedpsych.com/the-power-of-intermittent-reinforcement-in-psychology/&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;ref2&quot;&gt;&quot;Child Safety.&quot; &lt;em&gt;Apple.&lt;/em&gt; &lt;a href=&quot;https://www.apple.com/child-safety/&quot;&gt;https://www.apple.com/child-safety/&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;ref3&quot;&gt;&quot;Apple&#39;s Screen Time Feature Saves Parents from Being the Bad Guy.&quot; &lt;em&gt;CNET.&lt;/em&gt; &lt;a href=&quot;https://www.cnet.com/tech/services-and-software/apples-screen-time-feature-saves-parents-from-being-the-bad-guy/&quot;&gt;https://www.cnet.com/tech/services-and-software/apples-screen-time-feature-saves-parents-from-being-the-bad-guy/&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/5635617676266137318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/5635617676266137318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/5635617676266137318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/5635617676266137318'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/do-not-use-screen-time-extensions.html' title='Screen Time extensions are Intermittent Reinforcement'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-1349018143229378028</id><published>2026-07-04T18:07:22.755+00:00</published><updated>2026-07-04T18:07:51.110+00:00</updated><title type='text'>Tinkering on old projects</title><content type='html'>&lt;p&gt;
  Over the past year I&#39;ve dusted off several projects hosted at &lt;a href=&quot;https://github.com/RhysU/&quot;&gt;https://github.com/RhysU/&lt;/a&gt;:
&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;a href=&quot;https://rhysu.github.io/ar/&quot;&gt;RhysU/ar&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Autoregressive process modeling tools in header-only C++.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://rhysu.github.io/ESIO/&quot;&gt;RhysU/ESIO&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Parallel-HDF5 library for high-throughput I/O of structured turbulence simulation data.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://rhysu.github.io/suzerain/&quot;&gt;RhysU/suzerain&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Spectral, direct numerical simulation of the compressible Navier-Stokes equations for turbulence research.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/c99sh/blob/master/README.md&quot;&gt;RhysU/c99sh&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Shebang interpreter that runs single C99, C11, and C++ files with rcfile support.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/blob/master/README.md&quot;&gt;RhysU/jobserver&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Nestable Python jobserver with thread-safe futures, callbacks, and type hints.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/droll/blob/master/README.md&quot;&gt;RhysU/droll&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Command-line implementation of the Dungeon Roll dice game.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/tuna/blob/master/README.rst&quot;&gt;RhysU/tuna&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Lightweight autotuner that picks the fastest among interchangeable code chunks at runtime.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/war/&quot;&gt;RhysU/war&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Simulation of the card game War.&lt;/dd&gt;
&lt;/dl&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/1349018143229378028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/1349018143229378028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1349018143229378028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1349018143229378028'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/07/tinkering-on-old-projects.html' title='Tinkering on old projects'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-289532781242608024</id><published>2026-06-30T14:59:38.693+00:00</published><updated>2026-06-30T15:03:37.400+00:00</updated><title type='text'>Underling</title><content type='html'>&lt;p&gt;Thirteen years ago, while working on the dissertation, I put together a 3D pencil transform library atop FFTW MPI called &lt;a href=&quot;https://github.com/RhysU/underling&quot;&gt;underling&lt;/a&gt;.  It looked great in isolation.  It never integrated correctly with my dissertation code.  I eventually ran away because spending time on it wasn&#39;t time spend graduating&lt;/p&gt;

&lt;p&gt;In the last couple of days I learned that there was no problem with the library from a correctness perspective.  Instead, the mysterious problem was &lt;a href=&quot;https://github.com/RhysU/suzerain/issues/11&quot;&gt;MKL exposes an incomplete FFTW implementation that simply returns NULL for a lot of methods&lt;/a&gt;.  After some linking tinkering in &lt;a href=&quot;https://github.com/RhysU/suzerain/&quot;&gt;my dissertation&#39;s primary codebase&lt;/a&gt;, my little pencil decomposition library snapped right into place.&lt;/p&gt;

&lt;p&gt;This is both immensely satisfying (it worked after all!) and frustratingly painful (would have loved to benchmark/publish during the grad school days!).  Alas.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/289532781242608024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/289532781242608024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/289532781242608024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/289532781242608024'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/06/underling.html' title='Underling'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-3880591787829793475</id><published>2026-06-28T22:43:14.300+00:00</published><updated>2026-06-28T22:43:14.300+00:00</updated><title type='text'>Two Sons</title><content type='html'>&lt;p&gt;&lt;i&gt;Written back in August 2020&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;I have two different sons. However, at the West End Suprette each one chose the same Häagen-Dazs ice cream bar. Something with dark chocolate. I chose a Nestle Crunch ice cream bar from another part of the freezer. I paid while they continuously touched things that I asked them not to touch.&lt;/p&gt;

&lt;p&gt;We three walked a block south to a tiny park, Septuagesimo Uno, and plunked ourselves on some benches. I handed the Häagen-Dazs bars, which came boxed-then-wrapped, to the boys. They tore open the boxes but the wrappers stymied them. I chuckled and wondered if, sufficiently motivated, they&#39;d get the packaging open by themselves. They endeavored.&lt;/p&gt;

&lt;p&gt;I opened my Crunch bar, lifted it by the popsicle stick, caught half a bite, and the whole bar fell away from the stick and onto the nasty city ground. Evidently the Crunch bar had passed its days in a warmer freezer spot. The old Eddie Murphy ice cream man skit, where a kid loses a whole cone, ran through my head while I debated if anything could be salvaged. My wife would rightly kill me if she heard I taught the kids that food could be eaten off the nasty city ground. And the kids would certainly tell her. I sighed, shook my head, and then looked up into two pairs of wide eyes.&lt;/p&gt;

&lt;p&gt;Each boy gazed into my disappointed face while still ineffectively fumbling with a wrapper. I got out “Too bad” before twice “Dad, would you please help me open this?” arrived. I held out my hand, the little one handed me his package, I opened it, and I handed back an unmelted ice cream bar. A pause, then into the mouth. I held out my hand, the bigger one handed me his package, I opened it without looking, and I passed back a second bar. Turning down again, I couldn&#39;t resist a tiny bit of the chocolate coating. Perhaps, adequately distracted, the kids wouldn&#39;t report me to their mother.&lt;/p&gt;

&lt;p&gt;“Dad, would you like some of mine?” spoken softly startled me. A dark chocolate Häagen-Dazs bar floated into my gaze attached to a popsicle stick attached to an outstretched arm attached to my nine-year-old son. He had offered me his very first bite. I choked up briefly, politely declined, told him how kind that was, and hugged the boy. He blinked, stepped back, and then launched into his bar.&lt;/p&gt;

&lt;p&gt;Fortunately, neither kid made so much of a mess that their not-yet-broken tendency to wipe their mouths on their shirts didn&#39;t solve said mess. I collected then threw away the two boxes, three wrappers, and three sticks. Starting home, I hugged the big one again. He ran ahead maybe twenty feet.&lt;/p&gt;

&lt;p&gt;The six-year-old generally lags behind me on the street. Now, however, he kept pace as we walked in silence. Halfway home he says “Dad, I would have offered you mine but I knew you wouldn&#39;t eat it so I didn&#39;t offer it.” And I tell him thank you and I hug him too. Quickly thereafter, we enter our building lobby and call the elevator.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/3880591787829793475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/3880591787829793475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/3880591787829793475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/3880591787829793475'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/06/two-sons.html' title='Two Sons'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-7574410571211706444</id><published>2026-06-26T20:22:40.698+00:00</published><updated>2026-06-26T20:23:24.709+00:00</updated><title type='text'>The Greatest Skit in the World</title><content type='html'>&lt;p&gt;Inspired by &lt;a href=&quot;https://en.wikipedia.org/wiki/Tribute_(song)&quot;&gt;&quot;Tribute&quot; by Tenacious D&lt;/a&gt; and another meta-bench skit. Arrived at through prompting and re-prompting Claude until it cried...&lt;/p&gt;

&lt;p&gt;A Campfire Skit for 5 Scouts (~2 minutes)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No props. None. That’s the whole joke.&lt;/strong&gt; Play it big.
The crowd should get the ending long before the characters do.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;cast&quot;&gt;CAST&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DIRECTOR&lt;/strong&gt; — the Camp Director. Gruff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCOUT 1&lt;/strong&gt; — the leader. Certain. Wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCOUT 2&lt;/strong&gt; — the loud one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCOUT 3&lt;/strong&gt; — small, nervous. Keeps blurting the right
answer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCOUT 4&lt;/strong&gt; — eager. Quick to strike a pose.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;the-skit&quot;&gt;THE SKIT&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(The FOUR SCOUTS stand in a row, in order 1–2–3–4. The DIRECTOR
storms in.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DIRECTOR:&lt;/strong&gt; Scouts! I need a skit tonight. A GREAT
one. Or it’s latrine duty till you can vote!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 1:&lt;/strong&gt; Director… we will perform THE skit. The
greatest skit this camp has ever seen. We did it once. The Scoutmaster
&lt;em&gt;wept.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 2:&lt;/strong&gt; The whole crowd was on their feet! They
wouldn’t stop cheering!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 3:&lt;/strong&gt; &lt;em&gt;(quietly)&lt;/em&gt; A raccoon stood up and
clapped.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DIRECTOR:&lt;/strong&gt; &lt;em&gt;(arms folded)&lt;/em&gt; Then do it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 4:&lt;/strong&gt; Positions!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(All four strike a dramatic pose. They hold it. Their faces
slowly fall.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 3:&lt;/strong&gt; &lt;em&gt;(through his teeth)&lt;/em&gt; …What was
it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 2:&lt;/strong&gt; I thought YOU remembered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 1:&lt;/strong&gt; I remember it was GREAT. I don’t remember
what it &lt;em&gt;was.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 2:&lt;/strong&gt; &lt;em&gt;(flat)&lt;/em&gt; There were no props. That
was the whole thing. We had &lt;em&gt;nothing.&lt;/em&gt; &lt;em&gt;(pregnant silence)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DIRECTOR:&lt;/strong&gt; &lt;em&gt;(throwing up his arms)&lt;/em&gt; Nothing?!
You’re telling me the greatest skit ever was a bunch of Scouts with
NOTHING?! &lt;em&gt;(throws up his hands)&lt;/em&gt; I give up. &lt;em&gt;(walks behind
the row of Scouts and lowers himself into a seated position at bench
height — knees bent, arms crossed, sulking, perched on nothing)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 3:&lt;/strong&gt; &lt;em&gt;(brightening)&lt;/em&gt; We just… sat
down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 2:&lt;/strong&gt; On what?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 3:&lt;/strong&gt; On the bench.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUT 2:&lt;/strong&gt; WHAT bench?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCOUTS 1, 3 &amp;amp; 4:&lt;/strong&gt; &lt;em&gt;(slow, together)&lt;/em&gt;
…Exactly.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(On the word, the DIRECTOR topples backward off the invisible
bench and crashes to the ground. Hold. Bow. Everyone runs off.)&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;performance-notes&quot;&gt;PERFORMANCE NOTES&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stand in numeric order.&lt;/strong&gt; Every handoff passes to the
Scout next to the speaker, so the focus slides down the line instead of
jumping across it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Director sells the ending.&lt;/strong&gt; He sits behind the
row on “I give up,” perched on nothing the whole time the Scouts talk —
then topples on “…Exactly.” The longer he holds the sit, the bigger the
fall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Land “…Exactly.” big.&lt;/strong&gt; All three say it together,
dead serious, gesturing at the empty air.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let the silence breathe&lt;/strong&gt; before the Director’s last
line.&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/7574410571211706444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/7574410571211706444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7574410571211706444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7574410571211706444'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/06/the-greatest-skit-in-world.html' title='The Greatest Skit in the World'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-4292804151044436409</id><published>2026-06-20T05:28:34.879+00:00</published><updated>2026-06-20T05:34:09.926+00:00</updated><title type='text'>A nestable Jobserver with thread-safe futures, callbacks, and type-hinting</title><content type='html'>&lt;p&gt;I have been hacking on &lt;a href=&quot;https://github.com/rhysu/jobserver&quot;&gt;https://github.com/rhysu/jobserver&lt;/a&gt; for a long time.  Today I put the &lt;tt&gt;jobserver&lt;/tt&gt; package up on PyPi: &lt;a href=&quot;https://pypi.org/project/jobserver/&quot;&gt;https://pypi.org/project/jobserver/&lt;/a&gt;.&lt;/p&gt;
  
&lt;p&gt;My initial motivation was improving robustness over the process-pooling approaches that I was using back in August 2019.  I needed something where my worker tasks could SIGSEGV or SIGPIPE without my entire pool crashing.  I also needed extension hooks for a few specific applications, like advisory flocking when a worker was active and being mindful of RAM limits.&lt;/p&gt;

&lt;p&gt;It&#39;s stayed fun to intermittently hack on.  From the tag messages, you can tell I began using LLMs with this project after tag v1.12.  Some features, like &lt;tt&gt;JobserverExecutor&lt;/tt&gt;, were simply beyond my personal bandwidth before employing coding agents.  I&#39;ve tried to keep the technical quality at least as high as if I&#39;d been hand-coding.&lt;/p&gt;

&lt;p&gt;The timeline&#39;s been...&lt;/p&gt;


&lt;dl&gt;
  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.0&quot;&gt;v1.0&lt;/a&gt; &amp;mdash; 2020-02-17&lt;/dt&gt;
  &lt;dd&gt;First feature-complete release of the jobserver.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.1&quot;&gt;v1.1&lt;/a&gt; &amp;mdash; 2020-02-22&lt;/dt&gt;
  &lt;dd&gt;Added &lt;code&gt;when_done&lt;/code&gt; callbacks along with grammar and type-annotation improvements.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.2&quot;&gt;v1.2&lt;/a&gt; &amp;mdash; 2020-03-03&lt;/dt&gt;
  &lt;dd&gt;Introduced per-submission &lt;code&gt;env&lt;/code&gt; and &lt;code&gt;preexec_fn&lt;/code&gt; support, and adopted black/flake8/mypy tooling.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.3&quot;&gt;v1.3&lt;/a&gt; &amp;mdash; 2020-03-04&lt;/dt&gt;
  &lt;dd&gt;Added grandchild polling, configurable defaults, and a pluggable &lt;code&gt;sleep_fn&lt;/code&gt;.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.4&quot;&gt;v1.4&lt;/a&gt; &amp;mdash; 2020-03-09&lt;/dt&gt;
  &lt;dd&gt;Simplified both the public API and the internals.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.5&quot;&gt;v1.5&lt;/a&gt; &amp;mdash; 2020-03-10&lt;/dt&gt;
  &lt;dd&gt;Wrote the README and made assorted touch-ups.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.6&quot;&gt;v1.6&lt;/a&gt; &amp;mdash; 2020-12-18&lt;/dt&gt;
  &lt;dd&gt;Removed the sentinel push/pop at work submission, since &lt;code&gt;__getstate__&lt;/code&gt;/&lt;code&gt;__setstate__&lt;/code&gt; are now handled explicitly.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.7&quot;&gt;v1.7&lt;/a&gt; &amp;mdash; 2021-01-08&lt;/dt&gt;
  &lt;dd&gt;Exposed &lt;code&gt;reclaim_resources&lt;/code&gt; on the public API.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.8&quot;&gt;v1.8&lt;/a&gt; &amp;mdash; 2021-02-16&lt;/dt&gt;
  &lt;dd&gt;Added support for CPython 3.9.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.9&quot;&gt;v1.9&lt;/a&gt; &amp;mdash; 2021-03-18&lt;/dt&gt;
  &lt;dd&gt;Exposed &lt;code&gt;MinimalQueue&lt;/code&gt; and improved test robustness.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.10&quot;&gt;v1.10&lt;/a&gt; &amp;mdash; 2022-04-06&lt;/dt&gt;
  &lt;dd&gt;Added Python 3.10 support and the ability to unset environment variables.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.11&quot;&gt;v1.11&lt;/a&gt; &amp;mdash; 2024-09-29&lt;/dt&gt;
  &lt;dd&gt;Confirmed Python 3.11 and 3.12 work correctly.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.12&quot;&gt;v1.12&lt;/a&gt; &amp;mdash; 2026-01-01&lt;/dt&gt;
  &lt;dd&gt;Confirmed Python 3.13 works correctly.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v1.13&quot;&gt;v1.13&lt;/a&gt; &amp;mdash; 2026-03-28&lt;/dt&gt;
  &lt;dd&gt;Added &lt;code&gt;JobserverExecutor&lt;/code&gt; (a &lt;code&gt;concurrent.futures.Executor&lt;/code&gt; wrapper), &lt;code&gt;Jobserver.map()&lt;/code&gt;, and signal-based cancellation via &lt;code&gt;Future.done(..., signal=...)&lt;/code&gt;. Also hoisted submit defaults, named worker processes, fixed re-entrant &lt;code&gt;CallbackRaised&lt;/code&gt; double-wrapping, and shipped nine worked examples.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v2.0&quot;&gt;v2.0&lt;/a&gt; &amp;mdash; 2026-03-30&lt;/dt&gt;
  &lt;dd&gt;Added context-manager support to &lt;code&gt;MinimalQueue&lt;/code&gt; and &lt;code&gt;Jobserver&lt;/code&gt;, rewrote &lt;code&gt;reclaim_resources()&lt;/code&gt; as O(k) using &lt;code&gt;wait()&lt;/code&gt;, and added &lt;code&gt;repr()&lt;/code&gt;. Fixed a &lt;code&gt;Future.wait()&lt;/code&gt; sentinel/waitpid race and added &lt;code&gt;Future.done()&lt;/code&gt; as a &lt;code&gt;wait(timeout=0)&lt;/code&gt; shorthand.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v2.1&quot;&gt;v2.1&lt;/a&gt; &amp;mdash; 2026-03-31&lt;/dt&gt;
  &lt;dd&gt;Corrected timing, resource-leak, and type-safety issues found after v2.0, including a &lt;code&gt;py.typed&lt;/code&gt; marker, a fixed queue-timeout overrun, and event-driven dispatcher polling. Replaced asserts at public boundaries with explicit &lt;code&gt;TypeError&lt;/code&gt;/&lt;code&gt;ValueError&lt;/code&gt;.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v2.2&quot;&gt;v2.2&lt;/a&gt; &amp;mdash; 2026-04-01&lt;/dt&gt;
  &lt;dd&gt;&lt;code&gt;JobserverExecutor&lt;/code&gt; can now own a default-constructed &lt;code&gt;Jobserver&lt;/code&gt; automatically, making it drop-in, and slot acquisition became O(k) via a persistent selector. Also let &lt;code&gt;preexec_fn&lt;/code&gt; return a context manager, added resource/callback warnings, and generalized nesting examples across all start methods.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v2.3&quot;&gt;v2.3&lt;/a&gt; &amp;mdash; 2026-06-01&lt;/dt&gt;
  &lt;dd&gt;Child tracebacks now survive &lt;code&gt;Future.result()&lt;/code&gt; via &lt;code&gt;__cause__&lt;/code&gt;, escaping &lt;code&gt;BaseException&lt;/code&gt;s became diagnosable, and &lt;code&gt;concurrent.futures.Future.cancel()&lt;/code&gt; was wired through the executor. Many hardening fixes followed for &lt;code&gt;map()&lt;/code&gt; slot reclamation, submit/shutdown races, &lt;code&gt;MinimalQueue&lt;/code&gt;, validation, and the public API surface.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v2.4&quot;&gt;v2.4&lt;/a&gt; &amp;mdash; 2026-06-01&lt;/dt&gt;
  &lt;dd&gt;Fixed nested fan-out under the fork start method via a lazy per-process selector that rebuilds when the PID changes. Also deduplicated pickle-error handling and the &lt;code&gt;env&lt;/code&gt; type signature, and added a stdlib-only benchmark harness under &lt;code&gt;draft/&lt;/code&gt;.&lt;/dd&gt;

  &lt;dt&gt;&lt;a href=&quot;https://github.com/RhysU/jobserver/releases/tag/v3.0&quot;&gt;v3.0&lt;/a&gt; &amp;mdash; 2026-06-20&lt;/dt&gt;
  &lt;dd&gt;Major API redesign: &lt;code&gt;Jobserver&lt;/code&gt; became a thin handle over a shared, reference-counted &lt;code&gt;Resources&lt;/code&gt; object, submission controls moved off &lt;code&gt;submit()&lt;/code&gt;/&lt;code&gt;map()&lt;/code&gt; into sibling handles (&lt;code&gt;revise_env()&lt;/code&gt;, &lt;code&gt;replace_preexec()&lt;/code&gt;, &lt;code&gt;replace_sleep()&lt;/code&gt;), and &lt;code&gt;SubmissionDied&lt;/code&gt; was renamed &lt;code&gt;LostResult&lt;/code&gt;. Added a &lt;code&gt;__version__&lt;/code&gt;, eager timeout validation, a redesigned queue hierarchy, suppressed worker traceback noise, hardened deserialization, and modernized packaging, docs, tests, and examples.&lt;/dd&gt;
&lt;/dl&gt;
  
 </content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/4292804151044436409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/4292804151044436409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/4292804151044436409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/4292804151044436409'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/06/a-nestable-jobserver-with-thread-safe.html' title='A nestable Jobserver with thread-safe futures, callbacks, and type-hinting'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-779159791044429704</id><published>2026-05-26T18:43:09.538+00:00</published><updated>2026-05-26T18:43:09.538+00:00</updated><title type='text'>To differentiate unsuccessful from successful experiments</title><content type='html'>&lt;p&gt;I chased down this quote by &lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_H._Goddard&quot;&gt;Robert H. Goddard&lt;/a&gt; via &lt;a href=&quot;https://database.goddard.microsearch.net&quot;&gt;The Goddard Papers Database&lt;/a&gt; .  The original context of the letter, often omitted when using the quote, makes Goddard&#39;s words all the more delightful:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;
R. H. Goddard&lt;/a&gt; to F. T.&lt;b&gt;*&lt;/b&gt;, Jeffersonville, Indiana&lt;br/&gt;
Roswell, February 5, 1942
&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;
It is not a simple matter to differentiate unsuccessful from successful experiments, since most work that is finally successful is the result of a series of unsuccessful tests in which difficulties are gradually eliminated...
&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;
&lt;b&gt;*&lt;/b&gt;This was in response to a young experimenter who complained that many of his tests had been unsuccessful
&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;
SOURCE: Goddard, Robert H. The Papers of Robert H. Goddard. Edited by Esther C. Goddard and G. Edward Pendray. Vol. 3, 1941–1945: JATO and Variable Thrust for the Military. New York: McGraw-Hill, 1970, page 1453.
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/779159791044429704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/779159791044429704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/779159791044429704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/779159791044429704'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/05/to-differentiate-unsuccessful-from.html' title='To differentiate unsuccessful from successful experiments'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-1688235021879642208</id><published>2026-05-01T20:16:15.662+00:00</published><updated>2026-05-01T20:16:15.662+00:00</updated><title type='text'>Scam Likely</title><content type='html'>&lt;p&gt;
&lt;i&gt;A first person temporal tragedy to the tune of &quot;Let It Be&quot;...&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Verse 1]&lt;/b&gt;&lt;br/&gt;
When I call during time troubles&lt;br/&gt;
You won&#39;t answer though I plea&lt;br/&gt;
Call shows &quot;Scam Likely&quot;&lt;br/&gt;
Scam Likely&lt;br/&gt;
And in my hour of darkness&lt;br/&gt;
Past you won&#39;t pick up for me&lt;br/&gt;
Phone shows &quot;Scam Likely&quot;&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Chorus]&lt;/b&gt;&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Need to change history&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Verse 2]&lt;/b&gt;&lt;br/&gt;
And when my parents never meeting&lt;br/&gt;
Means I&#39;ll cease to ever be&lt;br/&gt;
Still phones show &quot;Scam Likely&quot;&lt;br/&gt;
Scam Likely&lt;br/&gt;
For historic missed connection fears&lt;br/&gt;
Haunt me that no one will ever see&lt;br/&gt;
Past the words &quot;Scam Likely&quot;&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Chorus]&lt;/b&gt;&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Nah, please Lord make them answer&lt;br/&gt;
Scam Likely&lt;br/&gt;
Can&#39;t I be?! Scam Likely&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Insert myself in history&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Instrumental Break]&lt;/b&gt;&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Guitar Solo]&lt;/b&gt;&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Chorus]&lt;/b&gt;&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Scam Likely, yeah, Scam Likely&lt;br/&gt;
Need to change history&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Verse 3]&lt;/b&gt;&lt;br/&gt;
And when the timeline&#39;s getting cloudy&lt;br/&gt;
There&#39;s hope shining yet in future me&lt;br/&gt;
Light more digits tomorrow&lt;br/&gt;
Scam Likely&lt;br/&gt;
Frantically dial numbers&lt;br/&gt;
Every phone rejects my plea&lt;br/&gt;
All show &quot;Scam Likely&quot;&lt;br/&gt;
Scam Likely, yeah&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;[Outro]&lt;/b&gt;&lt;br/&gt;
Scam Likely, Scam Likely&lt;br/&gt;
Scam Likely, nah, Scam Likely&lt;br/&gt;
Oh, there must be an answer&lt;br/&gt;
Scam Likely&lt;br/&gt;
Can&#39;t I be?! Scam Likely&lt;br/&gt;
Scam Likely, yeah, Scam Likely&lt;br/&gt;
Oh, there must be an answer&lt;br/&gt;
Scam Likely&lt;br/&gt;
Might not be? Scam Likely&lt;br/&gt;
Scam Likely, nah, Scam Likely&lt;br/&gt;
Insert myself in history&lt;br/&gt;
Scam Likely&lt;br/&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/1688235021879642208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/1688235021879642208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1688235021879642208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1688235021879642208'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/05/scam-likely.html' title='Scam Likely'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-3604963837723524672</id><published>2026-04-13T16:51:00.005+00:00</published><updated>2026-09-22T00:10:43.877+00:00</updated><title type='text'>Tidbits from the World</title><content type='html'>&lt;p&gt;&lt;b&gt;Just quotes, etc. where I frequently want the original source… &lt;/b&gt;&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://jdebp.info/FGA/legacy-is-not-a-pejorative.html&quot;&gt;“Legacy” is not a pejorative.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“Invert, always, invert”&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.anup.io/invert-always-invert/&quot;&gt;Jacobi originally&lt;/a&gt; but &lt;a href=&quot;https://fs.blog/inversion/?ref=anup.io&quot;&gt;popularized by Munger&lt;/a&gt; : “...it is in the nature of things that many hard problems are best solved when they are addressed backward”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Algorithm for inversion:&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Define the problem - what is it that  you&#39;re trying to achieve?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Invert it - what would guarantee the failure to achieve this outcome?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Finally, consider solutions to avoid this failure&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;“[Not naming software tools] is actually a lesson that originates from the early days of Call of Duty at IW. From what I’m told, IW never named their engine, because any time you name something it becomes a bit more of a thing, and you start working for it. And they were a studio making games, the game is the thing. Nothing else.” [&lt;a href=&quot;http://c0de517e.blogspot.com/2019/03/what-i-learned-at-activision.html?m=1&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“You have to do basic science on your libraries to see how they work…” [&lt;a href=&quot;https://wingolog.org/archives/2009/03/24/international-lisp-conference-day-two&quot;&gt;Sussman as reported by Wingo&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“A pointer is an integer with a shiv” [&lt;a href=&quot;http://lambda-the-ultimate.org/node/5553&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Optimal stopping problems are solved with the &lt;a href=&quot;https://en.wikipedia.org/wiki/Odds_algorithm&quot;&gt;odds algorithm&lt;/a&gt;, e.g. the  &lt;a href=&quot;https://en.wikipedia.org/wiki/Secretary_problem&quot;&gt;classical secretary problem&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“The Statistics of Sharpe Ratios” by Andrew Lo [&lt;a href=&quot;https://www.tandfonline.com/doi/abs/10.2469/faj.v58.n4.2453&quot;&gt;paper&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“You are in a drawdown.  When should you start worrying?” [&lt;a href=&quot;https://arxiv.org/abs/1707.01457&quot;&gt;paper&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;NIST has several excellent references:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://xlinux.nist.gov/dads/&quot;&gt;Dictionary of Algorithms and Data Structures&lt;/a&gt;  (DADS), a dictionary of algorithms, algorithmic techniques, data structures, archetypal problems, etc&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.itl.nist.gov/div898/handbook/index.htm&quot;&gt;Engineering Statistics Handbook&lt;/a&gt; with chapters Explore, Measure, Characterize, Model, Improve, Monitor, Compare, and Reliability&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;“If you have a procedure with 10 parameters, you probably missed some.” [&lt;a href=&quot;http://pu.inf.uni-tuebingen.de/users/klaeren/epigrams.html&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Driscoll Kraay Standard Errors are &lt;a href=&quot;https://fastercapital.com/content/Driscoll-Kraay-Standard-Errors--Spatial-Dimensions--Driscoll-Kraay-Standard-Errors-for-Robust-Inference.html&quot;&gt;robust to both cross-sectional and temporal dependence&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The  &lt;a href=&quot;https://python-graph-gallery.com/all-charts/&quot;&gt;Python Graph Gallery&lt;/a&gt; is a visual reference over many graphs along with the source code to produce them.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Total_least_squares&quot;&gt;Total least squares&lt;/a&gt;  minimizes errors on both dependent and independent variables.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bottom Line Up Front (BLUF) writing [&lt;a href=&quot;https://hbr.org/2016/11/how-to-write-email-with-military-precision&quot;&gt;HBR&lt;/a&gt;,  &lt;a href=&quot;https://en.wikipedia.org/wiki/BLUF_(communication)&quot;&gt;Wikipedia&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Dennis Ritchie: “Our habit of trying to document bugs and limitations visibly was enormously useful to the system. As we put out each edition, the presence of these sections shamed us into fixing innumerable things rather than exhibiting them in public. I remember clearly adding or editing many of these sections, then saying to myself &#39;I can&#39;t write this,&#39; and fixing the code instead.” [&lt;a href=&quot;http://www.collyer.net/who/geoff/history.html&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.listendata.com/2018/03/regression-analysis.html&quot;&gt;A bestiary of regression variants&lt;/a&gt; , including:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Linear Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Polynomial Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Logistic Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Quantile Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ridge Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Lasso Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Elastic Net Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Principal Components Regression (PCR)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Partial Least Squares (PLS) Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Support Vector Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ordinal Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Poisson Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Negative Binomial Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Quasi Poisson Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cox Regression&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tobit Regression&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://brunodias.dev/2021/03/19/functions-for-system-designers.html&quot;&gt;A Bestiary of Functions for Systems Designers&lt;/a&gt;  is a nice visual guide&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Karpathy blogged &lt;a href=&quot;http://karpathy.github.io/2019/04/25/recipe/&quot;&gt;A Recipe for Training Neural Networks&lt;/a&gt; :&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Become one with the data&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Set up the end-to-end training/evaluation skeleton + get dumb baselines&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Overfit, recalling &lt;a href=&quot;https://windowsontheory.org/2019/12/05/deep-double-descent/&quot;&gt;deep double descent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Regularize&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tune&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Squeeze out the juice&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;Agustin Lebron’s &lt;a href=&quot;https://www.amazon.com/Laws-Trading-Traders-Decision-Making-Everyone/dp/1119574218&quot;&gt;The Laws of Trading&lt;/a&gt; :&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Know why you are doing a trade before you trade.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;You&#39;re never happy with the amount you traded.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Take only the risks you&#39;re being paid to take.  Hedge the others.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Put on a risk using the most liquid instrument for that risk.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you can&#39;t explain your edge in five minutes, you don&#39;t have a very good one.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The long-term profitability of an edge is inversely proportional to how long it takes to explain it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The model expresses the edge.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you think your costs are negligible relative to your edge, you&#39;re wrong about at least one of them.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Just because something has never happened doesn&#39;t mean it can&#39;t.&lt;br&gt;&lt;/br&gt;Corollary: Enough people relying on something being true makes it false.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Working to align everyone&#39;s interests is time well spent.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you don&#39;t master technology and data, you&#39;re losing to someone who does.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you&#39;re not getting better, you&#39;re getting worse.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;Shellhaters.org has a great &lt;a href=&quot;https://shellhaters.org/&quot;&gt;POSIX Shell and Utilities Quick Reference&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Practical SQL for Data Analysis: What you can do without Pandas [&lt;a href=&quot;https://hakibenita.com/sql-for-data-analysis&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Taguchi_methods&quot;&gt;Taguchi methods&lt;/a&gt; are statistical methods, sometimes called robust design methods, developed by Genichi Taguchi to improve the quality of manufactured goods, and more recently also applied to engineering…. See also &lt;a href=&quot;https://en.wikipedia.org/wiki/Orthogonal_array&quot;&gt;orthogonal arrays&lt;/a&gt; , &lt;a href=&quot;https://en.wikipedia.org/wiki/Optimal_experimental_design&quot;&gt;optimal experimental link&lt;/a&gt;, and notice &lt;a href=&quot;https://snl-dakota.github.io/docs/6.23.0/users/usingdakota/studytypes/designofexperiments.html&quot;&gt;Sandia’s Dakota implements many of these ideas&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Prefer to change the code rather than write a workaround [&lt;a href=&quot;https://catern.com/change_code.html&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;By nature, bugs are found in places that you didn’t think to look [&lt;a href=&quot;https://timkellogg.me/blog/2021/01/29/cold-paths&quot;&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;A cold path is a path through the code or situation that rarely happens.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;By contrast, hot paths happen frequently. You don’t find bugs in hot paths.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bugs are always in cold paths — every bug is found in a path colder than all the paths you tested.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Don’t have cold paths and avoid fallbacks&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://tech.davis-hansson.com/p/make/&quot;&gt;Your Makefiles are wrong&lt;/a&gt; is an opinionated approach to GNU Make:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Don’t use tabs with .RECIPEPREFIX&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Always use (a recent) bash in strict mode&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Change some Make defaults, with a nice TLDR pre-amble&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;Mike Acton’s Expectations of Professional Software Engineers [&lt;a href=&quot;https://adamj.eu/tech/2022/06/17/mike-actons-expectations-of-professional-software-engineers/&quot;&gt;summary&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.frankmcsherry.org/graph/scalability/cost/2015/01/15/COST.html&quot;&gt;Scalability! But at what COST?&lt;/a&gt; says “Big data systems may scale well, but this can often be just because they introduce a lot of overhead” and is often referred to as “The COST Paper”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.brendangregg.com/blog/2014-05-11/strace-wow-much-syscall.html&quot;&gt;strace Wow Much Syscall&lt;/a&gt; by Brendan Gregg includes useful strace  one-liners&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Richard Sutton’s &lt;a href=&quot;http://www.incompleteideas.net/IncIdeas/BitterLesson.html&quot;&gt;The Bitter Lesson&lt;/a&gt; starts “The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin….” and begins to conclude “One thing that should be learned from the bitter lesson is the great power of general purpose methods, of methods that continue to scale with increased computation even as the available computation becomes very great. The two methods that seem to scale arbitrarily in this way are search and learning.”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://rigaux.org/language-study/syntax-across-languages.html&quot;&gt;Syntax across languages&lt;/a&gt;  is a gigantic survey of language design, e.g. operators/functions/etc. The survey can often inform what some collection of users will find natural or unnatural based on their existing skills.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/higham/what-is&quot;&gt;Nick Higham’s “What Is” article series&lt;/a&gt;  gives brief descriptions of concepts in numerical analysis for upper-level undergraduates with mathematical inclinations&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://journal.stuffwithstuff.com/2016/06/16/long-names-are-long/&quot;&gt;Long names are long&lt;/a&gt; observes “identifiers that are too damn long.”&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Omit words that are obvious given a variable’s or parameter’s type&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Omit words that don’t disambiguate the name&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Omit words that are known from the surrounding context&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Omit words that don’t mean much of anything&lt;br&gt;&lt;/br&gt;(e.g. data, state, amount, value, manager, engine, object, entity, and instance)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ends with a humorous application to waffles.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://pages.gseis.ucla.edu/faculty/agre/how-to-help.html&quot;&gt;How to help someone use a computer&lt;/a&gt; : “Computer people are fine human beings, but they do a lot of harm in the ways they &quot;help&quot; other people with their computer problems….”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Common statistical tests are linear models:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://lindeloev.github.io/tests-as-linear/&quot;&gt;Exposition in R&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.georgeho.org/tests-as-linear/&quot;&gt;Exposition in Python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/PaulVanDev/HoeffdingD&quot;&gt;Hoeffding’s test for dependence&lt;/a&gt; was proposed by Wassily Hoeffding (1948) as a test of correlation for two variables with continuous distribution functions (&lt;a href=&quot;https://en.wikipedia.org/wiki/Hoeffding%27s_independence_test&quot;&gt;wikipedia&lt;/a&gt;, &lt;a href=&quot;https://github.com/Dicklesworthstone/hoeffdings_d_explainer&quot;&gt;random blog&lt;/a&gt;,  &lt;a href=&quot;https://github.com/Dicklesworthstone/hoeffdings_d_explainer&quot;&gt;post&lt;/a&gt;). Hoeffding’s D is a nonparametric measure of the distance between the joint distribution F(x, y) and the product of marginal distributions F1(x)F2(y). The advantage of this statistic lies in the fact that it has more power to detect non-monotonic dependency structures compared to other more common measures (Pearson, Kendall, Spearman)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Data systems often fall into one of schema-on-write or schema-on-read:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Traditional databases are schema-on-write: “we can&#39;t upload data until the table is created and we can&#39;t create tables until we understand the schema of the data that will be in this table.”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Newer systems, e.g. “Big Data” is often schema-on-read, requiring all code that handles the data to understand it’s implicit schema.  Still “some level of schema design is inevitable”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Martin Kleppmann’s book &lt;a href=&quot;https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable-dp-1098119061&quot;&gt;Designing Data-Intensive Applications&lt;/a&gt; often comes up.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://erikbern.com/2023/12/13/simple-sabotage-for-software.html&quot;&gt;Simple sabotage for software&lt;/a&gt; , taking CIA sabotage manuals for inspiration, enumerates many horrid, insidious ways to sabotage a software organization.  To do better as an organization, work to prevent even accidental sabotage.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.oilshell.org/blog/2022/02/diagrams.html&quot;&gt;The Internet Was Designed With a Narrow Waist&lt;/a&gt;:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;A narrow waist is concept, interface, or protocol that solves an interoperability problem.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Picture an hourglass with M things on one side, N on the other, and an important concept in the middle.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It avoids O(M × N) code explosions, letting us write O(M + N) amounts of code instead.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Byte streams and text are essential narrow waists in software, particularly in distributed-systems like the Internet.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;On achieving high-level goals [&lt;a href=&quot;https://www.amazon.com/Corporate-Confidential-Secrets-Company-Know/dp/0312337361&quot;&gt;source&lt;/a&gt; pp 138-9]:&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Write down your five biggest goals for the year.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pick the one that will make the biggest difference in your life.  Tackle that one first.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Write your chosen goal in the past tense as though it&#39;s already happened. This will not only tell you whether you truly want it by how you feel as you look back at it from the future, it will also help you identify (in imagined hindsight) all the critical steps it will take to get there.  Outline as many critical steps as come to mind.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Write out twenty different things you could do right now to make it happen. Really stretch your thinking in new directions to get all twenty.  Now pick the one goal that will have the greatest impact on the achievement of that goal.  Try to knock one off your list each day, or week (depending on the goal).  Keep going with twenty more, and twenty more, until the goal is achieved.  Focus on only one goal at a time, putting all your energy in that one direction.  (Trying to work on them all at once can be overwhelming and diffuses your effectiveness and focus).&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Thompson_sampling&quot;&gt;Thompson sampling&lt;/a&gt; is commonly used as a multi-armed bandit algorithm. &lt;a href=&quot;https://github.com/rhysu/tuna/issues/24&quot;&gt;I have personally used it&lt;/a&gt; for an older side project.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.seangoedecke.com/how-to-ship/&quot;&gt;“Shipping is a social construct within a company.”&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There’s &lt;a href=&quot;https://github.com/forrestchang/andrej-karpathy-skills/blob/main/CLAUDE.md&quot;&gt;a CLAUDE.md containing Karpathy-inspired Claude Code guidelines&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://apenwarr.ca/log/20260316&quot;&gt;Every layer of review makes you 10x slower&lt;/a&gt; by he of &lt;a href=&quot;https://github.com/apenwarr/redo&quot;&gt;apenwarr/redo&lt;/a&gt; fame.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/3604963837723524672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/3604963837723524672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/3604963837723524672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/3604963837723524672'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2026/04/tidbits-from-world.html' title='Tidbits from the World'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-1642508092477155211</id><published>2018-02-04T16:20:00.000+00:00</published><updated>2018-02-04T16:20:17.895+00:00</updated><title type='text'>Randomized addition worksheets for kiddos using Bash Pipelines</title><content type='html'>Following up on &lt;a href=&quot;http://agentzlerich.blogspot.com/2017/06/randomized-reading-lists-for-kiddos.html&quot;&gt;a prior randomized worksheet for reading&lt;/a&gt;, here&#39;s a way to generate as many simple addition worksheets as you care to print:

&lt;pre class=&quot;prettyprint linenums&quot; style=&quot;font-size:x-small;&quot;&gt;
#!/bin/bash
# Print a US letter page of addition problems using numbers 0 through 10.
(
    for i in $(seq 1 26); do
        printf &quot;%2d %s %2d = \n&quot; &quot;$((RANDOM % 11))&quot; &quot;+&quot; &quot;$((RANDOM % 11))&quot;
    done
) \
| column -nxc 36 \
| sed G \
| head -n -1 \
| a2ps -1 --chars-per-line=32 --no-header --borders=no
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/1642508092477155211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/1642508092477155211' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1642508092477155211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/1642508092477155211'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2018/02/randomized-addition-worksheets-for.html' title='Randomized addition worksheets for kiddos using Bash Pipelines'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-4899576732894492091</id><published>2017-06-03T13:09:00.000+00:00</published><updated>2017-06-03T18:24:35.427+00:00</updated><title type='text'>Randomized Reading Lists for Kiddos using Bash Pipelines</title><content type='html'>&lt;p&gt;
Our kiddo is very good at memorizing stories and word sequences but needs to work on looking at the letters on the page.  Simple bash pipelines can produce useful offline learning materials.
&lt;/p&gt;

&lt;p&gt;
For example, print a randomized word list from inline story text for a book your kid loves:
&lt;pre class=&quot;prettyprint linenums&quot; style=&quot;font-size:x-small;&quot;&gt;
#!/bin/bash
tr -d &#39;&quot;,!.-&#39; &amp;lt;&amp;lt; EOF                          \
    | tr -s &#39; &#39; &#39;\n&#39;                          \
    | sed &#39;/^$/d&#39;                             \
    | sort -u                                 \
    | shuf                                    \
    | column -c 64                            \
    | nl                                      \
    | a2ps -1 --chars-per-line=70 --no-header

The night Max wore his wolf suit and made mischief of one kind
and another
his mother called him &quot;WILD THING!&quot;
...

EOF
&lt;/pre&gt;
Run the script once to produce the word list.  Print the source once to have the picture-less story.  Carry both in your pocket on the plane/train/etc.  After some work on the word list, the kid should be encouraged by &quot;rediscovering&quot; the picture-less story he knows using the sight words he&#39;s just practiced.  In theory.  Still working on the practice.
&lt;/p&gt;

&lt;p&gt;
Another example, print a randomized list of kindergarten sight words:
&lt;pre class=&quot;prettyprint linenums&quot; style=&quot;font-size:x-small;&quot;&gt;
#!/bin/bash
sort -u &amp;lt;&amp;lt;EOF | shuf | column -c 64 | nl | a2ps -1 --chars-per-line=70 --no-header
a
about
after
again
all
always
am
an
and
any
are
as
ask
at
away
back
ball
be
beautiful
because
been
begin
best
big
but
by
came
can
come
could
couldn&#39;t
day
did
do
does
don&#39;t
down
each
easy
eat
either
enough
family
find
for
friend
from
fun
get
girl
go
goes
going
got
great
had
has
have
he
her
here
high
him
his
home
house
how
I
idea
if
I&#39;m
in
into
is
it
jump
just
know
last
let
like
little
look
love
make
man
me
might
mom
more
mother
much
my
never
next
no
not
now
of
often
on
or
our
out
over
play
pretty
probably
put
ran
read
ready
run
said
same
sat
saw
say
school
see
she
should
sit
so
soon
special
such
suddenly
take
than
that
the
their
them
themselves
then
there
they
they&#39;re
things
think
this
thought
three
through
to
today
together
too
two
under
until
up
us
very
wait
walk
want
was
we
went
were
what
when
where
while
who
will
with
without
yes
you
your
you&#39;re
yourself
EOF
&lt;/pre&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/4899576732894492091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/4899576732894492091' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/4899576732894492091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/4899576732894492091'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2017/06/randomized-reading-lists-for-kiddos.html' title='Randomized Reading Lists for Kiddos using Bash Pipelines'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6426345363781422461.post-7252163713573378380</id><published>2016-12-11T18:57:00.005+00:00</published><updated>2016-12-11T18:57:55.060+00:00</updated><title type='text'>Travis-CI config for both recent(ish) gcc and clang</title><content type='html'>On account of the age of Travis-CI&#39;s build images (I hear) getting a new-ish C++ compiler going is futzy.  After &lt;a href=&quot;https://stackoverflow.com/questions/39682792/travis-ci-build-matrix-contains-spurious-entry&quot;&gt;much futzing&lt;/a&gt;, the following .travis.yml file works for an &lt;a href=&quot;https://github.com/RhysU/descendu&quot;&gt;autoconfiscated project&lt;/a&gt;:
&lt;pre class=&quot;prettyprint linenums&quot; style=&quot;font-size:x-small;&quot;&gt;
language: generic
script: ./bootstrap &amp;&amp; ./configure &amp;&amp; make all &amp;&amp; make check &amp;&amp; make distcheck
matrix:
  include:
    - os: linux
      env: COMPILER_NAME=gcc CXX=g++-5 CC=gcc-5
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - autotools-dev
            - g++-5
    - os: linux
      env: COMPILER_NAME=clang CXX=clang++-3.8 CC=clang-3.8
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8
          packages:
            - autotools-dev
            - clang-3.8
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://agentzlerich.blogspot.com/feeds/7252163713573378380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6426345363781422461/7252163713573378380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7252163713573378380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6426345363781422461/posts/default/7252163713573378380'/><link rel='alternate' type='text/html' href='http://agentzlerich.blogspot.com/2016/12/travis-ci-config-for-both-recentish-gcc.html' title='Travis-CI config for both recent(ish) gcc and clang'/><author><name>Rhys Ulerich</name><uri>http://www.blogger.com/profile/02843453263307584747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>