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 9572026-07-252026-09-17

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
routines51261816
Any96744727
IO::CatHandle21156
List100812314
Str8971481
Baggy33203114
Enumeration164113
Pair3020332
DateTime3223261
BagHash113413
Code16814
IO::Handle12423
Parameter25174112
Promise9141
Range3527312
IO::Path342713
Iterator1811311
Mu3326312
Bag8251
Dateish272124
Hash3428122
Instant642
SetHash1151221
Setty159122
Array252022
Attribute151012
Bool941112
Label6123
MixHash7241
Seq1381
Signature514
Blob141022
Buf17133
Capture161211
Failure1062
IO::Spec::Win322117211
Junction1814112
Map161221
Mix841111
Nil10631
Routine62112
Sub5121
Supply20162
Backtrace312
CompUnit::Repository::Installation3
Compiler33
Grammar412
Int14111
Metamodel::ClassHOW413
Scalar12921
Thread31
Unicode312
Allomorph5311
Associative4211
CallFrame21
CompUnit::Repository::FileSystem31
Complex17152
ComplexStr21
IO::Spec::Unix181611
Kernel3111
Metamodel::MethodDelegation21
Metamodel::ParametricRoleGroupHOW22
Metamodel::ParametricRoleHOW22
Metamodel::Stashing22
Metamodel::TypePretense211
QuantHash312
Real421
Sequence2
Set8611
ValueObjAt211
Variable422
WhateverCode21
X::Bind::Slice22
Backtrace::Frame11
Collation11
Exception211
ForeignCode11
HyperSeq11
HyperWhatever431
IO::Path::Parts431
IO::Special321
IntStr211
Iterable541
Lock211
Match14131
Metamodel::C3MRO211
Metamodel::ConcreteRoleHOW11
Metamodel::MethodContainer211
Metamodel::Mixins321
Metamodel::MultipleInheritance1
Metamodel::PackageHOW11
Metamodel::Primitives11
Method43
Num981
NumStr211
Positional11
PositionalBindFailover21
Proc::Async211
Proc21
RaceSeq11
RatStr211
Rational431
Signal11
Slip431
StrDistance541
Version1091
Whatever431
X::AdHoc11
X::Assignment::RO11
X::Cannot::Empty11
X::ControlFlow::Return11
X::ControlFlow11
X::Dynamic::NotFound11
X::Method::InvalidQualifier11
X::Numeric::DivideByZero11
X::Numeric::Real11
X::OutOfRange11
X::Phaser::PrePost11
X::Proc::Async::CharsOrBytes11
X::Proc::Async::MustBeStarted11
X::Proc::Async::OpenForWriting11
X::Proc::Async::TapBeforeSpawn11
X::Str::Numeric11
X::TypeCheck::Splice11
Block55
Callable22
Channel55
Date1616
Endian11
FatRat11
Format55
Formatter22
IO::Spec::Cygwin99
IO::Spec::QNX33
Metamodel::DefiniteHOW33
Metamodel::EnumHOW11
Metamodel::Naming11
Metamodel::RolePunning11
Metamodel::Versioning22
Numeric11
ObjAt11
Proxy11
PseudoStash11
Rat44
Regex22
Routine::WrapHandle11
Stash11
Submethod11
Systemic22
Test11
X::Channel::ReceiveOnClosed11
X::Channel::SendOnClosed11
X::Constructor::Positional11
X::Control11
X::Eval::NoSuchLang11
X::Mixin::NotComposable11
X::NoDispatcher11
X::Numeric::CannotConvert11
X::Proc::Async::AlreadyStarted11
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 infix734
... infix743
^ prefix6321
∪ infix761
⊎ infix761
⊖ infix761
temp prefix615
let prefix615
does infix716
coll infix761
unicmp infix761
!= infix761
≠ infix761
min infix761
andthen 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
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
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
notandthen infix770
or infix770
orelse infix770
xor infix770
==> infix707
! infix707