14  Small points: convergence and error detection

(ns meme-constructor.posts.post-05-small-points
  (:require [scicloj.kindly.v4.kind :as kind]
            [meme-constructor.population :as pop]
            [meme-constructor.convergence :as cv]
            [meme-constructor.figures :as fig]))

Post 5 of the series Memes as Abstract Constructors.

Isolated populations whose criterion is anchored in the world converge on the same small points; populations with an internal anchor agree at most on what psychology rewards. And a receiver that checks its copy against the world keeps almost all of a tradition’s content with no ranking criterion and no selection among hosts. That is keeping by error correction that reads the task, not by competition.

The answer of this post
c_rat
Anchor in the world
  • isolated populations converge on the same small points
c_anti, c_psy
Internal anchor
  • populations agree at most on what psychology rewards
no selection
A receiver's own check
  • checks its copy against the world
  • keeps almost all of the content
  • no ranking criterion, no competition among hosts

Both results use the population model of post 4. The model, definitions and propositions are ours.

14.1 1. Small points

Deutsch (2011, ch. 1) calls a good explanation hard to vary: almost every change of its details makes it explain nothing. De la Guardia (2020) pictures idea space with good explanations as “solitary, bright points” and rules of thumb as “fuzzier clouds of points”. Good ideas are rare among the variants of a good idea: “In that set, good ideas are indeed rare” (De la Guardia 2025c).

In post 4’s landscape a point block scores only on one hidden pattern and a cloud block on a plateau of patterns. All receivers share one conjecture space, the patterns of a block, so “small” means small relative to that space; post 1 shows that hard-to-varyness is relative to the receiver (Conjecture 1.19). A found point block is fine-tuned in the sense of the fine-tuning condition (D3) of post I.5: every one-step variant of it performs worse.

Two kinds of block in idea space
“solitary, bright points”
Small point
  • scores only on one hidden pattern
  • every one-step variant of a found point scores worse
  • hard to vary, fine-tuned (D3)
“fuzzier clouds of points”
Cloud
  • scores on a plateau of patterns
  • a rule of thumb
  • many variants work as well
“Small” is relative to one shared conjecture space: the patterns of a block.

In biology the sign that a design is a small point is convergent evolution: camera eyes arose separately in vertebrates and cephalopods (Conway Morris 2003). Only similarity that is not inherited counts, so the model gives every population its own random founder. The model has no ridges of working intermediates: every wrong pattern of a point scores 0, and whole-block jumps stand in for conjecture. Whether a ridge or a jump reaches a point is taken up in post III.4 (Conjecture III.4.10), not here.

14.2 2. Convergence (F10) and the convergence experiment (E11)

Conjecture 5.1 (Convergence reveals the anchor). When independent lines converge on one small point, something outside the lines fixes it. Isolated populations under \(c_\text{rat}\) converge in content, on the same small points. Under \(c_\text{anti}\) or \(c_\text{psy}\) they converge at most in features that \(F_\text{psy}\) rewards. Refutation condition for the convergence experiment (E11): \(c_\text{anti}\) or \(c_\text{psy}\) populations converge on content fixed by reality. Before the run it read “converge in content”; we reformulated it after the run, because the \(c_\text{psy}\) populations met that wording by agreeing on empty point blocks (Observation 5.5).

Definition 5.2 (Modal content, agreement). The modal variant of a population carries in each block the pattern most hosts carry. For modal variants a, b and a block type t (point, cloud, psy): identity agreement is the fraction of blocks of type t on which a and b carry the same pattern; shared content is the Jaccard index \(|a \cap b| / |a \cup b|\) on the tasks of type t (0 if the union is empty); the hit rate of a is the fraction of point blocks carrying the hidden pattern. A group of populations is scored by the mean over pairs.

Under an exact test the \(c_\text{rat}\) half of the conjecture follows from post 4: by Proposition 4.4 every line of descent reaches the maximum of \(F_\text{real}\), so all populations sharing a landscape come to carry every hidden point. The other half rests on the next fact.

Proposition 5.4 (Reality-blind agreement). Suppose neither criterion nor parent weights refer to \(F_\text{real}\) (\(c_\text{anti}\) with any d, \(c_\text{psy}\), \(c_\text{none}\), any β), and the law of the initial state is unchanged by permuting the tasks inside a point block (true for random founders). Then (a) the joint law of any group of isolated populations is the same for every reality; (b) for every point block, generation and k, the probability that k hosts carry the hidden pattern p equals the probability that k hosts carry any other pattern p′ of the same size.

Proof. (a) is Proposition 4.2 of post 4. (b) Let π permute the block’s tasks with π(p) = p′. Loss and gain act on each task independently with equal probabilities, a jump is uniform, \(c_\text{anti}\) counts deviations, and \(F_\text{psy}\) sees a point block only through its size. So π leaves the initial law and every transition unchanged. ∎

Why internal agreement is blind to reality (Proposition 5.4)
permute a point block
π sends the hidden pattern p to p′
→
nothing notices
loss, gain, jumps, c_anti and F_psy see only sizes and counts
→
p is no likelier than p′
to be held, found or kept
A point deleted from every host
rediscovered
Under c_rat
  • a jump that hits it is told apart and kept (Proposition 4.4)
not singled out
Under an internal anchor
  • comes back no more often than any other pattern
  • a jump hits it equally often everywhere
A rational meme is partly stored in the world.

14.2.1 The convergence experiment (E11)

The world of post 4, landscape seed 1.

The convergence experiment (E11)
six isolated populations
seeds 1–6; population s has its own random founder, seed 1000 + s
no common descent→
run
four conditions; 60 hosts; 600 generations
→
measure
modal variants every 25 generations: agreement, hit rate
→
refuted if
c_anti or c_psy populations converge on content fixed by reality
(def landscape (pop/make-landscape {:block-size 5 :seed 1}))
(def copy-noise {:p-loss 0.02 :p-gain 0.01 :p-jump 0.05})
(def base-params
  {:landscape landscape :copy copy-noise
   :n-agents 60 :generations 600 :max-attempts 50})
(def seeds [1 2 3 4 5 6])
(defn founder [s] (cv/random-variant (:n-tasks landscape) (+ 1000 s)))
(defn traces
  "Modal variant every 25 generations, one trace per isolated population."
  [params land]
  (mapv #(cv/modal-trace (pop/run (assoc params :landscape land :seed %
                                         :init (founder %)))
                         25)
        seeds))
(def e11-conditions
  [["c_rat" {:criterion {:kind :rat}} "#d62728"]
   ["c_anti d=1" {:criterion {:kind :anti :detect 1.0}} "#1f77b4"]
   ["c_anti d=0.9, β=3" {:criterion {:kind :anti :detect 0.9} :psy-bias 3.0} "#17becf"]
   ["c_psy" {:criterion {:kind :psy}} "#9467bd"]])
(def e11-traces
  (into {} (for [[nm p _] e11-conditions]
             [nm (traces (merge base-params p) landscape)])))
(def e11
  (update-vals e11-traces #(cv/convergence-series landscape %)))

The third condition combines imperfect levers with parents picked by \(F_\text{psy}\) (β = 3), the transport channel of post 4.

(defn e11-plot [k title ytitle]
  (kind/plotly
   {:data (vec (for [[nm _ colour] e11-conditions]
                 {:type "scatter" :mode "lines" :name nm
                  :x (mapv :gen (e11 nm)) :y (mapv k (e11 nm))
                  :line {:color colour :width 2}}))
    :layout {:title title :xaxis {:title "generation"}
             :yaxis {:title ytitle :range [-0.05 1.05]} :height 400}}))
(e11-plot :point-identity
          "Agreement on point blocks between six isolated populations"
          "identity agreement (mean over pairs)")
(e11-plot :hit-rate
          "Point blocks carrying the hidden pattern"
          "hit rate (mean over populations)")
(defn r3 [x] (if (double? x) (/ (Math/round (* 1000 x)) 1000.0) x))
(def e11-final
  (vec (for [[nm _ _] e11-conditions]
         (assoc (update-vals (peek (e11 nm)) r3) :condition nm))))
e11-final
[{:gen 600,
  :point-jaccard 0.822,
  :cloud-jaccard 0.444,
  :psy-jaccard 1.0,
  :point-identity 0.867,
  :hit-rate 0.917,
  :condition "c_rat"}
 {:gen 600,
  :point-jaccard 0.405,
  :cloud-jaccard 0.17,
  :psy-jaccard 0.335,
  :point-identity 0.033,
  :hit-rate 0.0,
  :condition "c_anti d=1"}
 {:gen 600,
  :point-jaccard 0.073,
  :cloud-jaccard 0.116,
  :psy-jaccard 1.0,
  :point-identity 0.167,
  :hit-rate 0.0,
  :condition "c_anti d=0.9, β=3"}
 {:gen 600,
  :point-jaccard 0.0,
  :cloud-jaccard 0.0,
  :psy-jaccard 1.0,
  :point-identity 1.0,
  :hit-rate 0.0,
  :condition "c_psy"}]

Observation 5.5. Seeds 1 to 6, generation 600, table above. At generation 0 the populations agree on 3 % of point blocks.

condition
point blocks
levers
verdict
c_rat
hit rate 0.92, identity agreement 0.87
agree fully
converge on the points
c_anti, d = 1
every host keeps its founder
no convergence
c_anti, d = 0.9, β = 3
hit rate 0; shared content 0.40 → 0.07
converge fully
levers only
c_psy
emptied: perfect agreement, on nothing
converge fully
levers only

Under \(c_\text{rat}\) shared cloud content ends at 0.44, since any three of a cloud’s five tasks are equally good. Each \(c_\text{rat}\) population is an independent discoverer, a toy case of the multiple discoveries that Merton (1961) found to be the normal pattern in science. The \(c_\text{psy}\) populations agree on empty point blocks as they would under any reality (Proposition 5.4).

14.2.2 A counterfactual reality

If convergence reveals the anchor, populations tested against another reality should find other points but the same levers. We redraw the hidden patterns (seed 99) and run six more \(c_\text{rat}\) populations.

(def alt-landscape (pop/counterfactual-reality landscape 99))
(def e11-cf
  (let [true-rat (e11-traces "c_rat")
        cf-rat (traces (merge base-params {:criterion {:kind :rat}}) alt-landscape)]
    {:within-counterfactual (update-vals (peek (cv/convergence-series alt-landscape cf-rat)) r3)
     :across-realities (update-vals (peek (cv/cross-series landscape true-rat cf-rat)) r3)}))
e11-cf
{:within-counterfactual
 {:gen 600,
  :point-jaccard 0.673,
  :cloud-jaccard 0.402,
  :psy-jaccard 1.0,
  :point-identity 0.683,
  :hit-rate 0.792},
 :across-realities
 {:gen 600,
  :point-jaccard 0.272,
  :cloud-jaccard 0.423,
  :psy-jaccard 1.0,
  :point-identity 0.014}}

Observation 5.6. Seeds 1 to 6, generation 600, \(c_\text{rat}\):

point blocks
levers
within the counterfactual group
hit rate 0.79, identity agreement 0.68
across the two realities
agreement 0.01, chance level
agreement complete
Content follows reality; levers follow psychology.

14.3 3. Keeping without selection: the error-detection experiment (E12)

If almost any deviation breaks an explanation, a receiver can notice its own error: the reconstruction no longer explains the evidence. A hard-to-vary explanation then carries its own error detection: its reason is the information about the task that Marletto (2015, §3.1) asks of a recipe as the criterion for error correction. This is the open level, the function of culture memes rebuilt from reasons. The function is not digital and no copy is confirmed exact, but each reconstruction can be checked against the reason. That is a way to keep content that needs neither psychological levers nor selection among hosts.

Definition 5.8 (Detection and selection). Selection by the criterion ranks a whole candidate against the parent and keeps it if it ranks at least as high (\(c_\text{rat}\)). Detection by the receiver’s own check compares, block by block, what the reconstruction does with what the source’s version does, and rebuilds a block while they differ. It does not rank, and it rejects an improvement as readily as a loss.

Two ways to keep content
c_rat
Selection by the criterion
  • ranks the whole candidate against the parent
  • keeps it if it ranks at least as high
  • can keep an improvement
no ranking
Detection by the receiver's own check
  • compares each block's effect with the source's
  • rebuilds a block while they differ
  • rejects an improvement as readily as a loss

The check asks the world for each block’s contribution to \(F_\text{real}\). That is evidence about the world, so the check reads the task and is externally anchored. cv/self-check-reconstruct plugs into pop/run as a custom reconstruction with up to three retries per block, with criterion \(c_\text{none}\) and uniform parent choice. There is no ranking criterion, no lever and no selection among hosts. For a point block the check works by construction: its score changes under every deviation. The question is how much it keeps over many generations, when errors that slip past it can accumulate.

The source and the three conditions:

The error-detection experiment (E12)
source
all four points, clouds with 4 of 5 tasks, half the levers
→
three conditions
plain copying; own check with c_none; selection by c_rat
→
run
60 hosts, 300 generations, seeds 1–3
→
measure
mean F_real; hosts with the first cloud's original tasks
(def source
  (let [t (pop/tradition landscape {:n-points 4 :n-clouds 2 :psy-bits 5})]
    ;; add one task to each cloud, so the cloud sits inside its plateau
    (reduce (fn [v c] (bit-set v (first (remove #(bit-test v %) (pop/variant->tasks (:mask c))))))
            t (pop/blocks-of-type landscape :cloud))))
(defn copy-with-check [retries]
  (if (zero? retries)
    copy-noise
    (assoc copy-noise :reconstruct (cv/self-check-reconstruct copy-noise retries))))
(defn e12-population [copy crit]
  (let [runs (mapv #(pop/run {:landscape landscape :copy copy :criterion crit
                              :init source :n-agents 60 :generations 300 :seed %})
                   [1 2 3])
        c (first (pop/blocks-of-type landscape :cloud))]
    {:f-real (apply mapv (fn [& xs] (/ (reduce + xs) 3.0))
                    (map #(map :mean-f-real (pop/summary %)) runs))
     :original-cloud-content
     (r3 (/ (reduce + (for [h runs]
                        (cv/carrier-fraction (assoc c :pattern (cv/block-pattern c source))
                                             (peek (:generations h)))))
            3.0))}))
(def e12-pop
  [["c_none, no check" (e12-population copy-noise {:kind :none}) "#7f7f7f"]
   ["c_none, own check (3 retries)" (e12-population (copy-with-check 3) {:kind :none}) "#2ca02c"]
   ["c_rat, no check" (e12-population copy-noise {:kind :rat}) "#d62728"]])
(kind/plotly
 {:data (vec (for [[nm d colour] e12-pop]
               {:type "scatter" :mode "lines" :name nm
                :x (vec (range 301)) :y (:f-real d) :line {:color colour :width 2}}))
  :layout {:title "Mean F_real: keeping by detection against keeping by selection (mean of seeds 1-3)"
           :xaxis {:title "generation"} :yaxis {:title "mean F_real" :range [0 21]}
           :height 400}})
(mapv (fn [[nm d _]] {:condition nm :final-f-real (r3 (peek (:f-real d)))
                      :min-f-real (r3 (reduce min (:f-real d)))
                      :hosts-with-original-cloud-content (:original-cloud-content d)})
      e12-pop)
[{:condition "c_none, no check",
  :final-f-real 3.548,
  :min-f-real 2.681,
  :hosts-with-original-cloud-content 0.011}
 {:condition "c_none, own check (3 retries)",
  :final-f-real 18.6,
  :min-f-real 18.378,
  :hosts-with-original-cloud-content 0.011}
 {:condition "c_rat, no check",
  :final-f-real 20.0,
  :min-f-real 20.0,
  :hosts-with-original-cloud-content 0.0}]

Observation 5.10. Seeds 1 to 3, 300 generations, from 20:

condition
mean F_real
verdict
c_none, no check
decays to about 3.5
lost
c_none, own check (3 retries)
never below 18.3, ends at 18.6
kept, not repaired
c_rat, no check
stays at 20
kept
In all three at most about 1 % of hosts still carry the first cloud's original tasks, yet the cloud keeps working.

What the check loses is an error that slipped past three retries and drifted to fixation: the check restores only what the source still does, so a lost point is never repaired. With the cloud it keeps a rule of thumb’s function, not its content.

This bears on the central open question of the book: does keeping a design under continuing variation need competition, or only selection that keeps reading the task (post I.5)? Here nothing competes. No host is preferred and no candidate is ranked. Each receiver corrects its own copy against the world, and that alone keeps more than nine tenths of the content for 300 generations. What it does not do is repair: the small residual loss is permanent, where selection among hosts restores it. It is not a controlled comparison with competition, since there is no condition with competition and the same check.

The check has two limits.

What the receiver's check does
Keeps
  • more than nine tenths of the content for 300 generations
  • with nothing competing
Does not repair
  • the small residual loss is permanent
Does not grow
  • it rejects improvements as readily as errors
a limit
Needs a test in the world
  • a false point gives it nothing to detect
  • checking only against the source's words is c_anti

Fidelity and growth are separate axes, as in post 4. So hard-to-varyness helps fidelity only where the meme’s function shows up in evidence.

14.4 Summary

  • Isolated populations under an exact external test all come to carry every hidden point. In the convergence experiment (E11) the hit rate reached 0.92 from unrelated founders.
  • Under internal anchors agreement is reality-blind (Proposition 5.4): such populations converged on levers and on empty point blocks, never on the hidden patterns.
  • Against a counterfactual reality the populations found other points and the same levers.
  • A receiver that checks its copy against the world, with no selection and no ranking, kept mean \(F_\text{real}\) above 18.3 of 20 for 300 generations (Observation 5.10). Content can be kept by error correction that reads the task, without competition. It is not repaired once lost.

14.5 Open problems

open
Keeping with and without competition
The same check with and without selection among hosts, under a task that moves, would compare the two ways of keeping directly.
open
Real traditions
Branches that agree on rituals and emotional hooks but not on claims would be anchored in psychology. Not tested here.
open
Different conjecture spaces
All receivers here share one; the relativity of hard-to-varyness to the receiver is not tested.

That relativity is the one of post 1.

14.6 References

  • Conway Morris, S. (2003). Life’s Solution: Inevitable Humans in a Lonely Universe. Cambridge University Press. (verified)
  • De la Guardia, C. (2020). A few questions on AGI. Making Minds and Making Progress (Substack), 22 February 2020. https://carlosd.substack.com/p/6-a-few-questions-on-agi (verified; the quotations checked against the page)
  • De la Guardia, C. (2025c). Are good ideas rare? Making Minds and Making Progress (Substack), 2 June 2025. https://carlosd.substack.com/p/rare (verified; quotation checked against the page)
  • Deutsch, D. (2011). The Beginning of Infinity. Allen Lane. Ch. 1. (not re-checked)
  • Marletto, C. (2015). Constructor theory of life. J. R. Soc. Interface 12(104): 20141226. §3.1. (not re-checked)
  • Merton, R. K. (1961). Singletons and multiples in scientific discovery: a chapter in the sociology of science. Proceedings of the American Philosophical Society 105(5), 470–486. (verified)
source: book2/notebooks/meme_constructor/posts/post_05_small_points.clj