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 9552026-07-252026-09-03

Types

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

TypenagreeR++docrkalloutcome
Cool99623223
routines51261817
Any96743629
IO::CatHandle21156
List100812314
Str8971481
Baggy33192224
Enumeration16414
Pair30193312
DateTime32232511
BagHash1131313
Code16814
IO::Handle124213
Mu33253112
Parameter2517413
Promise91311
Range3527312
Hash3427312
IO::Path342713
Iterator1811311
Dateish272124
Instant642
Setty15923
Array252022
Attribute151012
Bag8314
Label6123
Map161122
Seq1381
Signature514
Supply20153
Blob141013
Bool95121
Buf171321
Capture161211
Failure1062
IO::Spec::Win322117211
Junction1814112
Mix841111
MixHash7331
Nil10631
Routine62112
SetHash117121
Sub5121
Backtrace312
CompUnit::Repository::Installation3
Compiler33
Grammar412
Int14111
Metamodel::ClassHOW413
Scalar12921
Set8521
Thread31
Unicode312
Allomorph5311
Associative4211
CallFrame21
CompUnit::Repository::FileSystem31
Complex17152
ComplexStr21
IO::Spec::Unix181611
Kernel312
Metamodel::MethodDelegation21
Metamodel::Mixins312
Metamodel::ParametricRoleGroupHOW22
Metamodel::ParametricRoleHOW22
Metamodel::Stashing22
Metamodel::TypePretense211
QuantHash312
Real42
Sequence2
ValueObjAt211
Variable421
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::MultipleInheritance1
Metamodel::PackageHOW11
Metamodel::Primitives11
Method43
Num981
NumStr211
Positional11
PositionalBindFailover21
Proc::Async211
Proc21
PseudoStash11
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
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
+ prefix6411
- prefix6411
infix761
infix761
infix761
temp prefix615
let prefix615
does infix716
coll infix761
unicmp infix761
!= infix761
infix761
min infix761
andthen infix761
** infix7601
? prefix660
! prefix660
~ 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