Pranjal Sailwal

recovering from log

  1. seq 0000recovering from log

Receipts.

Every figure on this site is a row here. Each one says where it comes from, the command that reproduces it, the day it was last checked, and its place in the hash chain that seals all 48 . Change one figure and every seal after it stops matching.

proven
Someone else can re-run it or read it in a public repo or document.
documented
I wrote it down in a repo or a public document, but you cannot re-run it from there.
my word
My statement. There is no proof of it in the repository.

Chain root 8c2da25d685457eaf877426524fb0e593452f1b6cd7eb7c18d8177c20d43207c. Re-check it with node scripts/ledger-seal.mjs --check, or with the button below. The one-page summary is the brief.

Showing 49 of 49 claims.

  1. 68unit and integration tests

    nitrodb.tests

    Source

    NitroDB / nitrodb-core/src/test

    68 @Test methods counted in the folder. The README reports 0 failures on 2026-06-05.

    Open the source

    Evidence
    How to reproduce

    In a clone of NitroDB at f86067b:

    grep -rhoE "@Test\b" nitrodb-core/src/test | wc -l

    It prints 68.

    Counts the tests. It does not run them: that needs JDK 25 and Maven (mvn verify).

    Last verified
    , by running the step above
    Chain entry

    Entry 0 of the hash chain.

    seal 736c98ba4ce607361f79153f8dc3a5e1cf07528bc054b1b5c6a75e6fb06d3e69

    after 0000000000000000000000000000000000000000000000000000000000000000

  2. 42concurrency outcomes checked, 0 failed

    nitrodb.jcstress

    Source

    NitroDB / docs/Architecture-and-Design.md, Verified Baseline

    Run on 2026-06-05 with scripts/stress.ps1. The suite is in the repo (nitrodb-jcstress); the result is recorded in the doc and I have not re-run it here.

    Open the source

    Evidence
    How to reproduce

    In a clone of NitroDB at f86067b:

    grep -n "42 passed, 0 failed" docs/Architecture-and-Design.md

    The output includes 42 passed, 0 failed.

    Reads the recorded result. To re-run it: scripts/stress.ps1 with JDK 25 and Maven. Not re-run here.

    Last verified
    , by reading the source
    Chain entry

    Entry 1 of the hash chain.

    seal 87abc42d268c74a355f58106cf63e35869bc412edc633f5254bbd12f675151c2

    after 736c98ba4ce607361f79153f8dc3a5e1cf07528bc054b1b5c6a75e6fb06d3e69

  3. 2.25Mpoint reads a second in a one-iteration smoke run

    nitrodb.benchmarks

    Source

    NitroDB / docs/Architecture-and-Design.md, Performance Discussion

    One warm-up, one measurement, one fork, Java 25. The doc itself calls these smoke-test results, not a controlled performance study.

    Open the source

    Evidence
    How to reproduce

    In a clone of NitroDB at f86067b:

    grep -n "ReadBenchmark.pointRead" docs/Architecture-and-Design.md

    The output includes 2254766.463 ops/s.

    Reads the recorded number. The doc calls its results smoke tests, not a performance study.

    Last verified
    , by reading the source
    Chain entry

    Entry 2 of the hash chain.

    seal 0a31470088637264bab94a5790717257a4d8bfa89807ad9b3050ae99dbcc4c44

    after 87abc42d268c74a355f58106cf63e35869bc412edc633f5254bbd12f675151c2

  4. 1 nodeno replication, no compression, no TTL

    nitrodb.limits

    Source

    NitroDB / docs/Architecture-and-Design.md, Current Limitations

    Stated by the project itself.

    Open the source

    Evidence
    How to reproduce

    In a clone of NitroDB at f86067b:

    grep -n -E "single-node only|no replication|no compression|no TTL" docs/Architecture-and-Design.md

    The output includes no TTL feature.

    Last verified
    , by reading the source
    Chain entry

    Entry 3 of the hash chain.

    seal 9a618e6c19fa77c0214e8a34bc9dee5d4bc737de4ebbced02db33b2cbcf6a15f

    after 0a31470088637264bab94a5790717257a4d8bfa89807ad9b3050ae99dbcc4c44

  5. 53API route handlers

    aetherscan.routes

    Source

    AetherScan / backend

    Counted @router / @app route decorators in the backend folder.

    Open the source

    Evidence
    How to reproduce

    In a clone of AetherScan at 04404e5:

    grep -rhoE "@(router|app)\.(get|post|put|delete|patch)\(" backend --include=*.py | wc -l

    It prints 53.

    Last verified
    , by running the step above
    Chain entry

    Entry 4 of the hash chain.

    seal aab82e0d8cdfa57f01b64eb1cb9f3e0b5c0b0adc4a435d8e3af743ba01934277

    after 9a618e6c19fa77c0214e8a34bc9dee5d4bc737de4ebbced02db33b2cbcf6a15f

  6. 11data sources, each with licence, rate limit and how provenance is kept

    aetherscan.sources

    Source

    AetherScan / docs/DATA_SOURCE_REGISTRY.md

    Open the source

    Evidence
    How to reproduce

    In a clone of AetherScan at 04404e5:

    grep -c '^| \*\*' docs/DATA_SOURCE_REGISTRY.md

    It prints 11.

    Last verified
    , by running the step above
    Chain entry

    Entry 5 of the hash chain.

    seal 983ea3c87b4a44f2979592397e69415ba56f0d9d1c370934b6f4f0451c1e23be

    after aab82e0d8cdfa57f01b64eb1cb9f3e0b5c0b0adc4a435d8e3af743ba01934277

  7. 12backend test files, each named test_*.py

    aetherscan.tests

    Source

    AetherScan / backend/tests

    12 files named test_*.py. The folder holds 14 Python files; two of them (probe_cdse.py and probe_ogd_earthdata.py) are probe scripts, not tests, so they are not counted.

    Open the source

    Evidence
    How to reproduce

    In a clone of AetherScan at 04404e5:

    find backend/tests -name "test_*.py" | wc -l

    It prints 12.

    Counts files. It does not run them: that needs the project's Python environment.

    Last verified
    , by running the step above
    Chain entry

    Entry 6 of the hash chain.

    seal 916f734a94141fc7ec29d6616908abef014d27d650cc5975ef24be7f36abef72

    after 983ea3c87b4a44f2979592397e69415ba56f0d9d1c370934b6f4f0451c1e23be

  8. 0 speed-upthe quantum module runs on a classical simulator

    aetherscan.quantum

    Source

    AetherScan / docs/LIMITATIONS.md

    Stated by the project: no actual quantum speed-up occurs, and the method has not been benchmarked against classical baselines.

    Open the source

    Evidence
    How to reproduce

    In a clone of AetherScan at 04404e5:

    grep -n "No actual quantum speedup" docs/LIMITATIONS.md

    The output includes No actual quantum speedup occurs.

    Last verified
    , by reading the source
    Chain entry

    Entry 7 of the hash chain.

    seal 4273e887e6c0e9a76968e51ec0d9e2456ac7dfe987185ee30191b5a75d2f3926

    after 916f734a94141fc7ec29d6616908abef014d27d650cc5975ef24be7f36abef72

  9. 10 to 20%gap between sensors placed side by side

    aetherscan.disagreement

    Source

    Pranjal's own observation while reading the data

    Not stated in the repository or its docs. The project exists because of this gap, but the figure itself is my word.

    How to reproduce

    Nothing to run. This one is my word.

    No file in the repository states this range. It is Pranjal's own reading of the data.

    Last verified
    Never. There is nothing to check it against.
    Chain entry

    Entry 8 of the hash chain.

    seal 6f0b2473fe99fc7c4160d22aa92e923c110dae4d460acbc238568e40270dca1d

    after 4273e887e6c0e9a76968e51ec0d9e2456ac7dfe987185ee30191b5a75d2f3926

  10. 4people on the team, about 1,050 developer-hours, Pranjal as backend lead

    aetherscan.team

    Source

    Pranjal's statement

    The commit history shows three author names and cannot confirm team size, hours or role.

    How to reproduce

    Nothing to run. This one is my word.

    git shortlog lists three author names; it cannot confirm team size, hours or role.

    Last verified
    Never. There is nothing to check it against.
    Chain entry

    Entry 9 of the hash chain.

    seal b0a0f6514a4739492e02fc126c420feb4453fcbf09ef8df697232eb8f9539bd3

    after 6f0b2473fe99fc7c4160d22aa92e923c110dae4d460acbc238568e40270dca1d

  11. 98.1%of the cost increase happened after the click

    growth.onelever

    Source

    Growth Lab / docs/growth_playbook.md, line 52

    Open the source

    How to reproduce

    In a clone of Growth-Campaign-Funnel-Intelligence-Lab at b03de2e:

    node -e "const d=require('./data/dashboard_data.json').decomposition;console.log((d.conv_effect/d.cost_gap*100).toFixed(1))"

    It prints 98.1.

    Last verified
    , by running the step above
    Chain entry

    Entry 10 of the hash chain.

    seal 9fe9228dc233c3a1974e2a0f832b25b28187cb313abe3fd9c650b4453482f03c

    after b0a0f6514a4739492e02fc126c420feb4453fcbf09ef8df697232eb8f9539bd3

  12. 19.2xmore spend in the larger campaign

    growth.spend

    Source

    Growth Lab / data/dashboard_data.json

    Campaign 1178 spent $55,662.15 against $2,893.37 for campaign 936.

    Open the source

    Evidence
    How to reproduce

    In a clone of Growth-Campaign-Funnel-Intelligence-Lab at b03de2e:

    node -e "const s=Object.fromEntries(require('./data/dashboard_data.json').scorecard.map(r=>[r.campaign_id,r.total_spend]));console.log((s[1178]/s[936]).toFixed(1))"

    It prints 19.2.

    Last verified
    , by running the step above
    Chain entry

    Entry 11 of the hash chain.

    seal 4d0ed50ff59a47731686862949dc5fd85e6c1a1ea00d62d7b16760870b81d972

    after 9fe9228dc233c3a1974e2a0f832b25b28187cb313abe3fd9c650b4453482f03c

  13. 73.8%drop in post-click approved conversion

    growth.drop

    Source

    Growth Lab / data/dashboard_data.json

    Open the source

    Evidence
    How to reproduce

    In a clone of Growth-Campaign-Funnel-Intelligence-Lab at b03de2e:

    node -e "const d=require('./data/dashboard_data.json').decomposition;console.log(((1-d.target_metrics.click_to_approved_rate/d.base_metrics.click_to_approved_rate)*100).toFixed(1))"

    It prints 73.8.

    Last verified
    , by running the step above
    Chain entry

    Entry 12 of the hash chain.

    seal 3eeef54d651fed4706e414e5dd12ca60760d0f87b7594e4d19ca77ead2c2cf17

    after 4d0ed50ff59a47731686862949dc5fd85e6c1a1ea00d62d7b16760870b81d972

  14. 44tests

    growth.tests

    Source

    Growth Lab / tests

    44 test_ functions counted.

    Open the source

    How to reproduce

    In a clone of Growth-Campaign-Funnel-Intelligence-Lab at b03de2e:

    grep -rhoE "def test_" . --include=*.py | wc -l

    It prints 44.

    Counts test functions. It does not run them.

    Last verified
    , by running the step above
    Chain entry

    Entry 13 of the hash chain.

    seal 6b6027939f00e6bcc3d444210e1ad0a373eddbf45d7154d190624d8bdd6afbd5

    after 3eeef54d651fed4706e414e5dd12ca60760d0f87b7594e4d19ca77ead2c2cf17

  15. 100%public data, no confidential company figures

    growth.public

    Source

    Growth Lab / README, line 59

    Open the source

    How to reproduce

    In a clone of Growth-Campaign-Funnel-Intelligence-Lab at b03de2e:

    grep -n "100% public datasets" README.md

    The output includes 100% public datasets.

    Last verified
    , by reading the source
    Chain entry

    Entry 14 of the hash chain.

    seal 96582ebf3e089757f8a884c84f2310209a6375773166d8e4ce2a63efa8f0e572

    after 6b6027939f00e6bcc3d444210e1ad0a373eddbf45d7154d190624d8bdd6afbd5

  16. 11 of 11planted changes caught in a live pass, no false positives

    guard.caught

    Source

    Migration Guard / README, regression coverage table (line 403)

    The README's regression-coverage table records a pass against a dedicated Appwrite Cloud project: each planted change and the exact finding reported. Nobody else can re-run it without that project, so it is documented, not proven. The credential-free fault-injection suite (go test ./lab/...) is a separate, re-runnable check.

    Open the source

    Evidence
    How to reproduce

    In a clone of appwrite-migration-guard at 025a554:

    grep -n "no false positives, no missed findings" README.md

    The output includes no false positives, no missed findings.

    Reads the recorded result. Re-running it needs a dedicated Appwrite Cloud project with the acceptance fixture, which is not public: documented, not proven.

    Last verified
    , by reading the source
    Chain entry

    Entry 15 of the hash chain.

    seal 91efafef3437e6d9219c5d3ab6daeb940fe71d2e1881d2fc5385a56f311d5782

    after 96582ebf3e089757f8a884c84f2310209a6375773166d8e4ce2a63efa8f0e572

  17. 8commands, all working against live Appwrite Cloud

    guard.commands

    Source

    Migration Guard / README, status note

    Open the source

    Evidence
    How to reproduce

    In a clone of appwrite-migration-guard at 025a554:

    grep -c '{Name: "' internal/cli/cli.go

    It prints 8.

    Counts the commands in the code. That they all work against live Appwrite Cloud is the README's statement and was not re-run.

    Last verified
    , by reading the source
    Chain entry

    Entry 16 of the hash chain.

    seal 5d7d4a1e46e279ee71ccc36e56bee5bdf2eadaab46297455c0902f948b039a1d

    after 91efafef3437e6d9219c5d3ab6daeb940fe71d2e1881d2fc5385a56f311d5782

  18. 0passwords, emails or environment variables collected

    guard.collected

    Source

    Migration Guard / README, Limitations

    Open the source

    Evidence
    How to reproduce

    In a clone of appwrite-migration-guard at 025a554:

    grep -n "never collects or compares" README.md

    The output includes never collects or compares.

    Last verified
    , by reading the source
    Chain entry

    Entry 17 of the hash chain.

    seal fb52773b70e3b489bb612ba767e4c4f275c5a62f91f8f0797b6a46cbec6e1f6b

    after 5d7d4a1e46e279ee71ccc36e56bee5bdf2eadaab46297455c0902f948b039a1d

  19. pre-alphathe project's own status

    guard.status

    Source

    Migration Guard / README, status note

    Open the source

    Evidence
    How to reproduce

    In a clone of appwrite-migration-guard at 025a554:

    grep -n "Status: pre-alpha" README.md

    The output includes Status: pre-alpha.

    Last verified
    , by reading the source
    Chain entry

    Entry 18 of the hash chain.

    seal 87ae3bf6a028529d7bf14ba0a7b8c10257f941c3812ba27c5d96a631a07979a7

    after fb52773b70e3b489bb612ba767e4c4f275c5a62f91f8f0797b6a46cbec6e1f6b

  20. 31pytest tests

    neurotract.tests

    Source

    NeuroTract / tests

    31 test_ functions counted.

    Open the source

    How to reproduce

    In a clone of Neurotract at 7012ace:

    grep -rhoE "def test_" . --include=*.py | wc -l

    It prints 31.

    Counts test functions. It does not run them.

    Last verified
    , by running the step above
    Chain entry

    Entry 19 of the hash chain.

    seal 4b7d4e761e417c9c6df0b8d32333602923a68a95e5ace2badfb1bae5dd373365

    after 87ae3bf6a028529d7bf14ba0a7b8c10257f941c3812ba27c5d96a631a07979a7

  21. livejob progress streamed to the browser as server-sent events

    neurotract.progress

    Source

    NeuroTract / src/backend/api/server.py, lines 215 to 217

    Open the source

    Evidence
    How to reproduce

    In a clone of Neurotract at 7012ace:

    grep -n "text/event-stream" src/backend/api/server.py

    The output includes text/event-stream.

    Last verified
    , by reading the source
    Chain entry

    Entry 20 of the hash chain.

    seal b44b13a6c8db0c98dd065e529053627a356185d69762ebaffc665d41bbb28452

    after 4b7d4e761e417c9c6df0b8d32333602923a68a95e5ace2badfb1bae5dd373365

  22. sha-256dataset checksums stored with every result

    neurotract.checksums

    Source

    NeuroTract / src/backend/api/server.py, line 776

    Open the source

    Evidence
    How to reproduce

    In a clone of Neurotract at 7012ace:

    grep -n "dataset_checksums=val_report.checksums_sha256" src/backend/api/server.py

    The output includes dataset_checksums=val_report.checksums_sha256.

    Last verified
    , by reading the source
    Chain entry

    Entry 21 of the hash chain.

    seal 23fda8ed1f13ffec829bd76574a77bb716d3c14fd16d0b8fba85ff94573890c0

    after b44b13a6c8db0c98dd065e529053627a356185d69762ebaffc665d41bbb28452

  23. 1.81Msamples a second, checked against an analytical answer

    spectral.throughput

    Source

    Preprint on ResearchGate

    Stated in the preprint. The repository has no benchmark script, so nobody can reproduce the number from it.

    Open the source

    Evidence
    How to reproduce

    Nothing to run. It cannot be reproduced from the repository.

    The repository has no benchmark script or recorded run for this figure, so nobody can reproduce it from there. The number is the preprint's.

    Last verified
    Never. No step could confirm it.
    Chain entry

    Entry 22 of the hash chain.

    seal 8c444f1fdd0f2138f4565aad3d79f69eca6e2785dd1ebbcb418e0cb74d871243

    after 23fda8ed1f13ffec829bd76574a77bb716d3c14fd16d0b8fba85ff94573890c0

  24. BVHbounding-volume hierarchy for ray traversal

    spectral.bvh

    Source

    spectral-monte-carlo-raytracer / spectral_raytracer.cpp, class BVHNode

    Open the source

    How to reproduce

    In a clone of spectral-monte-carlo-raytracer at d8fa178:

    grep -n "class BVHNode" spectral_raytracer.cpp

    The output includes class BVHNode.

    Last verified
    , by reading the source
    Chain entry

    Entry 23 of the hash chain.

    seal d5e4989c84393ee79afe3a5137583d2f30066c43554465401b39c1eea16bcea9

    after 8c444f1fdd0f2138f4565aad3d79f69eca6e2785dd1ebbcb418e0cb74d871243

  25. 12wavelengths sampled from 380 to 780 nm

    geodesic.wavelengths

    Source

    Lightweight-Spectro-Geodesic-Explorer / README

    Open the source

    How to reproduce

    In a clone of Lightweight-Spectro-Geodesic-Explorer at 5a22d6c:

    grep -n "wavelength sampling" README.md

    The output includes wavelength sampling (380-780nm).

    Last verified
    , by reading the source
    Chain entry

    Entry 24 of the hash chain.

    seal fec719d4a09bfd0fe459ddb712f6133f1764964ac82dd7e541a1266232206047

    after d5e4989c84393ee79afe3a5137583d2f30066c43554465401b39c1eea16bcea9

  26. 1.2 sto compute on the fast preset of a 12th-gen i5 (the README's table: about 2.1 s on medium, 5.3 s on high)

    geodesic.speed

    Source

    Lightweight-Spectro-Geodesic-Explorer / README, Performance Optimization table

    The README also says under 2 s in its feature list; its own table shows that holds for the fast preset only.

    Open the source

    Evidence
    How to reproduce

    In a clone of Lightweight-Spectro-Geodesic-Explorer at 5a22d6c:

    grep -n "Fast preset" README.md

    The output includes ~1.2s.

    The README's own measurement on its author's machine; not re-measured here.

    Last verified
    , by reading the source
    Chain entry

    Entry 25 of the hash chain.

    seal a17671cd7f7ad215b956050f14ae7673983e8c46f2c8e4649768bc160edf435d

    after fec719d4a09bfd0fe459ddb712f6133f1764964ac82dd7e541a1266232206047

  27. 2preprints on ResearchGate about the geodesic tools: the wavelength-resolved explorer and the WebAssembly engine

    geodesic.preprints

    Source

    ResearchGate, publications 396446428 and 396176848

    The WebAssembly engine paper is https://www.researchgate.net/publication/396176848. ResearchGate refuses automated requests (HTTP 403 when this was checked on 2026-10-06), so no script could load the pages; the links are Pranjal's own record: documented, not proven.

    Open the source

    Evidence
    How to reproduce

    In this site's repository:

    node -e "const fs=require('fs');console.log(fs.readdirSync('src/content/writing').filter(f=>/geodesic/.test(f)&&require('./src/content/writing/'+f).outlet==='ResearchGate preprint').length)"

    The output includes 2.

    Counts the geodesic preprint entries this site records, each with its ResearchGate link. ResearchGate would not load for a script, so the pages themselves were not confirmed.

    Last verified
    , by reading the source
    Chain entry

    Entry 26 of the hash chain.

    seal f6d2c9e495a71211439164806bc0c6195a9fb8061b41a7774a30a80805d1c7aa

    after a17671cd7f7ad215b956050f14ae7673983e8c46f2c8e4649768bc160edf435d

  28. 4components: core library, service, GUI, CLI

    securehost.components

    Source

    SecureHost / README.md, Components (items 1 to 4; the optional kernel drivers are a fifth, not installed)

    Open the source

    Evidence
    How to reproduce

    In a clone of SecureHost-Control-Suite at 4935c79:

    grep -cE "^### [1-4]\. " README.md

    It prints 4.

    Last verified
    , by running the step above
    Chain entry

    Entry 27 of the hash chain.

    seal 8ab1dd6b5ede164c8148030668a5344213d2c74b7bb62c7961fe807698c4fd75

    after f6d2c9e495a71211439164806bc0c6195a9fb8061b41a7774a30a80805d1c7aa

  29. 3default policy rules

    securehost.rules

    Source

    SecureHost / DEVICE-CONTROL-AND-RESET.md, line 127

    Open the source

    Evidence
    How to reproduce

    In a clone of SecureHost-Control-Suite at 4935c79:

    grep -n "default rules" DEVICE-CONTROL-AND-RESET.md

    The output includes default rules.

    A doc statement; the rules are not defined as a list in code that a check could count.

    Last verified
    , by reading the source
    Chain entry

    Entry 28 of the hash chain.

    seal d3caa909b719275e7592453989ff76606c346cc48614d341a15415f093dbbaa7

    after 8ab1dd6b5ede164c8148030668a5344213d2c74b7bb62c7961fe807698c4fd75

  30. DPAPIpolicy storage encrypted with Windows data protection

    securehost.storage

    Source

    SecureHost / src/core/SecureHostCore/Storage/SecureStorage.cs

    Open the source

    Evidence
    How to reproduce

    In a clone of SecureHost-Control-Suite at 4935c79:

    grep -n "ProtectedData.Protect" src/core/SecureHostCore/Storage/SecureStorage.cs

    The output includes ProtectedData.Protect.

    Last verified
    , by reading the source
    Chain entry

    Entry 29 of the hash chain.

    seal 1bf646d27a64ffda83e3b7507500e4d5b663ffd8051323a70dabd349fdd07eea

    after d3caa909b719275e7592453989ff76606c346cc48614d341a15415f093dbbaa7

  31. YjsCRDT library behind the merging (integrated, not written from scratch)

    syncstate.crdt

    Source

    SyncState / package.json

    yjs, y-webrtc and y-indexeddb are the three dependencies that do the syncing and the offline storage.

    Open the source

    Evidence
    How to reproduce

    In a clone of syncstate at 6bb4482:

    grep -cE '"(yjs|y-webrtc|y-indexeddb)"' package.json

    It prints 3.

    Last verified
    , by running the step above
    Chain entry

    Entry 30 of the hash chain.

    seal 4dd92eab5817ce18c7a192f373a4f7a589a9dc16fb9ed52227cc7584ef4a6ce0

    after 1bf646d27a64ffda83e3b7507500e4d5b663ffd8051323a70dabd349fdd07eea

  32. 0automated tests in the repository

    syncstate.tests

    Source

    SyncState

    A limit, stated on purpose: no test files were found.

    Open the source

    Evidence
    How to reproduce

    In a clone of syncstate at 6bb4482:

    git ls-files | grep -ciE "(\.test\.|\.spec\.|__tests__)" || true

    It prints 0.

    Last verified
    , by running the step above
    Chain entry

    Entry 31 of the hash chain.

    seal e2a06a95bb8d0d5865100b4dc735659040d3dd79bfc5fa553b72e7d826a99feb

    after 4dd92eab5817ce18c7a192f373a4f7a589a9dc16fb9ed52227cc7584ef4a6ce0

  33. 71certificates: 70 with an online verification link, one with a credential ID only

    cv.certificates

    Source

    /certifications

    The PDFs are in the site's public certificates folder.

    Open it on this site

    Evidence
    • this site / src/content/credentials.json. each entry with verifyUrl, except one that has a credential ID only
    • /certifications. the PDFs are in public/certificates
    How to reproduce

    In this site's repository:

    node -e "const c=require('./src/content/credentials.json').certifications;console.log(c.length+' '+c.filter(x=>x.verifyUrl).length)"

    It prints 71 70.

    Last verified
    , by running the step above
    Chain entry

    Entry 32 of the hash chain.

    seal d03edfa4787411d7857d4b189e47bd0dc0835f69ae84e34ecfe613538c24c7d9

    after e2a06a95bb8d0d5865100b4dc735659040d3dd79bfc5fa553b72e7d826a99feb

  34. 19of them in project management

    cv.pm

    Source

    /certifications, filtered by category

    Open it on this site

    Evidence
    • this site / src/content/credentials.json. category project-management
    How to reproduce

    In this site's repository:

    node -e "console.log(require('./src/content/credentials.json').certifications.filter(x=>x.category==='project-management').length)"

    It prints 19.

    Last verified
    , by running the step above
    Chain entry

    Entry 33 of the hash chain.

    seal 76a266fadbc3a36e70eddb22e0f2fa2a21e4a38b5e5bc180da281873e8ab7f61

    after d03edfa4787411d7857d4b189e47bd0dc0835f69ae84e34ecfe613538c24c7d9

  35. B.Tech CSEGraphic Era Hill University, provisional certificate July 2026

    cv.degree

    Source

    Provisional certificate (personal details blacked out)

    The degree itself is awarded at the next convocation.

    Open it on this site

    Evidence
    • this site / public/certificates/provisional-certificate.pdf. a scan with personal details blacked out, dated July 2026
    How to reproduce

    In this site's repository:

    node -e "console.log(require('fs').existsSync('public/certificates/provisional-certificate.pdf'))"

    The output includes true.

    Confirms the file is published. It is an image scan, so a script cannot read its text; the degree is awarded at the next convocation.

    Last verified
    , by reading the source
    Chain entry

    Entry 34 of the hash chain.

    seal 1869b1b9c3f02365af47ab87fa7c90c2e1db7c518800389f543cbb823261c7f5

    after 76a266fadbc3a36e70eddb22e0f2fa2a21e4a38b5e5bc180da281873e8ab7f61

  36. 3 monthsPython programming internship at Yantra Byte; the certificate states the duration and a completion date of 1 April 2026

    cv.internship

    Source

    Internship certificate with a verification code

    Certificate number and verification code are printed on the page. The start month is not printed on it.

    Open it on this site

    Evidence
    • this site / public/certificates/Internship@YantraByte.pdf. states Python Programming internship at Yantra Byte, a duration and a completion date
    How to reproduce

    In this site's repository:

    pdftotext "public/certificates/Internship@YantraByte.pdf" -

    The output includes Duration: 3 Months.

    Needs pdftotext (poppler). The start month is not printed on the certificate.

    Last verified
    , by reading the source
    Chain entry

    Entry 35 of the hash chain.

    seal 7e52beb86e9eb980d033fcbff33ddf341ba48aa8e02b50e6d7c9786051b8fbc6

    after 1869b1b9c3f02365af47ab87fa7c90c2e1db7c518800389f543cbb823261c7f5

  37. 7.36 / 10CGPA over eight semesters, no backlogs

    cv.cgpa

    Source

    Statements of marks, semesters I to VIII, Graphic Era Hill University (provisional; name of parent, enrolment number and QR codes blacked out)

    The statements are marked provisional by the university, and the final CGPA is the one printed on the semester VIII sheet. The degree itself is awarded at the next convocation.

    Open it on this site

    Evidence
    • this site / public/certificates/semester-marksheets.pdf. the eight statements of marks with the parent's name, enrolment number and QR codes blacked out; the semester VIII sheet prints the CGPA
    • this site / src/content/academics.json. each semester's SGPA and credits, read from those statements
    How to reproduce

    In this site's repository:

    node -e "const a=require('./src/content/academics.json').semesters;const c=a.reduce((s,x)=>s+x.credits,0);console.log((a.reduce((s,x)=>s+x.sgpa*x.credits,0)/c).toFixed(2))"

    The output includes 7.36.

    Credit-weighted mean of the eight SGPAs in academics.json. It reproduces the CGPA printed on the semester VIII statement, to two decimals.

    Last verified
    , by reading the source
    Chain entry

    Entry 36 of the hash chain.

    seal 5ebccfc6ba963938e20e9d83728db2c9027e5d5c038a94873799b4df7bb0653a

    after 7e52beb86e9eb980d033fcbff33ddf341ba48aa8e02b50e6d7c9786051b8fbc6

  38. 10parametric surfaces to explore, from sphere to Klein bottle

    geodesic.surfaces

    Source

    Lightweight-Spectro-Geodesic-Explorer / index.html, surface menu

    Open the source

    How to reproduce

    In a clone of Lightweight-Spectro-Geodesic-Explorer at 5a22d6c:

    grep -c "<option value=" index.html

    It prints 10.

    Last verified
    , by running the step above
    Chain entry

    Entry 37 of the hash chain.

    seal 6d74116108018898e5cf9e232eea383a2c0ef2bc59b7de031f4283a01eed652a

    after 5ebccfc6ba963938e20e9d83728db2c9027e5d5c038a94873799b4df7bb0653a

  39. 4preprints on ResearchGate: AetherScan, the wavelength-resolved geodesic paper, the WebAssembly geodesic engine and the spectral path tracer

    writing.preprints

    Source

    ResearchGate, publications 404379263, 396446428, 396176848 and 395962866

    The others are https://www.researchgate.net/publication/396446428, https://www.researchgate.net/publication/396176848, https://www.researchgate.net/publication/395962866. ResearchGate refuses automated requests (HTTP 403 when this was checked on 2026-10-06), so no script could load the pages; the links are Pranjal's own record: documented, not proven.

    Open the source

    Evidence
    How to reproduce

    In this site's repository:

    node -e "const fs=require('fs');console.log(fs.readdirSync('src/content/writing').filter(f=>require('./src/content/writing/'+f).outlet==='ResearchGate preprint').length)"

    The output includes 4.

    Counts the entries this site records. The ResearchGate pages themselves were not loadable by a script.

    Last verified
    , by reading the source
    Chain entry

    Entry 38 of the hash chain.

    seal a66e607de150cd93adbfa879fa0bf5983001b6caf8e1b152200ca8069b6eb123

    after 6d74116108018898e5cf9e232eea383a2c0ef2bc59b7de031f4283a01eed652a

  40. 2dev logs on dev.to, each about why I made a choice

    writing.devlogs

    Source

    dev.to / sailwalpranjal

    Open the source

    Evidence
    How to reproduce

    In this site's repository:

    curl -s "https://dev.to/api/articles?username=sailwalpranjal&per_page=100"

    The output includes SyncState: writing together.

    Calls the public dev.to API and looks for one post title; the AetherScan post is in the same list.

    Last verified
    , by running the step above
    Chain entry

    Entry 39 of the hash chain.

    seal d3152ad22a8b83259e2274d54bf761aad771a4ff3bcc6fc3955801a571443bfc

    after a66e607de150cd93adbfa879fa0bf5983001b6caf8e1b152200ca8069b6eb123

  41. 9projects written up, each with its repository linked

    work.projects

    Source

    /work

    Counted from the project files; scripts/check-claims.mjs fails the build if this number goes stale.

    Open it on this site

    Evidence
    • this site / src/content/projects. one JSON file per project
    How to reproduce

    In this site's repository:

    ls src/content/projects/*.json | wc -l

    It prints 9.

    Last verified
    , by running the step above
    Chain entry

    Entry 40 of the hash chain.

    seal 542a8fb207c5d211e7ed4c7d4555aa6f9438f8317177cf6f51a9be1d3d606b64

    after d3152ad22a8b83259e2274d54bf761aad771a4ff3bcc6fc3955801a571443bfc

  42. 15documents in its docs folder, from the product brief to the limitations file

    aetherscan.docs

    Source

    AetherScan / docs

    Open the source

    How to reproduce

    In a clone of AetherScan at 04404e5:

    ls docs/*.md | wc -l

    It prints 15.

    Last verified
    , by running the step above
    Chain entry

    Entry 41 of the hash chain.

    seal b4cb18068f7db77b332adfb4ead907565405293ed7ef97931ab11f2d22ce5b91

    after 542a8fb207c5d211e7ed4c7d4555aa6f9438f8317177cf6f51a9be1d3d606b64

  43. 3design documents: a blueprint before the code, a verification matrix and an interview guide after

    nitrodb.docs

    Source

    NitroDB / BluePrint.md and docs/

    BluePrint.md at the root, plus Architecture-and-Design.md and Project-Understanding-and-Interview-Guide.md in docs.

    Open the source

    How to reproduce

    In a clone of NitroDB at f86067b:

    ls BluePrint.md docs/*.md | wc -l

    It prints 3.

    Last verified
    , by running the step above
    Chain entry

    Entry 42 of the hash chain.

    seal bc796806fcd9cfd9b7f8837451ec8f4faa4121ec9226cc849be1d5f093f45130

    after b4cb18068f7db77b332adfb4ead907565405293ed7ef97931ab11f2d22ce5b91

  44. 60,000writes in a recorded run of the real engine, drawn as its own SSTable files on each level, from the first flush to after compaction

    nitrodb.run

    Source

    scripts/data/NitroRun.java, run against NitroDB's own classes on 2026-10-05; the recording is src/content/data/nitrodb-run.json

    A recording, not the engine running in your browser. It reads the engine's own manifest while it flushes and compacts. The site's repository is not published yet, so the script cannot be re-run from a public place: documented, not proven.

    Open the source

    Evidence
    • this site / scripts/data/NitroRun.java. runs NitroDB's own classes and reads the engine's manifest while it flushes and compacts
    • this site / src/content/data/nitrodb-run.json. the recording, with the number of writes and the size of each value
    How to reproduce

    In this site's repository:

    node -e "const r=require('./src/content/data/nitrodb-run.json');console.log(r.writes)"

    The output includes 60000.

    Reads the recording. Re-running the Java script needs the NitroDB build and JDK 17, and this site's repository is not public yet, so it is documented, not proven.

    Last verified
    , by reading the source
    Chain entry

    Entry 43 of the hash chain.

    seal 8f8e9e8123d592e6c45f3679b399d0c27542f02c81609f7b4025acc3042e8177

    after bc796806fcd9cfd9b7f8837451ec8f4faa4121ec9226cc849be1d5f093f45130

  45. 226characters in the text two Yjs replicas merged to after 40 recorded steps, drawn as two threads that part and then braid. Yjs is the library SyncState builds on

    syncstate.run

    Source

    scripts/data/yjs-run.mjs, which runs Yjs 13.6.33; the recording is src/content/data/yjs-run.json

    A recording of the Yjs library, not of SyncState itself. Both replicas ended with the same text, and applying their states in either order gave the same result. Documented, not proven, because the script is not published yet.

    Open the source

    Evidence
    • this site / scripts/data/yjs-run.mjs. runs the Yjs library
    • this site / src/content/data/yjs-run.json
    How to reproduce

    In this site's repository:

    node -e "const y=require('./src/content/data/yjs-run.json');console.log(y.finalLength+' '+y.converged+' '+y.orderIndependent)"

    The output includes 226 true true.

    Reads the recording. Running node scripts/data/yjs-run.mjs rebuilt the same recording on 2026-10-06, but this site's repository is not public yet, so it is documented, not proven.

    Last verified
    , by running the step above
    Chain entry

    Entry 44 of the hash chain.

    seal aae970f195c72e4b459ac3491eccb12ac776d9fd4fc37509a0830f5b3481c963

    after 8f8e9e8123d592e6c45f3679b399d0c27542f02c81609f7b4025acc3042e8177

  46. 366days of Dehradun air quality from a file in my own files (PM2.5 from 5.4 to 155.3), drawn as a skyline that is tall in winter and low in the monsoon. The file states no source

    aetherscan.dehradun

    Source

    City_wise_raw_data_1Day_2024_Dehradun_1Day.csv in my files; scripts/data/dehradun.mjs turns it into src/content/data/dehradun-2024.json

    Daily readings for 2024. The CSV names a city and a year but no station or agency, so what produced it is not claimed.

    Open it on this site

    Evidence
    • this site / scripts/data/dehradun.mjs. turns the CSV into the JSON
    • this site / src/content/data/dehradun-2024.json. daily rows for 2024, with the lowest and highest PM2.5
    How to reproduce

    In this site's repository:

    node -e "const d=require('./src/content/data/dehradun-2024.json');console.log(d.days+' '+d.pm25.min+' '+d.pm25.max)"

    The output includes 366 5.42 155.33.

    Reads the processed file. The source CSV is in Pranjal's own files and is not published, so it is documented, not proven.

    Last verified
    , by reading the source
    Chain entry

    Entry 45 of the hash chain.

    seal c35efd9ba27314a191bcc9a90f19609bc2095c59b3ceda7814f8de54f3a0119c

    after aae970f195c72e4b459ac3491eccb12ac776d9fd4fc37509a0830f5b3481c963

  47. 27public repositories drawn as towers, taller for more code, coloured by language, with a bead on those pushed in the month before the latest push

    work.skyline

    Source

    GitHub, as the API reported it when the site was built (src/content/generated/github.json); two repositories are left off at my request and one fork is skipped

    A build-time snapshot of the GitHub API plus two repositories left off at my request and one fork skipped, so a visitor cannot re-derive 27 from GitHub alone. Data-driven forms stay documented until the site's repository is public.

    Open the source

    Evidence
    • this site / src/content/generated/github.json. GitHub API snapshot taken at build time
    • this site / src/lib/github.ts. the filter: no forks, no archived, two left off
    How to reproduce

    In this site's repository:

    node -e "const g=require('./src/content/generated/github.json');console.log(g.all.filter(r=>!r.fork&&!r.archived).length-2)"

    The output includes 27.

    Reads the snapshot and takes off the two repositories left out at Pranjal's request. Not derivable from GitHub alone.

    Last verified
    , by reading the source
    Chain entry

    Entry 46 of the hash chain.

    seal a800e2ff435b8c4a6a08cb36df2c6b894f697fc407df24e58630b8e46dd13fc1

    after c35efd9ba27314a191bcc9a90f19609bc2095c59b3ceda7814f8de54f3a0119c

  48. 48claims sealed in a hash chain: each seal is the SHA-256 of the one before it and the claim itself, and your browser re-checks the whole chain

    ledger.chain

    Source

    scripts/ledger-seal.mjs --check, and the same check running in your browser (src/lib/ledger/verify.ts)

    Change any sealed claim and every seal after it stops matching. Proven because anyone can re-run the check and see it fail.

    Open it on this site

    Evidence
    • this site / scripts/ledger-seal.mjs
    • this site / src/content/ledger.chain.json
    • this site / src/lib/ledger/verify.ts. the same arithmetic in the browser
    • this site / tests/ledger/seal.test.mjs
    How to reproduce

    In this site's repository:

    node scripts/ledger-seal.mjs --check

    The output includes ledger seal ok.

    Re-seals the claims in memory and compares with the file on disk; change any sealed figure and it fails.

    Last verified
    , by running the step above
    Chain entry

    Entry 47 of the hash chain.

    seal 03677947c3ceaf876db38517bf04b9dc944add6a36ed0ce1ca2fb386b3d9a2da

    after a800e2ff435b8c4a6a08cb36df2c6b894f697fc407df24e58630b8e46dd13fc1

  49. 185credits earned across eight semesters, every subject passed

    cv.credits

    Source

    Statements of marks, semesters I to VIII (credits registered equal credits earned in each)

    22 + 22 + 27 + 28 + 26 + 25 + 19 + 16.

    Open it on this site

    Evidence
    • this site / public/certificates/semester-marksheets.pdf. credits registered equal credits earned on every statement
    How to reproduce

    In this site's repository:

    node -e "console.log(require('./src/content/academics.json').semesters.reduce((s,x)=>s+x.credits,0))"

    The output includes 185.

    Sum of the credits earned per semester in academics.json.

    Last verified
    , by reading the source
    Chain entry

    Entry 48 of the hash chain.

    seal 8c2da25d685457eaf877426524fb0e593452f1b6cd7eb7c18d8177c20d43207c

    after 03677947c3ceaf876db38517bf04b9dc944add6a36ed0ce1ca2fb386b3d9a2da

Found a number that doesn't add up? Write to me.