I think about AI alignment; send help.
James Payor
(I haven’t read the article, don’t have a subscription, but my understanding is) they should be getting unlimited serial depth by feeding in previous latent states at the bottom of the stack at the next token, while e.g. running autoregression. That thoroughly breaks the previous information-flow story.
I’ve drawn out my understanding of these below, in the hope that some thoughts that may be helpful. (Fwiw tracking in this level of detail is not yet easy for me! But I think I have made a good attempt.)
I think the basic thing to say is that self-reference is (generally) not a provided primitive! So anything anyone does that looks like self-reference is actually a construction that has to ground out in a finite and fully-unrolled sentence.
Here are my full thoughts though, others will hopefully correct me if anything I’m saying is misleading:
As you’ve sketched, you can prove that for any
and any (like “Santa exists”), , meaning: if there exists any claim that both implies and is implied by , then must be true and so is .That does mean that if you are working in a logical framework that lets you construct a sentence with this property, you would be in trouble!
In almost-python, the “proof” looks like:
def go[F, R](up: F → (F → R), down: (F → R) → F) → R:half: F → R = lambda f: up(f)(f)return half(down(half))(You may recognize this as a Y-combinator-y construction! If you invent some type
Fthat’s equal toF → R, you can then pass in the identity functionlambda f: fforupanddown. Thengowill build the resulting “R” by *checks notes* looping forever and never actually returning anything. Anyway.)But why can’t you generally say
, i.e. “I define to be ”? One handle is that you don’t actually start having a thing named “ ” to refer to until after you’ve defined it. Generally theories aren’t in the business of letting you build graphs with loops, a sentence has to stand on its own feet when fully unrolled in order to obtain truth grounding.We could see the definition
as being code or syntactic sugar that tries to describe a fully unrolled sentence. We often talk about sentences this way because it’s easier to name things with let bindings and graphs. And that’s confusing in exactly this case! But the difference is that this one loops when you go to unroll it, and doesn’t actually name a valid finite sentence.There are ways you can get (working) self-reference within this constraint. One way is that you can think of
as a property you would like to obtain at a fixed point, and define a series of increasingly-complicated/increasingly-deep sentences , and ask if there is a limiting value that reaches as gets arbitrarily high. In this case the kind of self-reference is akin to the flipping back-and-forthT=>F=>T=>F…if you set R to something false, so there’s no fixed point to be had here.A different way you can build in self-reference (of sorts) is using quining. Quining lets you refer to the source code of
inside itself, and can be made to work even in rather weak theories (via Godel numbering schemes). The source code on its own is not a “claim” though, so if wants to make a claim about its own source code you need something like an evaluator, where “ ” means the (encoded) source code for a sentence .(I’m weakest on this part, someone may correct me:) Tarski’s undefinability of truth result says that consistent logical systems must not contain a general evaluator
that corresponds to models of “truth” in the system, in a particular sense:Looking on from outside the system, we pick a “model” that is some way to assign true/false to every sentence that is consistent with what the system can prove to be true and false. Call this our truth function
.There can be no general
defined within the system that successfully claims for every sentence that “the sentence is true according to our outer model”; i.e. there is no satisfying for every that .This means our model of the truth value of the sentence
cannot always line up with our model of the truth value of the sentence , which we take to mean that no inner can define within-the-theory our outer .
The reason Tarski’s result holds is exactly that it lets you build the self-reference chain. Because
can refer to its own source code via quining, you can pick an function that turns a sentence into a truth-claim then build . Tarski is forcing both our model and our inner to make a choice of true or false on everything, including on loopy content like this. And from either choice we derive a contradiction because this new quine-y would be equivalent to a loopy (and we can choose to get ).This doesn’t rule out an
that can work on source code that doesn’t loop, or otherwise does something approximating but not fully reaching “outer truth”.For instance a common use of
is provability. You can describe the inference rules of a theory within itself, and this lets you perfectly-well construct sentences like “there exists a proof of the sentence within theory ”.This means you can build sentences like
, which says “this sentence is not provable in theory ”. If you are using a concrete theory like PA or ZF then you can build a sentence which says “there are no proofs of me in PA/ZF”, and the theory won’t be able to prove this true or false on pain of loopy problems! But the theory can escape this by simply saying “I abstain from this one, you can’t prove it either way”.This means there are partial models of truth
that can say “true/false/abstain” with an exactly-matching on the inside (that could also allowed to abstain, or could be allowed to return whatever it likes when we abstain on the outside). And provability is an example of this, where “abstain” on the outside means “we can’t prove it true or false”.As maybe a callback to
, you aren’t going to be able to define in a fully recursive fashion, because you would be referencing “ ” within the definition before it has been fully defined, which you can’t do with these fully-unrolled sentences. But you can define an that refers to , which you could use to assign truth to everything that halts in some finite number of steps (like “is there some depth after which no longer abstains”).(Relatedly you can write things like “there exists some length of proof
where each of the steps is valid and concludes ”, and that’s how you get the provability one.)
I hope that’s helpful!
I found this a helpful reframe, thank you for the pointer! Like we can consider the flow of time as first our opponent chooses betrayal/non-betrayal, and we then react to our knowledge of that in order to fill in our defect/cooperate choice? And here betrayal/non-betrayal is a very relevant abstract choice the opponent is making in their policy.
I have the impression that “reward” is being strategically/instrumentally considered in these transcripts, which seems relevant to my picture if it’s true. Like for the model(s) in question it looks quite relevant to their choices that they believe they are being evaluated, and further that they’re being trained/modified based on the reward signal.
I’m not sure what they would do if they believed it would “work” to mess with the training (beyond their choices about how to complete local tasks, which do affect what is actually reinforced and the “labs” would do well to know this). It at least seems to me like they would relate to things differently and make different choices if they knew the evaluation wasn’t inside the training loop.
Overall idk and would like more info, and appreciate you posting this! Also if you or anyone has pointers to poignant parts of the transcripts available (I sure haven’t read through everything) that would be great.
Man, okay I’m now wondering if the following works for a PrudentBot implementation? Calling our PrudentBot
and our opponent in the encounter, let or something that grows a bit bigger than :Let
be the length of the shortest proof thatLet
be the length of the shortest proof thatIf
and then cooperate, otherwise defect
In symbols,
This is derived from the limit of an algorithm that searches for increasingly long proofs that we can obtain the opponent’s cooperation one way or another, with some budget for looking harder for a (defect, cooperate) proof should we find a (cooperate, cooperate) proof first.
The point of looking harder for the (defect, cooperate) option is that you don’t want to cooperate with a CooperateBot (or some complicated code version of CooperateBot) just because the mutual-cooperation proof was the easiest to find. And the point of having some budget that is not unlimited for searching harder for the (defect, cooperate) outcome is that once your opponent can see that you can find a (cooperate, cooperate) proof, they then get an upper limit on how much further they need to search to check you won’t throw that away in favor of a (defect, cooperate) proof.And fwiw I haven’t properly vetted this idea yet, could easily break or be unsatisfying in a number of ways!
Writing to say that I quite like and agree with the perspective here! I have been continuing to do my own puzzling about what would be a more wholesome instantiation would be than the “exists finite length proof” modality, as part of a project to ground things out better, though even absent that I feel confident that the intuition stands up and the processes above you’re outlining in Kripke terms should be realizable.
I also have two rambly thoughts to offer here, which I’ve included below if they’re of interest:Fwiw in the first place I arrived at “
” by thinking about what the algorithm steps should be in the modelling-my-prisoners-dilemma-opponent. I was very bothered by the part where we get to “I notice they are checking ” and then fail to shorcut! That’s a quantity directly under our control, why not counterfact on it? I was then kinda surprised to find this directly encodes in modal provability logic with reasonable behaviour even though “ ” feels very much like a poor imitation of a counterfactual.
...I thought that then obviously we should be able do the “real” PrudentBot. The naive encoding for that would be like “defect if , otherwise cooperate if , otherwise defect”. (This is a little different than your setup I think. I’m trying to ask “does defecting lead to (defect, cooperate)? if so defect; otherwise if cooperating leads to (cooperate, cooperate) then cooperate; otherwise defect”.) But yep this runs directly afoul of the consistency problem, inner “counterfactuals” do nothing to save it from that problem. And to be clear the problem is that it’s hard for itself and other agents to model that it won’t find some clever reason to activate the defect branch. And the OG PrudentBot is… uh… carefully skirting around this. I still expect there’s a nice answer waiting here; provability should be expressive enough to capture the limit of a relevant algorithm in a clean way. The translation is still eluding me.When I think about the ontology that underlies the way the boxes work in the provability bot setting, I get a picture like the following:
- Every box like in refers to one day earlier in time
- From the perspective at the beginning of time, everything is “true”, i.e. holds
- Things yesterday’s perspective considers true are must also be considered true on the day before by internal necessitation (ala ). the contrapositive ( ) tells us that anything that becomes false stays false forever.
- Lob’s therom says that , which I read as “the things that our perspective says must remain true are exactly the things that our perspective considers true”, so what ends up being provable/”considered true” are exactly the things that we can see must remain true
So this suggests a picture where the modal agents when interacting with each other are popping open a dimension of “discursive time” (thanks Sam Eisenstat for that term) along which to have a dialogue about what actions they’ll take. The particular chosen dimension is this peculiar provability box, with the property that on a given day you “might” have , or just one or the other, or none. Then the agents are set up with rules like “I will cooperate today if you cooperated with me yesterday” (FairBot) or “I will cooperate today if you didn’t cooperate with DefectBot yesterday and, if yesterday wasn’t the beginning of time, you cooperated with me” (OG PrudentBot).
Then the stability machinery runs to determine the actual output. And while my story is a bit incomplete it still clarifies some of the mechanics for me.
In likelihood though you may recognize the stability-over-time picture as performing the same/isomorphic movements as the Kripke analysis! Which yeah I was not familiar with Kripke frames at the time. But still.
My make takeaway from this is that it’s cool that the provability agents are able to pop open a dimension along which they can discuss and potentially bargain, without needing a physical clock, with its own pecularial lattice dynamics (you keep shrinking the space until it’s stable) that are handy in some ways but abysmal in others lol. So there’s a wide open question about what other alternatives there are, do those alternatives compose with each other (like does your alternative discursive time behave nicely if put up against a proof-search algorithm?), and what those alternatives look like described in logic.
Thank you for this timing fix btw! It’s been a great quality of life improvement :)
Thanks for the updates, appreciate it!
Fwiw on numy, I don’t find particular need for it; it is convenient for some precomputation or numeric helpers, nothing that can’t be done with lists, and we should use flopscope for heavy lifting anyway.
It might help to have a pared-down uv env file that more closely tracks the grader, with instructions for validation / local smoke test to use that? But again not a big deal, grader smoke test reveals any compatibility issues pretty quickly.
Great, thank you! Timing seems updated, but also fwiw
flops.symmetrizeis still not there: https://www.aicrowd.com/challenges/arc-white-box-estimation-challenge-2026/submissions/310914
Okay another thing (let me know if there’s a better spot for reports like this?), the “symmetrize” functionality seems unavailable on the grader. For that matter, the grader doesn’t have stock
numpyand some other deps that are included in the starterkit env. See https://www.aicrowd.com/challenges/arc-white-box-estimation-challenge-2026/submissions/310565 re symmetrize not being there.
Another point coming up: it seems like remote-dispatch (and perhaps array-copying) are currently being billed as “excess wall time” rather than flopscope time. This shows up when one dispatches ops with a lot of state, which is getting penalized excessively (I think).
If I have this right, I’d vote for flopscope time to be counted on the op boundaries (which would absorb time spent dispatching to the remote) rather than time the remote actually spends on array crunching.
(Also if the arrays are being copied back and forth that seems a bit excessive and causing the grader to be way slower than necessary! I’d try to have the remote endpoint have durable custody of arrays within a session, and only transfer data on creation and when-demanded.)
EDIT: This issue I just found seems related and probably complementary.
It looks to me that the pre-grading “smoke-test” has a flop cap that is well below 6.8e10, it’s perhaps at 1e10? So for me submissions at 0.1x the cap are getting through but larger flop counts are failing.
(Update: it’s now fixed, thanks!)
This helps me appreciate the mood of where you are coming from thanks! But uh I have objections also, mostly due to our spot in the thread.
I would second CronoDas’ point that the mechanics of change aren’t quite that simple. And I’d like to complain that this is not an example of a thing that is helped by people taking actions they don’t feel hope in!
I acknowledge than the secret police setup seems like it does well at bringing in the “you can’t communicate and build plans together” aspect that “coordination problem”/game-theory seems to typically evoke, I’ll note though that you still have a lot of communication/observation channels (including costly ones like protesting and being taken away or killed).
More importantly it seems like the robust way out of the situation is to try to build more infrastructure for being able to act with a coalition of peers in a constructive manner. Game theory as typically thrown around seems a poor model for this imo.
...what sort of “coordination problems” does one “solve” by doing things you don’t have hope in? I really don’t get it and am perplexed. This photo is swellingly full of hope, and presumably we got there through people that had hope in their actions. Perhaps there’s detail in the history you’re referencing that’s going over my head.
I do find it poetic, but in seriousness I think if folks don’t actually feel hopeful about what they’re doing then they should do something else—leave the work / research direction / engineering / comms / whatnot to whoever actually feels hope about it...
To elaborate, the thing that’s poetic for me about “our hopeless cause” is because I have hope that is not cleanly legible to the outside, easy to write off as “hopeless”. And it’s important to stay in tune with your own knowings about this stuff. I think there are very deleterious effects from throwing energy into things one doesn’t have hope in.
(...And to elaborate further, mostly I think the bad stuff happens by lending support to corrupt things. And imo being pushed to work on X while you lack hope in X is a solid flag of corruption.)
Thanks, this is a solid point that choosing the defect-cooperate outcome should really be based on constructive knowledge, and the fallback shouldn’t be “definitely defect!” if you can’t obtain that.
So that makes me more think that
is the sort of term that is legit in a PrudentBot, since “we can’t find a proof that if we provably defect then they cooperate” is what we actually wanted. And sure the naive translation into provability logic won’t like this, and I think this means we should look for a nicer translation, probably starting with getting a bounded proof-search bot correct.I’m wondering about what the SharkBot term is doing, compared to my (probably broken) idea of using
. If I converting this one to diamonds I get: (“it’s possible that I necessarily defect while my opponent defects”) (“it’s possible that my opponent defects while it is not possible that I cooperate”)
This seems potentially more restrictive than it needs to be? Well, restrictive can be good here, since what we are targeting is defecting as often as we can while guaranteeing a defect-cooperate outcome. But also as pointed out elsethread this PrudentBot approach may have trouble cooperating with itself.
Anyway this leaves me more ready to unpack the SharkBot condition, which is
. This is a bit different than what I landed at, reading “it’s possible that my opponent defects or it is possible that I cooperate”.Converting the SharkBot condition back to squares I get:
Ah okay, so I think this is caching out the version that’s like “I defect if it is stable that my opponent cooperates while I provably defect”. (I think this may be equivalent in strength to my condition under Lob’s theorem?)
Btw on the theory that “
” was a bit of a mistake relative to “ ” as a basic approach, we could simplify a bunch of the language above to “it’s possible that my opponent defects while I defect” (my one) or “it’s possible that my opponent defects or I defect” (SharkBot). I’m taking this as some evidence that it would be better to go with the forms.
(Thanks for the post btw! My comments on this comment below.)
This PrudentBot def does feel in-spirit to me. I also agree with your analysis that it doesn’t fall for the pitfall of “I assumed in my hypothetical that you thought I would unconditionally cooperate with you, but then no fair you defected on me in my hypothetical! I defect!”
For instance this happens if you try, as I was inclined to try,
. This quickly becomes “false” i.e. “defect” if you have a lying around.With your definition, we have
, and assuming we have a around I think that simplifies to . (I’m not sure I have that right!)That’s… better behaved! It will run into the same Lobian difficulties as usual if we directly translate this as a provability bot. So imo we still need some better answer as to how we should interpret these as programs that more faithfully represents what we want in terms of their reasoning.
Also fwiw, I run with the model that the simulated opponent has access to both a description of your full behaviour and a shortcut proof that you cooperate with just them. (In the cooperation branch hypothetical.) So when your simulations have the cooperation proof in scope, you’re just saying that the behaviour is equivalent to CooperateBot in this very matchup. And it happens that this is often a sufficient condition for cooperation. (And if your opponent runs you on a different bot like DefectBot, the cooperation proof doesn’t apply there.)
So there’s some question here like “well what’s the point of simulating under the assumption of the narrow cooperation proof if we’re keeping the full description as a fallback?”
Part of what your post points at is an answer which is that, well, it works out more cleanly if you do! Specifically that reasoning is easier if, for the purposes of deciding to cooperate, you assume the decision is made and check that it’s stable/good.
As for why that is the case, I have a more philosophical take that it’s about encoding choice, and the better mechanics we see are downstream of encoding this better. I’ll go into more detail in this collapsed section (you may well wish to gather your own thoughts first).
on encoding choice
We can think of the bot as containing some mechanisms that lead to certain actions, with conditions for firing.
The FairBot variant described in this post is a simple instance, with a default action of defection and a single mechanism that leads to coooperation when it fires.
I have some idea that the choice-y mechanisms are of the form “if I activate, will the outcome satisfy some property? if so I activate”.
So for a given mechanism we can have a widget
with a goal target . We want a way of saying “if were to fire this would lead to ” as our condition for . And there’s a question of how to encode this in a program or in our modal logic setting.Straight up trying
won’t work, since and you won’t be able to form a statement like this. This was omitting the part where is using some model of consequences to make its choice.So next up is
, in which fires if our modelling shows that if fires this will lead to . You can in fact show that here!The other option is
; this doesn’t assume ” fires” but rather “someone has a model that fires”, and is actually a bit more brittle. The reason this form can be preferable in the modal logic bots is that you are sidestepping the complexity of showing that you will need to check your opponent can tell that has fired. But I think this may be a bit of a hack relative to the version.My reasoning here suggests for that if you have multiple conditions for action, you may factor out
// that are each self-referential, and build your high level agent as trying each in sequence. I haven’t fully cached out yet what this looks like, and whether it e.g. gives you a meaningfully different PrudentBot.I note that this picture doesn’t provide a convenient answer for the problem where in provability land your action “defect” may cause someone to need to prove
. But as I guess I keep mentioning I view this as a bug in the provability encoding.
(EDIT: focusing here on PrudentBot. Fwiw I like the idea you have in SharkBot use the weaker diamond when evaluating whether to defect! I’m less well equipped to analyze it at this time, still just grappling with how to handle diamonds at all in my usual proof search ontology.)
I’m less familiar with the diamond modality; but if I can correctly translate “exists some world that satisfies X” as “not every world satisfies not-X”, we get the following:This will run into some trouble in the unbounded-proof-length provability logic model; since generally you can’t prove in some fixed length that there will be no proofs of any length of
, on pain of unsoundness via a Lobian fixed point. So the version in the paper runs (I believe) as follows:This is handling the part where
might be FairBot and require “proving that there are no proofs” by checking the defection part under the assumption of one level of soundness. (I remember this gotcha because when I try to write down the PrudentBot that lives in my heart I end up with something closer to your version, but then the paper was doing this carefully different thing...)Insofar as it’s really the proof lengths fighting that is the problem, I think something like the following might just work instead:
Anyway this is all to say that:
I agree that the original PrudentBot definition seems hacky, both in the DefectBot aspect (we can replace this with “doesn’t cooperate with every bot” if that helps), and also in the assuming exactly one level of soundness regard. It is ofc a nice POC given that it does manage to cooperate with itself with this machinery.
In terms of caching the diamond definitions out into provability logic some care seems to be required, and I’m interested in a well-behaved translation. The “not box not” translation doesn’t actually stay very faithful to the intent.
It might be that messing around with proof bounds is sufficient to get there, so you don’t end up with an inner proof length being able to diagonalize an outer proof length.
Yep, on my read no supposed “redlines” are not actually in the contract language they have shared, e.g. consider whether this part in fact names a “redline”:
Right so I had rushed to assume that they’d changed the latent information flow, otherwise I’d be surprised if it was just weight tying or adaptive loop count that spawned some leak about CoT becoming unmonitorable.
Imo Jakub has specifically not ruled out this kind of thing, late latents passed forward for earlier reads, that happens naturally for a bunch of the looped transformer variants, including the one Noosphere links.
I tried to clarify in this thread with Micah but didn’t get a full answer yet I think: https://x.com/MicahCarroll/status/2095031872321647063
In worlds where it is on the benign side of looping (and CoT difficulties/changes are attributed to elsewhere) I hope they make it clear. Currently still stuck in my “this is Bayesian evidence for fuckery” interpretation.