Three things to try. Each one takes ten seconds, and each one is exactly what Refledger does.
1
A tag is a pointer. Go on, move it.
This is the whole attack. It takes one second, and nothing in your repository changes.
Your next CI run
The ledger
2
We watch for it, every five minutes.
Instrument clock, UTC
3
Every move is signed and chained.
Each entry includes the hash of the one before it. Change one byte anywhere, and every entry after it stops matching. That is why nobody, including us, can quietly rewrite the record.
4
This page works the same way.
Look at the margin. Each section above is hashed with SHA-256 in your browser and chained to the one before. Edit any word and see where the chain breaks.
What we watch, and why
Heavily used official actions from GitHub, AWS, Azure and others.
Actions involved in real incidents.
Everything those actions pull in themselves, at every tag.
One canary of our own, moved on purpose to test the instrument.
Don't trust us. Check us.
Replay the whole ledger in your browser, recompute every hash, and check every signature.
{"genesisMs":1790708024590,"nowMs":1791029897079,"wallRows":["reviewdog/action-actionlint","actions/checkout","actions/setup-node","actions/setup-python","actions/setup-go","actions/setup-java","actions/setup-dotnet"],"events":[{"h":0,"text":"Genesis. Watching begins."},{"h":5.1042805555555555,"text":"Day sealed and witnessed."},{"h":10.235791666666668,"text":"Canary test: tag deleted (GautamTalksDev/canary v3.0.0)."},{"h":29.104280555555555,"text":"Day sealed and witnessed."},{"h":30.221059722222222,"text":"Canary test: deleted tag came back, pointing somewhere new (GautamTalksDev/canary v3.0.0)."},{"h":30.221059722222222,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v1.0.0)."},{"h":31.415240277777777,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.2)."},{"h":31.415240277777777,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.1)."},{"h":31.415240277777777,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.0)."},{"h":33.403330833333335,"text":"Canary test: floating tag moved forward to a new release (GautamTalksDev/canary v1)."},{"h":37.404672222222224,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v1.0.0)."},{"h":41.40363305555555,"text":"Canary test: commit rewritten, same files (GautamTalksDev/canary v1.0.1)."},{"h":45.406615,"text":"Canary test: tag type changed, same commit (GautamTalksDev/canary v2)."},{"h":49.40262444444444,"text":"Canary test: tag type changed, same commit (GautamTalksDev/canary v2)."},{"h":53.104280555555555,"text":"Day sealed and witnessed."},{"h":53.40934,"text":"Canary test: tag deleted (GautamTalksDev/canary v3.0.0)."},{"h":57.40449777777778,"text":"Canary test: deleted tag came back, pointing somewhere new (GautamTalksDev/canary v3.0.0)."},{"h":58.57260888888889,"text":"floating tag moved forward to a new release (reviewdog/action-actionlint v1)."},{"h":61.40408222222222,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.2)."},{"h":61.40408222222222,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.1)."},{"h":61.40408222222222,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.0)."},{"h":65.40598527777777,"text":"Canary test: floating tag moved forward to a new release (GautamTalksDev/canary v1)."},{"h":69.40704166666667,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v1.0.0)."},{"h":73.41656416666666,"text":"Canary test: commit rewritten, same files (GautamTalksDev/canary v1.0.1)."},{"h":74.86394694444445,"text":"Canary test: tag type changed, same commit (GautamTalksDev/canary v2)."},{"h":77.10428055555556,"text":"Day sealed and witnessed."},{"h":77.40593472222223,"text":"Canary test: tag type changed, same commit (GautamTalksDev/canary v2)."},{"h":81.4058225,"text":"Canary test: tag deleted (GautamTalksDev/canary v3.0.0)."},{"h":85.40760083333333,"text":"Canary test: deleted tag came back, pointing somewhere new (GautamTalksDev/canary v3.0.0)."},{"h":89.40902472222223,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.2)."},{"h":89.40902472222223,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.1)."},{"h":89.40902472222223,"text":"Canary test: code changed under an exact version (GautamTalksDev/canary v9.0.0)."},{"h":89.40902472222223,"text":"Now."}],"gapStartH":null,"gapEndH":null,"firstRowMoveH":58.57260888888889,"canaryDotHs":[10.235791666666668,30.221059722222222,30.221059722222222,31.415240277777777,31.415240277777777,31.415240277777777,33.403330833333335,37.404672222222224,41.40363305555555,45.406615,49.40262444444444,53.40934,57.40449777777778,61.40408222222222,61.40408222222222,61.40408222222222,65.40598527777777,69.40704166666667,73.41656416666666,74.86394694444445,77.40593472222223,81.4058225,85.40760083333333,89.40902472222223,89.40902472222223,89.40902472222223],"actionCount":38,"repositoryCount":35}