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 9522026-07-252026-08-11

Types

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

TypenagreeR++docrkalloutcome
Cool996213114
routines51243827
Any967445210
IO::CatHandle2128
List100812216
Str8971482
Baggy33201215
Enumeration16416
Pair30193312
DateTime32232511
IO::Handle123314
BagHash113413
Code16814
Mu33253112
Parameter2517413
Promise91311
Range3527312
IO::Path342715
Iterator1811311
Map169114
Array251932
Dateish272124
Hash3428113
Instant642
SetHash1152211
Setty15923
Attribute151012
Bag8341
Bool94212
Seq1385
Signature514
Supply20153
Blob141013
Buf171321
Capture161211
Failure1062
IO::Spec::Win322117211
Junction181413
MixHash7313
Nil10631
Routine62112
Sub5121
Backtrace312
CompUnit::Repository::Installation3
Compiler32
Grammar412
Int14111
Label633
Metamodel::ClassHOW413
Mix85111
Scalar12921
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
Real421
Sequence21
Set8611
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::EnumHOW11
Metamodel::MethodContainer211
Metamodel::MultipleInheritance11
Metamodel::PackageHOW11
Metamodel::Primitives11
Method43
Num981
NumStr211
Positional11
PositionalBindFailover21
Proc21
Proc::Async211
PseudoStash11
RaceSeq11
RatStr211
Rational43
Signal11
Slip431
StrDistance541
Version1091
Whatever431
X::AdHoc11
X::Assignment::RO11
X::Cannot::Empty11
X::ControlFlow11
X::ControlFlow::Return11
X::Dynamic::NotFound11
X::Method::InvalidQualifier11
X::Numeric::DivideByZero11
X::Numeric::Real11
X::OutOfRange11
X::Phaser::PrePost11
X::Proc::Async::AlreadyStarted11
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::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::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
andthen infix761
coll infix761
does infix716
min infix761
mod infix7412
unicmp infix761
infix761
infix761
infix761
infix761
+ prefix6411
- prefix6411
let prefix615
temp prefix615
! infix707
% infix7502
%% infix7502
& infix770
&& infix770
* infix7601
** infix7601
+ infix7601
+& infix7601
+< infix7601
+> infix7601
+^ infix7601
+| infix7601
- infix7601
. infix707
.. infix770
..^ infix770
/ infix7502
// infix770
: infix707
< infix7601
<= infix7601
<=> infix7601
=:= infix770
== infix7601
=== infix770
==> infix707
=> infix770
=~= infix7601
> infix7601
>= infix7601
?& infix770
?^ infix770
?| infix770
X infix770
Z infix770
^ infix770
^.. infix770
^..^ infix770
^^ infix770
^ff infix770
^ff^ infix770
^fff infix770
^fff^ infix770
after infix770
and infix770
before infix770
cmp infix770
div infix7502
eq infix770
eqv infix770
ff infix770
ff^ infix770
fff infix770
fff^ infix770
gcd infix7601
ge infix770
gt infix770
lcm infix7601
le infix770
leg infix770
lt infix770
max infix770
minmax infix770
ne infix770
notandthen infix770
o infix707
or infix770
orelse infix770
x infix7601
xor infix770
xx infix7601
| infix770
|| infix770
~ infix770
~& infix770
~^ infix770
~| infix770
~~ infix770
infix770
infix770
infix770
infix770
infix770
infix707
infix770
infix7601
infix7601
infix7601
infix770
infix770
infix770
infix770
infix770
! prefix660
+^ prefix6501
? prefix660
?^ prefix660
not prefix660
so prefix660
| prefix660
~ prefix660
~^ prefix606