Where things diverge

One row per type or operator, one dot per executed check, coloured by outcome. Sorted worst first, so the clusters are the top of each table.

all agreeRaku++ differsdocumentation staleRaku++ matches the docs, Rakudo does notall three differnot run

Over time #

One point per regeneration of the data, oldest first. The history is kept append-only in src/data/history.jsonl, so this chart can be replaced by something richer without losing the record.

okrakupp-differsdoc-driftrakudo-differsall-differ
peak 10062026-07-252026-09-29

Types

Each dot is one example from the official documentation, run on both engines and compared against the output the documentation asserts.

TypenagreeR++docrkalloutcome
Cool99623313
routines51261914
Any96761926
List10083314
Str8974181
Baggy3320216
Enumeration16513
DateTime3223261
Pair3021141
BagHash113314
Code16814
Mu33253112
Promise9141
Hash3427411
IO::CatHandle2114151
IO::Path3427121
Iterator181131
Dateish272124
IO::Handle12621
Map1610113
Parameter25192211
Range3529112
Seq13711
Setty15932
Attribute151012
Bag8314
Buf171213
Label6123
MixHash72212
Signature514
Array252112
Blob141031
Bool9522
Capture161211
Failure1062
IO::Spec::Win322117211
Junction18141111
Mix84121
Routine62112
SetHash117211
Sub5121
Backtrace312
CompUnit::Repository::Installation3
Compiler33
Grammar411
Int14111
Metamodel::ClassHOW413
Scalar12921
Thread31
Unicode312
Associative4211
CallFrame21
CompUnit::Repository::FileSystem31
Complex17152
ComplexStr21
IO::Spec::Unix181611
Instant642
Metamodel::MethodDelegation21
Metamodel::ParametricRoleGroupHOW22
Metamodel::ParametricRoleHOW22
Metamodel::TypePretense211
Nil10811
Real421
Sequence2
Set8611
Supply2018
ValueObjAt211
Variable42
WhateverCode21
X::Bind::Slice22
Allomorph541
Backtrace::Frame11
Exception211
ForeignCode11
HyperSeq11
HyperWhatever431
IO::Path::Parts431
IO::Special321
IntStr211
Iterable541
Kernel321
Lock211
Metamodel::C3MRO211
Metamodel::ConcreteRoleHOW11
Metamodel::MethodContainer211
Metamodel::Mixins321
Metamodel::MultipleInheritance1
Metamodel::PackageHOW11
Metamodel::Primitives11
Metamodel::Stashing211
Method43
Num981
NumStr211
Positional11
PositionalBindFailover21
Proc21
QuantHash321
RaceSeq11
RatStr211
Rational431
Signal11
StrDistance541
Version1091
Whatever431
X::AdHoc11
X::Assignment::RO11
X::Cannot::Empty11
X::ControlFlow11
X::Dynamic::NotFound1
X::Numeric::DivideByZero11
X::Numeric::Real11
X::Phaser::PrePost11
X::Proc::Async::CharsOrBytes11
X::Proc::Async::TapBeforeSpawn11
X::Str::Numeric11
X::TypeCheck::Splice11
Block55
Callable22
Channel55
Collation11
Date1616
Endian11
FatRat11
Format55
Formatter22
IO::Spec::Cygwin99
IO::Spec::QNX33
Match1414
Metamodel::DefiniteHOW33
Metamodel::EnumHOW11
Metamodel::Naming11
Metamodel::RolePunning11
Metamodel::Versioning22
Numeric11
ObjAt11
Proc::Async22
Proxy11
PseudoStash11
Rat44
Regex22
Routine::WrapHandle11
Slip44
Stash11
Submethod11
Systemic22
Test11
X::Channel::ReceiveOnClosed11
X::Channel::SendOnClosed11
X::Constructor::Positional11
X::Control11
X::ControlFlow::Return11
X::Eval::NoSuchLang11
X::Method::InvalidQualifier11
X::Mixin::NotComposable11
X::NoDispatcher11
X::Numeric::CannotConvert11
X::OutOfRange11
X::Proc::Async::AlreadyStarted11
X::Proc::Async::MustBeStarted11
X::Proc::Async::OpenForWriting11
X::Str::Match::x11
X::Temporal::InvalidFormat11
X::TypeCheck::Assignment11
X::TypeCheck::Binding11
X::TypeCheck::Return11
utf811

Operators

Each dot is the same expression run on both engines. Every operator that parses is listed, worst first — so the disagreements cluster at the top and the rest runs green.

Operatornagreedifferboth rejectoutcome
but infix7421
... infix752
^ prefix6411
∪ infix761
⊎ infix761
⊖ infix761
temp prefix615
let prefix615
coll infix761
unicmp infix761
!= infix761
≠ infix761
** infix7601
? prefix660
! prefix660
+ prefix6501
- prefix6501
~ prefix660
| prefix660
+^ prefix6501
~^ prefix606
?^ prefix660
. infix707
* infix7601
/ infix7502
div infix7502
% infix7502
%% infix7502
mod infix7502
+& infix7601
+< infix7601
+> infix7601
~& infix770
~< infix707
~> infix707
?& infix770
gcd infix7601
lcm infix7601
+ infix7601
- infix7601
+| infix7601
+^ infix7601
~| infix770
~^ infix770
?^ infix770
?| infix770
x infix7601
xx infix7601
~ infix770
o infix707
∘ infix707
& infix770
∩ infix770
⊍ infix770
| infix770
∖ infix770
^ infix770
does infix707
cmp infix770
leg infix770
<=> infix7601
.. infix770
..^ infix770
^.. infix770
^..^ infix770
== infix7601
⩵ infix7601
< infix7601
<= infix7601
≤ infix7601
> infix7601
>= infix7601
≥ infix7601
eq infix770
ne infix770
gt infix770
ge infix770
lt infix770
le infix770
before infix770
after infix770
eqv infix770
=== infix770
⩶ infix770
=:= infix770
~~ infix770
=~= infix7601
≅ infix7601
∈ infix770
∉ infix770
≡ infix770
≢ infix770
∋ infix770
∌ infix770
⊂ infix770
⊄ infix770
⊆ infix770
⊈ infix770
⊃ infix770
⊅ infix770
⊇ infix770
⊉ infix770
≼ infix707
≽ infix707
&& infix770
|| infix770
^^ infix770
// infix770
min infix770
max infix770
minmax infix770
ff infix770
^ff infix770
ff^ infix770
^ff^ infix770
fff infix770
^fff infix770
fff^ infix770
^fff^ infix770
=> infix770
not prefix660
so prefix660
: infix707
Z infix770
X infix770
and infix770
andthen infix770
notandthen infix770
or infix770
orelse infix770
xor infix770
==> infix707
! infix707