Something went wrong. Try again.
unified development activity
Something went wrong. Try again.
267 kB · 3939 lines
HTML
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940<!doctype html><html lang="en" data-theme="dark"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="color-scheme" content="dark light"> <title>commit activity</title> <meta name="description" content="Deduplicated commit activity for dev.permadeath.com across Tangled, didbot agents and GitHub."> <style>/* -------------------------------------------------------------------------- tally — a commit matrix with a red signal. The dark palette is the primary one. Light mode is a deliberate second theme, not an automatic inversion. -------------------------------------------------------------------------- */
:root { color-scheme: light; --surface-1: #fbf8f6; --surface-2: #f4eeeb; --page: #efe7e3; --ink: #160d0f; --ink-2: #5b4a4b; --muted: #8a7677; --grid: #e2d6d3; --axis: #c9b8b6; --border: rgba(22, 13, 15, 0.12); --border-strong: rgba(200, 16, 46, 0.35); --accent: #c8102e; --accent-soft: #8f0f22; --accent-dim: #f0c9cd; --track: #f0dcdc; --matrix-0: #ebe3e0; --matrix-1: #d98f97; --matrix-2: #c95a68; --matrix-3: #b83245; --matrix-4: #9e1f31; --matrix-5: #700a1a; --series-red: #c8102e; --series-1: #2a78d6; --series-2: #eb6834; --series-3: #1baf7a; --series-4: #eda100; --series-5: #e87ba4; --series-6: #008300; --series-7: #4a3aa7; --shadow: 0 18px 50px rgba(22, 13, 15, 0.10); --glow: 0 0 18px rgba(200, 16, 46, 0.18); --radius: 10px; --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; font-family: system-ui, -apple-system, "Segoe UI", sans-serif;}
@media (prefers-color-scheme: dark) { :root:where(:not([data-theme="light"])) { color-scheme: dark; --surface-1: #100b0c; --surface-2: #160f11; --page: #070506; --ink: #f4e9e7; --ink-2: #c3adae; --muted: #8a7375; --grid: #241417; --axis: #3a2427; --border: rgba(255, 43, 61, 0.14); --border-strong: rgba(255, 43, 61, 0.45); --accent: #ff2b3d; --accent-soft: #ff6b78; --accent-dim: #2a1114; --track: #2a1114; --matrix-0: #1a1113; --matrix-1: #8a1622; --matrix-2: #b01a2a; --matrix-3: #d92a3c; --matrix-4: #ff4d5e; --matrix-5: #ff9aa3; --series-red: #ff2b3d; --series-1: #3987e5; --series-2: #d95926; --series-3: #199e70; --series-4: #c98500; --series-5: #d55181; --series-6: #008300; --series-7: #9085e9; --shadow: 0 18px 60px rgba(0, 0, 0, 0.55); --glow: 0 0 24px rgba(255, 43, 61, 0.18); }}
:root[data-theme="dark"] { color-scheme: dark; --surface-1: #100b0c; --surface-2: #160f11; --page: #070506; --ink: #f4e9e7; --ink-2: #c3adae; --muted: #8a7375; --grid: #241417; --axis: #3a2427; --border: rgba(255, 43, 61, 0.14); --border-strong: rgba(255, 43, 61, 0.45); --accent: #ff2b3d; --accent-soft: #ff6b78; --accent-dim: #2a1114; --track: #2a1114; --matrix-0: #1a1113; --matrix-1: #8a1622; --matrix-2: #b01a2a; --matrix-3: #d92a3c; --matrix-4: #ff4d5e; --matrix-5: #ff9aa3; --series-red: #ff2b3d; --series-1: #3987e5; --series-2: #d95926; --series-3: #199e70; --series-4: #c98500; --series-5: #d55181; --series-6: #008300; --series-7: #9085e9; --shadow: 0 18px 60px rgba(0, 0, 0, 0.55); --glow: 0 0 24px rgba(255, 43, 61, 0.18);}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body { min-height: 100vh; color: var(--ink); background: radial-gradient(ellipse at 50% -10%, rgba(255, 43, 61, 0.10), transparent 55%), var(--page); font-size: 15px; line-height: 1.5; -webkit-font-smoothing: antialiased;}
:root[data-theme="light"] body { background: radial-gradient(ellipse at 50% -10%, rgba(200, 16, 46, 0.07), transparent 55%), var(--page);}
a { color: inherit; text-decoration-color: var(--axis); text-underline-offset: 3px;}a:hover { color: var(--accent); text-decoration-color: currentColor; }
.page { max-width: 1200px; margin: 0 auto; padding: 28px 20px 64px;}
/* -------------------------------------------------------------------------- Header -------------------------------------------------------------------------- */
.site-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding-bottom: 18px; margin-bottom: 20px; border-bottom: 1px solid var(--border);}
.eyebrow { margin: 0 0 4px; color: var(--accent); font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase;}
.eyebrow.accent { color: var(--accent); }
.live-dot { display: inline-block; width: 7px; height: 7px; margin-right: 7px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 9px var(--accent); animation: pulse 2.4s ease-in-out infinite;}
@keyframes pulse { 0%, 100% { opacity: 0.45; transform: scale(0.9); } 50% { opacity: 1; transform: scale(1.1); }}
@media (prefers-reduced-motion: reduce) { .live-dot { animation: none; }}
h1 { margin: 0; font-size: 27px; font-weight: 650; letter-spacing: 0.04em; line-height: 1.1; text-transform: uppercase;}
:root[data-theme="dark"] h1,:root:where(:not([data-theme="light"])) h1 { text-shadow: 0 0 28px rgba(255, 43, 61, 0.22);}
h2 { margin: 0; color: var(--ink-2); font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: 0.09em; text-transform: uppercase;}
h2::before { content: "// "; color: var(--accent);}
.asof, .sub { margin: 4px 0 0; color: var(--ink-2); font-size: 12px;}
.label { margin: 0; color: var(--ink-2); font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;}
/* -------------------------------------------------------------------------- Surfaces -------------------------------------------------------------------------- */
.card, .hero-figure, .share-card, .kpi { position: relative; background: linear-gradient(180deg, var(--surface-2), var(--surface-1)); border: 1px solid var(--border); border-radius: var(--radius);}
.card { padding: 18px 20px; margin-bottom: 16px;}
.matrix-card { overflow: hidden; border-top: 2px solid var(--accent); box-shadow: var(--glow), var(--shadow);}
.matrix-card::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(680px 240px at 16% 0%, rgba(255, 43, 61, 0.10), transparent 70%);}
.matrix-card::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: repeating-linear-gradient( 0deg, rgba(255, 255, 255, 0.018) 0 1px, transparent 1px 3px ); opacity: 0.55;}
.matrix-layout { position: relative; z-index: 1; display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 24px;}
.matrix-main { position: relative; display: flex; flex-direction: column; min-width: 0;}
.matrix-side { min-width: 0; padding-left: 24px; border-left: 1px solid var(--border);}
.matrix-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;}
.matrix-head h2 { margin-top: 2px; color: var(--ink); font-size: 15px;}
.matrix-head .sub { max-width: 48ch; }
.matrix-total { text-align: right; flex: none; }
.matrix-total-value { margin: 0; color: var(--accent); font-family: var(--mono); font-size: 30px; font-weight: 650; line-height: 1.1; letter-spacing: 0; text-shadow: 0 0 20px rgba(255, 43, 61, 0.28);}
.matrix-scroll { margin-top: 16px; overflow-x: auto; padding-bottom: 4px; scrollbar-color: var(--accent-dim) var(--surface-1);}
#matrix { display: block; width: 100%; height: auto; min-width: 760px; overflow: visible;}
.matrix-cell { stroke: none; transition: opacity 120ms ease;}
.matrix-cell:hover,.matrix-cell:focus-visible { stroke: var(--ink); stroke-width: 1.5; outline: none;}
.matrix-cell[data-level="5"] { filter: drop-shadow(0 0 3px rgba(255, 43, 61, 0.45));}
.matrix-month,.matrix-weekday { fill: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.04em;}
.matrix-month { text-transform: uppercase; }
.matrix-spark { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--border);}
.matrix-spark[hidden] { display: none; }
.matrix-cadence { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border);}
.matrix-cadence[hidden] { display: none; }
.matrix-cadence + .matrix-stats { margin-top: 10px; padding-top: 0; border-top: 0;}
.spark-head { display: flex; align-items: center; gap: 14px;}
.spark-head .label { margin: 0; }
.spark-key { display: inline-flex; align-items: center; color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.07em; text-transform: uppercase;}
.spark-line { width: 18px; height: 2px; margin-right: 5px; border-radius: 2px; display: inline-block;}
.spark-line.daily { background: var(--accent-soft); opacity: 0.6;}
.spark-line.average { background: var(--accent); }
#spark { display: block; width: 100%; height: 64px; margin-top: 4px; overflow: visible;}
.spark-baseline { stroke: var(--border); stroke-width: 1; vector-effect: non-scaling-stroke;}
.spark-area { fill: var(--accent); opacity: 0.1;}
.spark-daily { fill: none; stroke: var(--accent-soft); stroke-width: 1.2; opacity: 0.55; vector-effect: non-scaling-stroke;}
.spark-average { fill: none; stroke: var(--accent); stroke-width: 1.8; vector-effect: non-scaling-stroke;}
.matrix-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border);}
.matrix-stat .k { color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase;}
.matrix-stat .v { margin: 2px 0 0; color: var(--ink); font-family: var(--mono); font-size: 19px; font-weight: 650; line-height: 1.2; letter-spacing: 0;}
.matrix-stat .m { margin: 1px 0 0; color: var(--muted); font-size: 10px;}
.matrix-foot { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-top: auto; padding-top: 12px; border-top: 1px solid var(--border);}
.matrix-legend { margin: 0; gap: 5px; align-items: center; font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase;}
.matrix-swatch { width: 11px; height: 11px; border-radius: 2px; flex: none;}
.matrix-tooltip { position: absolute; top: 10px; left: 10px; }
/* -------------------------------------------------------------------------- Project ranking -------------------------------------------------------------------------- */
.side-head h2 { color: var(--ink); }
.project-ranking { display: flex; flex-direction: column; gap: 11px; margin: 14px 0 0; padding: 0; list-style: none;}
.project-row { display: grid; grid-template-columns: 18px 26px minmax(0, 1fr) auto; gap: 4px 8px; align-items: center;}
.project-rank { color: var(--muted); font-family: var(--mono); font-size: 10px; text-align: right;}
.project-icon { display: grid; place-items: center; width: 26px; height: 26px; flex: none; overflow: hidden; border-radius: 6px;}
.project-icon.fallback { border: 1px solid var(--border-strong); background: var(--accent-dim); color: var(--accent); font-family: var(--mono); font-size: 10px; font-weight: 700; letter-spacing: 0; box-shadow: inset 0 0 10px rgba(255, 43, 61, 0.12);}
.project-favicon { width: 20px; height: 20px; object-fit: contain; border-radius: 4px;}
.repo-name .project-icon { width: 20px; height: 20px;}
.repo-name .project-favicon { width: 16px; height: 16px;}
.project-body { min-width: 0; }
.project-name { display: flex; align-items: flex-start; gap: 6px; min-width: 0; color: var(--ink); font-size: 13px; font-weight: 600; line-height: 1.25;}
.project-label { overflow-wrap: anywhere; white-space: normal;}
.project-meta { display: block; overflow: hidden; color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.05em; text-overflow: ellipsis; text-transform: uppercase; white-space: nowrap;}
.project-count { display: inline-flex; align-items: center; gap: 4px; color: var(--ink); font-family: var(--mono); font-size: 13px; font-variant-numeric: tabular-nums; font-weight: 600;}
.project-momentum { font-size: 11px; font-weight: 500; line-height: 1;}
.project-momentum.up { color: var(--accent); }.project-momentum.down { color: var(--muted); }.project-momentum.flat { color: var(--ink-2); }
.side-note { margin-top: 14px; font-size: 11px; }
.side-link { display: inline-block; margin-top: 8px; color: var(--accent); font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-decoration: none; text-transform: uppercase;}
.side-link:hover { color: var(--accent-soft); }
/* -------------------------------------------------------------------------- Hero figures and KPIs -------------------------------------------------------------------------- */
.hero { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); gap: 16px; margin-bottom: 16px;}
.hero-figure, .share-card { padding: 20px 22px; }
.hero-figure .value { margin: 4px 0 0; color: var(--ink); font-size: 54px; font-weight: 650; line-height: 1.05; letter-spacing: 0;}
.share-head { display: flex; align-items: center; justify-content: space-between; gap: 12px;}
.share-periods { display: inline-flex; flex: none; gap: 2px; padding: 2px; border: 1px solid var(--border); border-radius: 6px; background: var(--page);}
.share-periods button { padding: 3px 7px; font-size: 9px;}
.share-value { margin: 6px 0 0; color: var(--accent); font-family: var(--mono); font-size: 34px; font-weight: 650; line-height: 1.1; letter-spacing: 0; text-shadow: 0 0 18px rgba(255, 43, 61, 0.22);}
.share-prior { margin-top: 7px; font-size: 11px; }
.meter { position: relative; height: 9px; margin: 13px 0 8px;}
.meter-track, .meter-fill { position: absolute; inset: 0 auto 0 0; height: 100%; border-radius: 5px;}
.meter-track { width: 100%; background: var(--track); }
.meter-fill { width: 0; background: linear-gradient(90deg, var(--accent-dim), var(--accent)); box-shadow: 0 0 12px rgba(255, 43, 61, 0.35); transition: width 300ms ease;}
.kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 16px;}
.kpi { padding: 13px 15px; }
.kpi .label { font-size: 9px; }
.kpi .value { margin: 2px 0 0; color: var(--ink); font-family: var(--mono); font-size: 23px; font-weight: 650; line-height: 1.2; letter-spacing: 0;}
.kpi .sub { margin-top: 2px; font-size: 11px; }
/* -------------------------------------------------------------------------- Controls -------------------------------------------------------------------------- */
.card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;}
.controls { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;}
.segmented { display: inline-flex; gap: 2px; padding: 2px; border: 1px solid var(--border); border-radius: 7px; background: var(--page);}
button { padding: 5px 10px; border: 0; border-radius: 5px; background: transparent; color: var(--ink-2); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; cursor: pointer;}
button:hover { color: var(--ink); background: var(--accent-dim); }
button.active,button[aria-pressed="true"] { color: var(--accent); background: var(--surface-1); box-shadow: inset 0 -2px 0 var(--accent);}
.ghost { border: 1px solid var(--border); background: var(--surface-1);}
.ghost:hover { border-color: var(--border-strong); background: var(--surface-2); }
.icon-button { width: 34px; height: 34px; padding: 0; color: var(--accent); font-size: 15px;}
button:focus-visible,a:focus-visible,summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px;}
/* -------------------------------------------------------------------------- Legends and charts -------------------------------------------------------------------------- */
.legend { display: flex; flex-wrap: wrap; gap: 10px 16px; margin: 14px 0 4px; padding: 0; list-style: none; color: var(--ink-2); font-family: var(--mono); font-size: 10px; letter-spacing: 0.03em;}
.legend li { display: inline-flex; align-items: center; gap: 6px;}
.swatch { width: 10px; height: 10px; flex: none; border-radius: 2px; background: var(--swatch, var(--series-1));}
.chart-wrap { position: relative; width: 100%; margin-top: 6px;}
#chart { display: block; width: 100%; height: auto; min-height: 220px; overflow: visible;}
.chart-grid { stroke: var(--grid); stroke-width: 1; shape-rendering: crispEdges; }.chart-axis { stroke: var(--axis); stroke-width: 1; shape-rendering: crispEdges; }.chart-tick { fill: var(--muted); font-family: var(--mono); font-size: 10px; font-variant-numeric: tabular-nums; }.chart-hit { fill: transparent; cursor: crosshair; }.chart-hit:focus-visible { outline: none; stroke: var(--accent); stroke-width: 1.5; }
.tooltip { position: absolute; z-index: 5; min-width: 168px; max-width: 260px; padding: 9px 11px; border: 1px solid var(--border-strong); border-radius: 7px; background: var(--surface-1); color: var(--ink); box-shadow: var(--shadow), 0 0 20px rgba(255, 43, 61, 0.10); font-size: 12px; pointer-events: none;}
.tooltip .tip-date { margin-bottom: 6px; color: var(--accent); font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;}
.tooltip .tip-row { display: flex; align-items: center; justify-content: space-between; gap: 14px;}
.tooltip .tip-name { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-2);}
.tooltip .tip-value { color: var(--ink); font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 600;}
.tooltip .tip-key { width: 12px; height: 2px; border-radius: 1px;}
/* -------------------------------------------------------------------------- Tables -------------------------------------------------------------------------- */
.table-view { max-height: 340px; margin-top: 14px; overflow: auto; scrollbar-color: var(--accent-dim) var(--surface-1);}
table { width: 100%; border-collapse: collapse; font-family: var(--mono); font-size: 11px; }
th, td { padding: 6px 8px; border-bottom: 1px solid var(--grid); text-align: right; white-space: nowrap;}
th:first-child, td:first-child { text-align: left; }
th { position: sticky; top: 0; background: var(--surface-1); color: var(--muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em;}
td { color: var(--ink-2); font-variant-numeric: tabular-nums; }td:first-child { color: var(--ink); }.table-scroll-note { margin-top: 6px; color: var(--muted); font-size: 10px; }
/* -------------------------------------------------------------------------- Two-column panels -------------------------------------------------------------------------- */
.two-col { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px;}
.repo-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 12px; padding: 9px 0; border-bottom: 1px solid var(--grid);}
.repo-row:last-child { border-bottom: 0; }
.repo-name { display: flex; align-items: center; gap: 6px; min-width: 0; font-weight: 550;}
.repo-name .repo-label { overflow-wrap: anywhere; white-space: normal; line-height: 1.25;}
.repo-meta { color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.04em; text-transform: uppercase;}
.repo-count { color: var(--ink); font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 600; text-align: right;}
.repo-bar-track { grid-column: 1 / -1; height: 4px; overflow: hidden; border-radius: 2px; background: var(--track);}
.repo-bar { height: 100%; border-radius: 2px; background: linear-gradient(90deg, var(--accent-dim), var(--accent)); box-shadow: 0 0 6px rgba(255, 43, 61, 0.30);}
/* -------------------------------------------------------------------------- Recent and status -------------------------------------------------------------------------- */
.recent { margin: 6px 0 0; padding: 0; list-style: none; }
.recent li { display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 10px; align-items: start; padding: 9px 0; border-bottom: 1px solid var(--grid);}
.recent li:last-child { border-bottom: 0; }
.recent .dot { width: 9px; height: 9px; margin-top: 5px; border-radius: 50%; background: var(--swatch); box-shadow: 0 0 8px var(--swatch);}
.recent .msg { margin: 0; color: var(--ink); }.recent .meta { margin: 2px 0 0; color: var(--muted); font-family: var(--mono); font-size: 10px; }.recent .when { color: var(--muted); font-family: var(--mono); font-size: 10px; white-space: nowrap; font-variant-numeric: tabular-nums; }.recent .sha { color: var(--muted); font-family: var(--mono); font-size: 10px; }
.status-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin: 8px 0 12px;}
.status-grid .kpi { padding: 10px 12px; }.status-grid .kpi .value { font-size: 18px; }
.notice { padding: 12px 14px; border: 1px solid var(--border-strong); border-radius: var(--radius); background: var(--surface-1);}
.method { margin-top: 10px; color: var(--ink-2); font-size: 12px; }.method summary { cursor: pointer; color: var(--accent); font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; }.method p { max-width: 78ch; }
.errors { margin: 8px 0 0; padding-left: 18px; color: var(--ink-2); font-size: 11px;}
.errors li { margin: 2px 0; overflow-wrap: anywhere; }
.loading { opacity: 0.55; transition: opacity 150ms ease; }
/* -------------------------------------------------------------------------- Responsive -------------------------------------------------------------------------- */
@media (max-width: 980px) { .matrix-layout { grid-template-columns: 1fr; } .matrix-side { padding-top: 18px; padding-left: 0; border-top: 1px solid var(--border); border-left: 0; } .project-ranking { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 11px 20px; }}
@media (max-width: 860px) { .hero, .two-col { grid-template-columns: 1fr; } .kpis, .status-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .hero-figure .value { font-size: 44px; }}
@media (max-width: 620px) { .page { padding: 20px 14px 48px; } .kpis, .status-grid { grid-template-columns: 1fr; } .card-head { flex-direction: column; } .matrix-head { flex-direction: column; } .matrix-total { text-align: left; } .matrix-foot { flex-direction: column; align-items: flex-start; } .project-ranking { grid-template-columns: 1fr; } .share-head { flex-direction: column; align-items: flex-start; gap: 6px; }}
@media print { :root { --page: #ffffff; --surface-1: #ffffff; --surface-2: #ffffff; } .controls, .icon-button, .side-link { display: none; } .card, .hero-figure, .share-card { break-inside: avoid; box-shadow: none; }}
/* -------------------------------------------------------------------------- Editorial pass: flat, serif, numbers first. -------------------------------------------------------------------------- */
:root { --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; --serif: "Courier Prime", "Nimbus Mono PS", "Courier New", monospace; --mono: "Courier Prime", "Nimbus Mono PS", "Courier New", monospace; --page: #f4e7e0; --surface-1: #fff2ef; --surface-2: #f9e8e2; --ink: #1a0806; --ink-2: #4a2a25; --muted: #8a6a66; --grid: #e5cec7; --axis: #d4b5ad; --border: rgba(26, 8, 6, 0.16); --border-strong: rgba(217, 32, 10, 0.55); --accent: #d9200a; --accent-soft: #b81605; --accent-dim: #ffd4cc; --track: #ead4ce; --matrix-0: #f3dfd8; --matrix-1: #ffc9c0; --matrix-2: #ff8066; --matrix-3: #ff4d2e; --matrix-4: #e0230a; --matrix-5: #961407; --shadow: none; --glow: none; --radius: 0;}
:root[data-theme="dark"] { --page: #0d0605; --surface-1: #140807; --surface-2: #1a0806; --ink: #fff2ef; --ink-2: #ffc9c0; --muted: #b8908a; --grid: #2a1614; --axis: #3a201d; --border: rgba(255, 210, 200, 0.16); --border-strong: rgba(255, 45, 22, 0.55); --accent: #ff2d16; --accent-soft: #ff8066; --accent-dim: #3a201d; --track: #2a1614; --matrix-0: #1a0806; --matrix-1: #3a201d; --matrix-2: #961407; --matrix-3: #e0230a; --matrix-4: #ff4d2e; --matrix-5: #ffb3a5;}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --page: #0d0605; --surface-1: #140807; --surface-2: #1a0806; --ink: #fff2ef; --ink-2: #ffc9c0; --muted: #b8908a; --grid: #2a1614; --axis: #3a201d; --border: rgba(255, 210, 200, 0.16); --border-strong: rgba(255, 45, 22, 0.55); --accent: #ff2d16; --accent-soft: #ff8066; --accent-dim: #3a201d; --track: #2a1614; --matrix-0: #1a0806; --matrix-1: #3a201d; --matrix-2: #961407; --matrix-3: #e0230a; --matrix-4: #ff4d2e; --matrix-5: #ffb3a5; }}
body { background: var(--page); color: var(--ink); font-family: var(--sans);}
.page { max-width: 1200px; padding: 30px 34px 80px;}
.site-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; padding-bottom: 22px; border-bottom: 1px solid var(--border);}
.site-header h1 { margin: 6px 0 4px; color: var(--ink); font-family: var(--serif); font-size: clamp(46px, 8vw, 88px); font-weight: 700; letter-spacing: 0; line-height: 0.95; text-transform: none;}
.eyebrow,.label,.kpi .label,.matrix-stat .k,.side-head .eyebrow { color: var(--muted); font-family: var(--mono); font-size: 9px; font-weight: 500; letter-spacing: 0.13em; text-transform: uppercase;}
.eyebrow.accent { color: var(--accent); }
.asof { margin: 0; color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.04em;}
.live-dot { width: 5px; height: 5px; margin-right: 7px; border-radius: 0; box-shadow: none; animation: none;}
.card,.matrix-card,.hero-figure,.share-card,.kpi { background: none; border: 0; border-radius: 0; box-shadow: none;}
.card { margin: 0; padding: 26px 0; border-top: 1px solid var(--border);}
.matrix-card { padding-top: 22px; border-top: 2px solid var(--accent);}
.matrix-card::before,.matrix-card::after { display: none; }
.matrix-layout { grid-template-columns: minmax(0, 1fr) 280px; gap: 40px;}
.matrix-side { padding-left: 28px; border-left: 1px solid var(--border);}
.matrix-head { align-items: flex-end; gap: 20px;}
.matrix-head h2,.side-head h2,.card h2,.chart-card h2 { margin: 2px 0 0; color: var(--ink); font-family: var(--serif); font-size: 27px; font-weight: 700; letter-spacing: 0; line-height: 1; text-transform: none;}
.matrix-total { padding-bottom: 2px; }
.matrix-total-value { color: var(--ink); font-family: var(--serif); font-size: clamp(48px, 6vw, 68px); font-weight: 700; letter-spacing: 0; line-height: 0.9;}
.matrix-total .label { margin-top: 8px; }
.matrix-scroll { margin-top: 20px; }
#matrix { min-width: 700px; }
.matrix-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--border);}
.matrix-stat .v { margin-top: 3px; font-family: var(--serif); font-size: 25px; font-weight: 700; letter-spacing: 0;}
.matrix-stat .m { display: none; }
.matrix-foot { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--border);}
.matrix-legend { font-size: 8px; letter-spacing: 0.1em; }
.matrix-note { margin: 0; color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.08em; text-transform: uppercase;}
.matrix-spark { margin-top: 10px; padding-top: 8px; }.spark-head .label { color: var(--muted); }#spark { height: 54px; }
.side-head { margin-bottom: 14px; }
.project-row { grid-template-columns: 18px 24px minmax(0, 1fr) auto; gap: 3px 8px; padding: 8px 0; border-bottom: 1px solid var(--grid);}
.project-row:last-child { border-bottom: 0; }
.project-rank { font-size: 9px; }.project-name { color: var(--ink); font-size: 13px; font-weight: 500; }.project-meta { color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.04em; }.project-count { color: var(--ink); font-family: var(--mono); font-size: 12px; }.side-link { color: var(--accent); font-size: 9px; letter-spacing: 0.12em; }
.hero { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; border-top: 1px solid var(--border);}
.hero-figure,.share-card { padding: 26px 0 24px;}
.hero-figure .value,.share-value { margin: 4px 0 0; color: var(--ink); font-family: var(--serif); font-size: clamp(58px, 7vw, 82px); font-weight: 700; letter-spacing: 0; line-height: 0.9;}
.share-card { padding-left: 40px; border-left: 1px solid var(--border);}
.share-head { align-items: center; margin-bottom: 8px; }.share-periods button { color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; }.share-periods button.active { color: var(--accent); }.meter { height: 3px; margin-top: 14px; border-radius: 0; }.meter-track, .meter-fill { border-radius: 0; }.share-sub { margin-top: 10px; color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.03em; }
/* Share trend: a quiet line under the meter, not a second headline. */
.share-trend { position: relative; margin-top: 12px;}
#share-spark { display: block; width: 100%; height: 40px; overflow: visible;}
.share-trend-line { fill: none; stroke: var(--ink-2); stroke-width: 1.5; vector-effect: non-scaling-stroke;}
.share-trend-cursor { stroke: var(--muted); stroke-width: 1; vector-effect: non-scaling-stroke;}
.share-trend-label { display: block; margin-top: 3px; color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.03em;}
.kpis { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; margin: 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);}
.kpi { padding: 18px 20px; border-left: 1px solid var(--border);}
.kpi:first-child { border-left: 0; padding-left: 0; }.kpi .value { font-family: var(--serif); font-size: 33px; font-weight: 700; letter-spacing: 0; }.kpi .sub { display: none; }
.chart-card { border-top: 1px solid var(--border); }.card-head { align-items: flex-end; }.chart-card .legend { margin-top: 14px; }.chart-wrap { margin-top: 8px; }.controls { gap: 10px; }.ghost, .segmented { border-radius: 0; background: transparent;}.ghost { border: 1px solid var(--border); color: var(--ink-2); font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase; }.ghost:hover { border-color: var(--accent); color: var(--accent); }.segmented { border: 1px solid var(--border); padding: 0; }.segmented button { color: var(--muted); font-family: var(--mono); font-size: 9px; }.segmented button.active { background: var(--accent); color: var(--page); }
.two-col { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; border-top: 1px solid var(--border);}
.two-col > .card { padding: 24px 0; border-top: 0;}
.two-col > .card + .card { padding-left: 36px; border-left: 1px solid var(--border);}
.repo-row { padding: 10px 0; }.repo-name { color: var(--ink); font-size: 13px; }.repo-meta { color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.03em; }.repo-count { font-family: var(--mono); font-size: 11px; }.repo-bar { background: var(--accent); box-shadow: none; }
.recent { margin-top: 2px; }.recent li { padding: 10px 0; }.recent .msg { color: var(--ink); font-size: 13px; }.recent .meta, .recent .when { color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.03em; }.recent .dot { box-shadow: none; }
.status { padding-top: 22px; }.status-grid { gap: 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }.status-grid .kpi { border-left: 1px solid var(--border); padding: 14px 18px; }.status-grid .kpi:first-child { border-left: 0; padding-left: 0; }.status-grid .kpi .value { font-family: var(--serif); font-size: 22px; }.method { margin-top: 14px; }.method summary { color: var(--muted); font-size: 8px; letter-spacing: 0.1em; }.method p { color: var(--muted); font-size: 11px; max-width: 70ch; }.status > .sub { color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.04em; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;}
@media (max-width: 980px) { .matrix-layout { grid-template-columns: 1fr; gap: 24px; } .matrix-side { padding-top: 20px; padding-left: 0; border-top: 1px solid var(--border); border-left: 0; }}
@media (max-width: 860px) { .hero, .two-col { grid-template-columns: 1fr; } .share-card { padding-left: 0; border-left: 0; border-top: 1px solid var(--border); } .two-col > .card + .card { padding-left: 0; border-left: 0; border-top: 1px solid var(--border); } .kpis, .status-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .kpi:nth-child(3) { border-left: 0; padding-left: 0; } .hero-figure .value, .share-value { font-size: 58px; }}
@media (max-width: 620px) { .page { padding: 22px 16px 50px; } .kpis, .status-grid { grid-template-columns: 1fr; } .kpi { border-left: 0; padding-left: 0; } .matrix-head { align-items: flex-start; } .matrix-total { text-align: left; } .site-header h1 { font-size: 52px; }}
h2::before { content: none; }.two-col { align-items: start; }
@font-face { font-family: "Courier Prime"; src: url("fonts/courier-prime-400.woff2") format("woff2"); font-style: normal; font-weight: 400; font-display: swap;}
@font-face { font-family: "Courier Prime"; src: url("fonts/courier-prime-700.woff2") format("woff2"); font-style: normal; font-weight: 700; font-display: swap;}
.site-header h1,.matrix-head h2,.side-head h2,.card h2,.chart-card h2,.matrix-total-value,.matrix-stat .v,.hero-figure .value,.share-value,.kpi .value { font-kerning: none; font-variant-ligatures: none; font-feature-settings: "kern" 0, "liga" 0;}
.matrix-cadence { grid-template-columns: 76px repeat(2, minmax(0, 1fr)); column-gap: 20px; row-gap: 5px; border-top: 1px solid var(--border);}
.cadence-row { display: contents; }
.cadence-head span { color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase;}
.cadence-period { color: var(--muted); font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase;}
.cadence-value { color: var(--ink); font-family: var(--serif); font-size: 24px; font-weight: 700; line-height: 1;}
.matrix-stat .m { display: block; margin-top: 2px; color: var(--muted); font-family: var(--mono); font-size: 8px; }
.cadence-note { grid-column: 1 / -1; margin: 2px 0 0; color: var(--muted); font-family: var(--mono); font-size: 8px; letter-spacing: 0.06em; text-transform: uppercase;}
/* -------------------------------------------------------------------------- Time-of-day wheel -------------------------------------------------------------------------- */
.wheel-layout { display: grid; grid-template-columns: minmax(0, 440px) minmax(0, 1fr); gap: 32px; align-items: center; margin-top: 8px;}
#wheel { display: block; width: 100%; height: auto; overflow: visible;}
.wheel-ring { fill: none; }
.wheel-ring-label { paint-order: stroke; stroke: var(--page); stroke-width: 3px;}
.wheel-total { fill: var(--ink); font-family: var(--serif); font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums;}
.wheel-stats { grid-template-columns: 1fr; margin-top: 0; padding-top: 0; border-top: 0;}
.wheel-stats .matrix-stat { padding: 12px 0; border-top: 1px solid var(--border);}
.wheel-stats .matrix-stat:first-child { border-top: 0; }.wheel-stats .matrix-stat .m { display: block; }
@media (max-width: 860px) { .wheel-layout { grid-template-columns: 1fr; } .wheel-wrap { max-width: 440px; margin: 0 auto; }}
/* -------------------------------------------------------------------------- Project sparklines: twelve weeks under each project, one shared scale -------------------------------------------------------------------------- */
.project-spark { display: block; grid-column: 2 / -1; width: 100%; height: 22px; margin-top: 4px;}
.project-spark-bar { fill: var(--accent); }.project-spark-empty { fill: var(--track); }
/* -------------------------------------------------------------------------- Commit types -------------------------------------------------------------------------- */
#types { display: block; width: 100%; height: auto; min-height: 200px; overflow: visible;}
.type-band { stroke: var(--page); stroke-width: 1.5; stroke-linejoin: round;}
.types-cursor { stroke: var(--ink-2); stroke-width: 1; shape-rendering: crispEdges;}
.types-note { margin-top: 8px; color: var(--muted); font-family: var(--mono); font-size: 9px; }
/* -------------------------------------------------------------------------- Commits by date and by time, side by side -------------------------------------------------------------------------- */
.chart-pair > .card { min-width: 0; }.chart-pair .card-head { flex-wrap: wrap; gap: 10px; }.chart-pair .wheel-layout { grid-template-columns: 1fr; gap: 14px; }.chart-pair .wheel-wrap { width: 100%; max-width: 400px; margin: 0 auto; }.chart-pair .wheel-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }.chart-pair .wheel-stats .matrix-stat { padding: 0; border-top: 0; }.chart-pair .wheel-stats .matrix-stat .v { font-size: 16px; white-space: nowrap; }
/* -------------------------------------------------------------------------- Written to landed -------------------------------------------------------------------------- */
.gap-layout { margin-top: 10px; }
#gap { display: block; width: 100%; height: auto; overflow: visible;}
.gap-dot { fill: var(--accent); fill-opacity: 0.32; }.gap-dot.slow { fill-opacity: 1; stroke: var(--page); stroke-width: 1; }.gap-quantile { stroke: var(--ink-2); stroke-width: 1; shape-rendering: crispEdges; }.gap-quantile-label { fill: var(--ink-2); }.gap-limit-label { paint-order: stroke; stroke: var(--page); stroke-width: 3px; }.gap-limit { fill: none; stroke: var(--muted); stroke-width: 1; stroke-dasharray: 3 3; }.tooltip .tip-subject { max-width: 240px; color: var(--ink); font-size: 12px; line-height: 1.35; }.tooltip .tip-dates { margin-top: 4px; color: var(--muted); font-family: var(--mono); font-size: 10px; }
.gap-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }.gap-stats .matrix-stat .m { display: block; }.gap-cursor { stroke: var(--ink-2); stroke-width: 1; shape-rendering: crispEdges; }
@media (max-width: 620px) { .gap-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }}</style></head><body> <div class="page"> <header class="site-header"> <div> <p class="eyebrow"><span class="live-dot" aria-hidden="true"></span> dev.permadeath.com</p> <h1 id="title">commit activity</h1> <p class="asof" id="asof">loading…</p> </div> <button id="theme" class="ghost icon-button" type="button" aria-label="Toggle colour theme" title="Toggle colour theme"> <span aria-hidden="true">◐</span> </button> </header>
<main> <section class="card matrix-card" aria-labelledby="matrix-title"> <div class="matrix-layout"> <div class="matrix-main"> <div class="matrix-head"> <div> <p class="eyebrow accent">last 365 days</p> <h2 id="matrix-title">activity</h2> </div> <div class="matrix-total"> <p class="matrix-total-value" id="matrix-total">—</p> <p class="label">commits</p> </div> </div> <div class="matrix-scroll"> <svg id="matrix" role="img" aria-labelledby="matrix-title"></svg> </div> <div class="matrix-spark" id="matrix-spark" hidden> <div class="spark-head"> <span class="label">daily</span> <span class="spark-key"><span class="spark-line daily"></span>day</span> <span class="spark-key"><span class="spark-line average"></span>7d</span> </div> <svg id="spark" viewBox="0 0 1000 72" role="img" aria-label="Daily commits with a seven-day average"></svg> </div> <div class="matrix-cadence" id="matrix-cadence" hidden> <div class="cadence-row cadence-head"> <span></span><span>typical day</span><span>busy day</span> </div> <div class="cadence-row"> <span class="cadence-period">30 days</span> <span class="cadence-value" id="cadence-30-typical">—</span> <span class="cadence-value" id="cadence-30-busy">—</span> </div> <div class="cadence-row"> <span class="cadence-period">1 year</span> <span class="cadence-value" id="cadence-year-typical">—</span> <span class="cadence-value" id="cadence-year-busy">—</span> </div> <p class="cadence-note">active days only</p> </div> <div class="matrix-stats" id="matrix-stats"></div> <div class="tooltip matrix-tooltip" id="matrix-tooltip" hidden></div> <div class="matrix-foot"> <ul class="legend matrix-legend" id="matrix-legend" aria-label="Commit matrix scale"></ul> <p class="sub" id="matrix-note">UTC</p> </div> </div> <aside class="matrix-side" aria-labelledby="projects-title"> <div class="side-head"> <p class="eyebrow accent">30 days</p> <h2 id="projects-title">projects</h2> </div> <ol class="project-ranking" id="project-ranking"></ol> <a class="side-link" href="#repos-title">all repositories ↓</a> </aside> </div> </section>
<section class="hero" aria-labelledby="hero-label"> <div class="hero-figure"> <p class="label" id="hero-label">commits</p> <p class="value" id="me-total">—</p> </div> <div class="share-card"> <div class="share-head"> <p class="label" id="share-label">tangled</p> <div class="share-periods" id="share-periods" role="group" aria-label="Share period"> <button type="button" data-period="30d">30d</button> <button type="button" data-period="90d">90d</button> <button type="button" data-period="1y" class="active" aria-pressed="true">1y</button> <button type="button" data-period="all">all</button> </div> </div> <p class="share-value" id="share-value">—</p> <div class="meter" id="share-meter" role="img" aria-labelledby="share-label share-sub"> <div class="meter-track"></div> <div class="meter-fill" id="share-fill"></div> </div> <div class="share-trend" id="share-trend" hidden> <svg id="share-spark" viewBox="0 0 400 40" preserveAspectRatio="none" role="img" aria-label="Share over the trailing 30 days, by day"></svg> <span class="share-trend-label">trailing 30d, daily</span> <div class="tooltip" id="share-tooltip" hidden></div> </div> <p class="sub" id="share-sub"></p> </div> </section>
<section class="kpis" id="kpis" aria-label="Headline numbers"></section>
<div class="two-col chart-pair"> <section class="card chart-card" aria-labelledby="daily-title"> <div class="card-head"> <div> <h2 id="daily-title">commits by date</h2> <p class="sub" id="chart-sub">by UTC day</p> </div> <div class="controls"> <div class="segmented" id="range" role="group" aria-label="Date range"> <button type="button" data-days="30" class="active" aria-pressed="true">30d</button> <button type="button" data-days="90">90d</button> <button type="button" data-days="365">1y</button> </div> <button id="table-toggle" class="ghost" type="button" aria-expanded="false" aria-controls="table-view">Table</button> </div> </div> <ul class="legend" id="legend" aria-label="Series"></ul> <div class="chart-wrap"> <svg id="chart" viewBox="0 0 600 560" role="img" aria-labelledby="daily-title chart-sub"></svg> <div class="tooltip" id="tooltip" hidden></div> </div> <div class="table-view" id="table-view" hidden></div> </section> <section class="card chart-card wheel-card" aria-labelledby="wheel-title"> <div class="card-head"> <div> <h2 id="wheel-title">commits by time</h2> <p class="sub" id="wheel-sub">—</p> </div> <div class="controls"> <div class="segmented" id="wheel-range" role="group" aria-label="Commits by time range"> <button type="button" data-days="30" class="active" aria-pressed="true">30d</button> <button type="button" data-days="90">90d</button> <button type="button" data-days="365">1y</button> </div> <button id="wheel-table-toggle" class="ghost" type="button" aria-expanded="false" aria-controls="wheel-table">Table</button> </div> </div> <ul class="legend" id="wheel-legend" aria-label="Series"></ul> <div class="wheel-layout"> <div class="chart-wrap wheel-wrap"> <svg id="wheel" viewBox="0 0 440 440" role="img" aria-labelledby="wheel-title wheel-sub"></svg> <div class="tooltip" id="wheel-tooltip" hidden></div> </div> <div class="wheel-stats matrix-stats" id="wheel-stats"></div> </div> <div class="table-view" id="wheel-table" hidden></div> </section> </div>
<section class="card chart-card types-card" aria-labelledby="types-title" hidden> <div class="card-head"> <div> <h2 id="types-title">commit types</h2> <p class="sub" id="types-sub">conventional commits · share of each week</p> </div> <div class="controls"> <button id="types-table-toggle" class="ghost" type="button" aria-expanded="false" aria-controls="types-table">Table</button> </div> </div> <ul class="legend" id="types-legend" aria-label="Commit types"></ul> <div class="chart-wrap types-wrap"> <svg id="types" viewBox="0 0 1000 280" role="img" aria-labelledby="types-title types-sub"></svg> <div class="tooltip" id="types-tooltip" hidden></div> </div> <p class="sub types-note" id="types-note"></p> <div class="table-view" id="types-table" hidden></div> <section class="card chart-card gap-card" aria-labelledby="gap-title" hidden> <div class="card-head"> <div> <h2 id="gap-title">written to landed</h2> <p class="sub" id="gap-sub">author date → commit date, log scale · every tangled change by the day it was written</p> </div> </div> <div class="gap-layout"> <div class="chart-wrap gap-wrap"> <svg id="gap" viewBox="0 0 1000 340" role="img" aria-labelledby="gap-title gap-sub"></svg> <div class="tooltip" id="gap-tooltip" hidden></div> </div> <div class="gap-stats matrix-stats" id="gap-stats"></div> </div> </section>
<section class="card" aria-labelledby="repos-title"> <h2 id="repos-title">repositories</h2> <div id="repos"></div> </section>
<section class="card" aria-labelledby="recent-title"> <h2 id="recent-title">recent</h2> <ol class="recent" id="recent"></ol> </section>
<section class="card status" aria-labelledby="status-title"> <h2 id="status-title">index</h2> <div id="status"></div> <details class="method"> <summary>method</summary> <p id="methodology"></p> <p class="sub">prior: <span id="prior-claim"></span>.</p> </details> </section>
<noscript><p class="notice">This dashboard needs JavaScript to draw the matrix and chart. The raw data is in <a href="data/summary.json">summary.json</a> and <a href="data/site.json">site.json</a>.</p></noscript> </main> </div> <script>window.__TALLY_DATA__={"summary":{"generated_at":"2026-10-25T22:42:21Z","title":"commit activity","site_url":"https://dev.permadeath.com","timezone":null,"me_tangled":5618,"me_github":1356,"me_total":6974,"bots_tangled":183,"everything_mine":7157,"tangled_total":546374,"tangled_total_365":514333,"share_available":true,"global_summary_at":"2026-10-25T19:33:04Z","global_summary_stale":false,"global_partial":true,"share_me":1.1417087928781384,"share_all":1.1656850435782085,"share_me_365":1.2128329311943817,"share_all_365":1.2383028116025998,"share_periods":{"30d":{"me_tangled":902,"bots_tangled":131,"tangled_total":87400,"objects_me_tangled":855,"objects_bots_tangled":183,"objects_tangled_total":0,"share_me":1.0320366132723113,"share_all":1.1819221967963387},"90d":{"me_tangled":6238,"bots_tangled":131,"tangled_total":249060,"objects_me_tangled":5700,"objects_bots_tangled":183,"objects_tangled_total":0,"share_me":2.504617361278407,"share_all":2.557215128884606},"1y":{"me_tangled":6238,"bots_tangled":131,"tangled_total":514333,"objects_me_tangled":5700,"objects_bots_tangled":183,"objects_tangled_total":0,"share_me":1.2128329311943817,"share_all":1.2383028116025998},"all":{"me_tangled":6238,"bots_tangled":131,"tangled_total":546374,"objects_me_tangled":5700,"objects_bots_tangled":183,"objects_tangled_total":0,"share_me":1.1417087928781384,"share_all":1.1656850435782085}},"share_trend":[["2026-07-31",0.05056513979773944],["2026-08-01",0.09555029620591823],["2026-08-02",0.09542404979667338],["2026-08-03",0.16473036240679728],["2026-08-04",0.18088037871829293],["2026-08-05",0.24264440808629822],["2026-08-06",0.45566502463054187],["2026-08-07",0.7080127986928995],["2026-08-08",0.9873214310032548],["2026-08-09",1.0821133036282622],["2026-08-10",1.139759068723551],["2026-08-11",1.3679908889930998],["2026-08-12",1.543181307274242],["2026-08-13",1.6470836465297833],["2026-08-14",1.647844676344072],["2026-08-15",1.7406900823247051],["2026-08-16",1.7884215124495721],["2026-08-17",1.9368303173754804],["2026-08-18",2.024388702849561],["2026-08-19",2.308692282692933],["2026-08-20",2.5374727020051617],["2026-08-21",2.681458081393914],["2026-08-22",2.7057192969545327],["2026-08-23",2.705435232781933],["2026-08-24",2.8181894757108648],["2026-08-25",2.97584218005517],["2026-08-26",3.097840827348734],["2026-08-27",3.1609364171355407],["2026-08-28",3.3332557164811623],["2026-08-29",3.5854902965775923],["2026-08-30",3.956542698914743],["2026-08-31",4.122546103509816],["2026-09-01",4.164254062038404],["2026-09-02",4.221098550154473],["2026-09-03",4.4560145277337195],["2026-09-04",4.631490022375451],["2026-09-05",4.9375967932950715],["2026-09-06",4.803200618301263],["2026-09-07",4.576407537079212],["2026-09-08",4.356570649394921],["2026-09-09",4.362469382200853],["2026-09-10",4.331481793188576],["2026-09-11",4.2779429084179235],["2026-09-12",4.22815303608958],["2026-09-13",4.152296242512253],["2026-09-14",4.214751060225348],["2026-09-15",4.196244561483856],["2026-09-16",4.197545159796202],["2026-09-17",4.11281810718893],["2026-09-18",4.067559227080663],["2026-09-19",3.826404838923027],["2026-09-20",3.624350191905942],["2026-09-21",3.528308093422191],["2026-09-22",3.6747649859602003],["2026-09-23",3.767735346682715],["2026-09-24",3.6439316488973272],["2026-09-25",3.4447257179539976],["2026-09-26",3.2749824705626347],["2026-09-27",3.266904259703736],["2026-09-28",3.0936936716000636],["2026-09-29",2.8734715902819508],["2026-09-30",2.521265154477904],["2026-10-01",2.3455168891807108],["2026-10-02",2.2362475620540527],["2026-10-03",2.122597902054803],["2026-10-04",1.8004089571592439],["2026-10-05",1.5840028385330867],["2026-10-06",1.1770400754120913],["2026-10-07",1.1120420443293473],["2026-10-08",1.1054604192168394],["2026-10-09",1.1037750113401543],["2026-10-10",1.0164033410486062],["2026-10-11",1.0768978272671035],["2026-10-12",0.9807510255601136],["2026-10-13",0.8968100805993869],["2026-10-14",1.0050689350254691],["2026-10-15",1.0508998944189358],["2026-10-16",1.1531623681839216],["2026-10-17",1.2000383628647469],["2026-10-18",1.1656650148197611],["2026-10-19",1.1807478829737523],["2026-10-20",1.287683514513056],["2026-10-21",1.303613718094904],["2026-10-22",1.378541935201975],["2026-10-23",1.2575424972146536],["2026-10-24",1.1576971214017522],["2026-10-25",1.1819627676007185]],"repos_total":14319,"repos_scanned":13982,"coverage_pct":97.64648369299532,"backfill_complete":true,"prior_claim":{"percent":32.6,"date":"2026-09-04","url":"https://permadeath.com/3mupnu5nc522m","note":"the earlier self-reported share; the later PR-patch census measured 1.1% all-time and 14.3% in August 2026"},"windows":{"me_7":338,"me_30":1072,"me_365":6945,"bots_7":183,"bots_30":183,"bots_365":183,"all_7":521,"all_30":1255,"all_365":7128},"github_configured":false,"methodology":"Definition: a logical change is a distinct Change-Id when the commit carries one (atgc writes these trailers), otherwise a distinct Git object ID (SHA). A Change-Id survives a rebase, so the rewritten object collapses into the same logical change. Exact resubmits are already excluded because the SHA does not change; the crawler is not counting Tangled's native ref-update announcements. A commit counts once its repository's default branch reaches it: merged work. Commits only on other branches, rebased or abandoned ones included, don't count. It counts once across repositories, pushes, forges, and rebases. Merge commits count once. A rebase without a Change-Id cannot be collapsed and remains a separate object. Tags are not counted separately. Attribution uses the Git author (Tangled stores the author's DID; GitHub commits are filtered by the authenticated login), and dates are author dates in UTC. The dashboard shows the logical count and, for context, the raw unique Git-object count. The denominator is the global crawl summary: distinct logical changes per UTC author day across the public Tangled repositories it reached. The hourly site uses that summary and hides the share when it is missing or older than the configured maximum age. The share covers all of your Tangled identities, plus your bots, over the selected period and across all repositories. GitHub is tracked separately and is not part of the Tangled denominator. Bot identities are didbot accounts whose DID document names one of the personal DIDs as operator."},"identities":[{"did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","handle":"permadeath.com","kind":"personal","color":"series-red","active":true,"operator":null,"tangled":5617,"github":0,"last_30":855},{"did":"did:plc:ggmpabld7lsjai55okau7oip","handle":"permadeath.games","kind":"personal","color":"series-3","active":true,"operator":null,"tangled":1,"github":0,"last_30":0},{"did":"github:personal","handle":"personal GitHub","kind":"github","color":"series-6","active":true,"operator":null,"tangled":0,"github":299,"last_30":107},{"did":"github-work:redacted","handle":"work GitHub","kind":"github","color":"series-7","active":true,"operator":null,"tangled":0,"github":1057,"last_30":110},{"did":"did:web:fractal-szabla.test.pds.did.bot","handle":"fractal-szabla.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":54,"github":0,"last_30":54},{"did":"did:web:orbit-braquemart.test.pds.did.bot","handle":"orbit-braquemart.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":39,"github":0,"last_30":39},{"did":"did:web:projective-bichuwa.test.pds.did.bot","handle":"projective-bichuwa.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":39,"github":0,"last_30":39},{"did":"did:web:alternating-scramasax.test.pds.did.bot","handle":"alternating-scramasax.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":30,"github":0,"last_30":30},{"did":"did:web:chalcedony-mara.test.pds.did.bot","handle":"chalcedony-mara.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":16,"github":0,"last_30":16},{"did":"did:web:quaternion-gyuto.test.pds.did.bot","handle":"quaternion-gyuto.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":2,"github":0,"last_30":2},{"did":"did:web:fibration-kodachi.test.pds.did.bot","handle":"fibration-kodachi.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":1,"github":0,"last_30":1},{"did":"did:web:multinomial-xiphos.test.pds.did.bot","handle":"multinomial-xiphos.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":1,"github":0,"last_30":1},{"did":"did:web:symplectic-flyssa.test.pds.did.bot","handle":"symplectic-flyssa.test.pds.did.bot","kind":"bot","color":"series-5","active":true,"operator":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","tangled":1,"github":0,"last_30":1}],"daily":[{"date":"2025-10-26","identities":{},"bots":0,"total":0},{"date":"2025-10-27","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2025-10-28","identities":{"github-work:redacted":6},"bots":0,"total":6},{"date":"2025-10-29","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2025-10-30","identities":{},"bots":0,"total":0},{"date":"2025-10-31","identities":{},"bots":0,"total":0},{"date":"2025-11-01","identities":{},"bots":0,"total":0},{"date":"2025-11-02","identities":{},"bots":0,"total":0},{"date":"2025-11-03","identities":{},"bots":0,"total":0},{"date":"2025-11-04","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2025-11-05","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2025-11-06","identities":{},"bots":0,"total":0},{"date":"2025-11-07","identities":{"github-work:redacted":6},"bots":0,"total":6},{"date":"2025-11-08","identities":{},"bots":0,"total":0},{"date":"2025-11-09","identities":{},"bots":0,"total":0},{"date":"2025-11-10","identities":{"github-work:redacted":10},"bots":0,"total":10},{"date":"2025-11-11","identities":{},"bots":0,"total":0},{"date":"2025-11-12","identities":{"github-work:redacted":14},"bots":0,"total":14},{"date":"2025-11-13","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2025-11-14","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2025-11-15","identities":{},"bots":0,"total":0},{"date":"2025-11-16","identities":{},"bots":0,"total":0},{"date":"2025-11-17","identities":{},"bots":0,"total":0},{"date":"2025-11-18","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2025-11-19","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2025-11-20","identities":{},"bots":0,"total":0},{"date":"2025-11-21","identities":{},"bots":0,"total":0},{"date":"2025-11-22","identities":{},"bots":0,"total":0},{"date":"2025-11-23","identities":{},"bots":0,"total":0},{"date":"2025-11-24","identities":{"github-work:redacted":10},"bots":0,"total":10},{"date":"2025-11-25","identities":{},"bots":0,"total":0},{"date":"2025-11-26","identities":{},"bots":0,"total":0},{"date":"2025-11-27","identities":{},"bots":0,"total":0},{"date":"2025-11-28","identities":{},"bots":0,"total":0},{"date":"2025-11-29","identities":{},"bots":0,"total":0},{"date":"2025-11-30","identities":{"github:personal":8},"bots":0,"total":8},{"date":"2025-12-01","identities":{},"bots":0,"total":0},{"date":"2025-12-02","identities":{},"bots":0,"total":0},{"date":"2025-12-03","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2025-12-04","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2025-12-05","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2025-12-06","identities":{},"bots":0,"total":0},{"date":"2025-12-07","identities":{},"bots":0,"total":0},{"date":"2025-12-08","identities":{},"bots":0,"total":0},{"date":"2025-12-09","identities":{"github-work:redacted":8},"bots":0,"total":8},{"date":"2025-12-10","identities":{"github:personal":6},"bots":0,"total":6},{"date":"2025-12-11","identities":{"github:personal":3},"bots":0,"total":3},{"date":"2025-12-12","identities":{},"bots":0,"total":0},{"date":"2025-12-13","identities":{},"bots":0,"total":0},{"date":"2025-12-14","identities":{},"bots":0,"total":0},{"date":"2025-12-15","identities":{},"bots":0,"total":0},{"date":"2025-12-16","identities":{},"bots":0,"total":0},{"date":"2025-12-17","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2025-12-18","identities":{},"bots":0,"total":0},{"date":"2025-12-19","identities":{},"bots":0,"total":0},{"date":"2025-12-20","identities":{},"bots":0,"total":0},{"date":"2025-12-21","identities":{},"bots":0,"total":0},{"date":"2025-12-22","identities":{},"bots":0,"total":0},{"date":"2025-12-23","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2025-12-24","identities":{},"bots":0,"total":0},{"date":"2025-12-25","identities":{},"bots":0,"total":0},{"date":"2025-12-26","identities":{},"bots":0,"total":0},{"date":"2025-12-27","identities":{},"bots":0,"total":0},{"date":"2025-12-28","identities":{},"bots":0,"total":0},{"date":"2025-12-29","identities":{},"bots":0,"total":0},{"date":"2025-12-30","identities":{},"bots":0,"total":0},{"date":"2025-12-31","identities":{},"bots":0,"total":0},{"date":"2026-01-01","identities":{},"bots":0,"total":0},{"date":"2026-01-02","identities":{},"bots":0,"total":0},{"date":"2026-01-03","identities":{},"bots":0,"total":0},{"date":"2026-01-04","identities":{},"bots":0,"total":0},{"date":"2026-01-05","identities":{},"bots":0,"total":0},{"date":"2026-01-06","identities":{},"bots":0,"total":0},{"date":"2026-01-07","identities":{},"bots":0,"total":0},{"date":"2026-01-08","identities":{},"bots":0,"total":0},{"date":"2026-01-09","identities":{},"bots":0,"total":0},{"date":"2026-01-10","identities":{},"bots":0,"total":0},{"date":"2026-01-11","identities":{},"bots":0,"total":0},{"date":"2026-01-12","identities":{},"bots":0,"total":0},{"date":"2026-01-13","identities":{},"bots":0,"total":0},{"date":"2026-01-14","identities":{},"bots":0,"total":0},{"date":"2026-01-15","identities":{},"bots":0,"total":0},{"date":"2026-01-16","identities":{},"bots":0,"total":0},{"date":"2026-01-17","identities":{},"bots":0,"total":0},{"date":"2026-01-18","identities":{},"bots":0,"total":0},{"date":"2026-01-19","identities":{},"bots":0,"total":0},{"date":"2026-01-20","identities":{},"bots":0,"total":0},{"date":"2026-01-21","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-01-22","identities":{},"bots":0,"total":0},{"date":"2026-01-23","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-01-24","identities":{},"bots":0,"total":0},{"date":"2026-01-25","identities":{},"bots":0,"total":0},{"date":"2026-01-26","identities":{"github-work:redacted":1,"github:personal":2},"bots":0,"total":3},{"date":"2026-01-27","identities":{},"bots":0,"total":0},{"date":"2026-01-28","identities":{},"bots":0,"total":0},{"date":"2026-01-29","identities":{},"bots":0,"total":0},{"date":"2026-01-30","identities":{},"bots":0,"total":0},{"date":"2026-01-31","identities":{},"bots":0,"total":0},{"date":"2026-02-01","identities":{},"bots":0,"total":0},{"date":"2026-02-02","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-02-03","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-02-04","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-02-05","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-02-06","identities":{},"bots":0,"total":0},{"date":"2026-02-07","identities":{},"bots":0,"total":0},{"date":"2026-02-08","identities":{},"bots":0,"total":0},{"date":"2026-02-09","identities":{},"bots":0,"total":0},{"date":"2026-02-10","identities":{},"bots":0,"total":0},{"date":"2026-02-11","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-02-12","identities":{},"bots":0,"total":0},{"date":"2026-02-13","identities":{},"bots":0,"total":0},{"date":"2026-02-14","identities":{},"bots":0,"total":0},{"date":"2026-02-15","identities":{},"bots":0,"total":0},{"date":"2026-02-16","identities":{},"bots":0,"total":0},{"date":"2026-02-17","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-02-18","identities":{"github-work:redacted":16},"bots":0,"total":16},{"date":"2026-02-19","identities":{"github-work:redacted":17},"bots":0,"total":17},{"date":"2026-02-20","identities":{},"bots":0,"total":0},{"date":"2026-02-21","identities":{},"bots":0,"total":0},{"date":"2026-02-22","identities":{},"bots":0,"total":0},{"date":"2026-02-23","identities":{},"bots":0,"total":0},{"date":"2026-02-24","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-02-25","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-02-26","identities":{},"bots":0,"total":0},{"date":"2026-02-27","identities":{"github:personal":14},"bots":0,"total":14},{"date":"2026-02-28","identities":{},"bots":0,"total":0},{"date":"2026-03-01","identities":{"github:personal":11},"bots":0,"total":11},{"date":"2026-03-02","identities":{"github:personal":2},"bots":0,"total":2},{"date":"2026-03-03","identities":{"github:personal":31},"bots":0,"total":31},{"date":"2026-03-04","identities":{"github:personal":14},"bots":0,"total":14},{"date":"2026-03-05","identities":{},"bots":0,"total":0},{"date":"2026-03-06","identities":{"github:personal":5},"bots":0,"total":5},{"date":"2026-03-07","identities":{"github:personal":8},"bots":0,"total":8},{"date":"2026-03-08","identities":{},"bots":0,"total":0},{"date":"2026-03-09","identities":{"github:personal":21},"bots":0,"total":21},{"date":"2026-03-10","identities":{},"bots":0,"total":0},{"date":"2026-03-11","identities":{"github-work:redacted":4},"bots":0,"total":4},{"date":"2026-03-12","identities":{},"bots":0,"total":0},{"date":"2026-03-13","identities":{},"bots":0,"total":0},{"date":"2026-03-14","identities":{},"bots":0,"total":0},{"date":"2026-03-15","identities":{},"bots":0,"total":0},{"date":"2026-03-16","identities":{},"bots":0,"total":0},{"date":"2026-03-17","identities":{},"bots":0,"total":0},{"date":"2026-03-18","identities":{},"bots":0,"total":0},{"date":"2026-03-19","identities":{},"bots":0,"total":0},{"date":"2026-03-20","identities":{},"bots":0,"total":0},{"date":"2026-03-21","identities":{},"bots":0,"total":0},{"date":"2026-03-22","identities":{},"bots":0,"total":0},{"date":"2026-03-23","identities":{},"bots":0,"total":0},{"date":"2026-03-24","identities":{},"bots":0,"total":0},{"date":"2026-03-25","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-03-26","identities":{},"bots":0,"total":0},{"date":"2026-03-27","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-03-28","identities":{},"bots":0,"total":0},{"date":"2026-03-29","identities":{},"bots":0,"total":0},{"date":"2026-03-30","identities":{},"bots":0,"total":0},{"date":"2026-03-31","identities":{},"bots":0,"total":0},{"date":"2026-04-01","identities":{"github-work:redacted":10},"bots":0,"total":10},{"date":"2026-04-02","identities":{"github-work:redacted":6},"bots":0,"total":6},{"date":"2026-04-03","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-04-04","identities":{},"bots":0,"total":0},{"date":"2026-04-05","identities":{},"bots":0,"total":0},{"date":"2026-04-06","identities":{"github-work:redacted":28},"bots":0,"total":28},{"date":"2026-04-07","identities":{"github-work:redacted":10},"bots":0,"total":10},{"date":"2026-04-08","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2026-04-09","identities":{"github-work:redacted":7},"bots":0,"total":7},{"date":"2026-04-10","identities":{},"bots":0,"total":0},{"date":"2026-04-11","identities":{},"bots":0,"total":0},{"date":"2026-04-12","identities":{},"bots":0,"total":0},{"date":"2026-04-13","identities":{},"bots":0,"total":0},{"date":"2026-04-14","identities":{},"bots":0,"total":0},{"date":"2026-04-15","identities":{"github:personal":1},"bots":0,"total":1},{"date":"2026-04-16","identities":{"github-work:redacted":7},"bots":0,"total":7},{"date":"2026-04-17","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-04-18","identities":{},"bots":0,"total":0},{"date":"2026-04-19","identities":{},"bots":0,"total":0},{"date":"2026-04-20","identities":{},"bots":0,"total":0},{"date":"2026-04-21","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-04-22","identities":{},"bots":0,"total":0},{"date":"2026-04-23","identities":{},"bots":0,"total":0},{"date":"2026-04-24","identities":{},"bots":0,"total":0},{"date":"2026-04-25","identities":{},"bots":0,"total":0},{"date":"2026-04-26","identities":{},"bots":0,"total":0},{"date":"2026-04-27","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-04-28","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-04-29","identities":{"github-work:redacted":23},"bots":0,"total":23},{"date":"2026-04-30","identities":{},"bots":0,"total":0},{"date":"2026-05-01","identities":{},"bots":0,"total":0},{"date":"2026-05-02","identities":{},"bots":0,"total":0},{"date":"2026-05-03","identities":{},"bots":0,"total":0},{"date":"2026-05-04","identities":{},"bots":0,"total":0},{"date":"2026-05-05","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-05-06","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-05-07","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-05-08","identities":{},"bots":0,"total":0},{"date":"2026-05-09","identities":{},"bots":0,"total":0},{"date":"2026-05-10","identities":{},"bots":0,"total":0},{"date":"2026-05-11","identities":{},"bots":0,"total":0},{"date":"2026-05-12","identities":{"github-work:redacted":10},"bots":0,"total":10},{"date":"2026-05-13","identities":{},"bots":0,"total":0},{"date":"2026-05-14","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-05-15","identities":{},"bots":0,"total":0},{"date":"2026-05-16","identities":{},"bots":0,"total":0},{"date":"2026-05-17","identities":{},"bots":0,"total":0},{"date":"2026-05-18","identities":{},"bots":0,"total":0},{"date":"2026-05-19","identities":{"github-work:redacted":33},"bots":0,"total":33},{"date":"2026-05-20","identities":{"github-work:redacted":4},"bots":0,"total":4},{"date":"2026-05-21","identities":{},"bots":0,"total":0},{"date":"2026-05-22","identities":{},"bots":0,"total":0},{"date":"2026-05-23","identities":{},"bots":0,"total":0},{"date":"2026-05-24","identities":{},"bots":0,"total":0},{"date":"2026-05-25","identities":{"github:personal":21},"bots":0,"total":21},{"date":"2026-05-26","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-05-27","identities":{},"bots":0,"total":0},{"date":"2026-05-28","identities":{"github-work:redacted":8},"bots":0,"total":8},{"date":"2026-05-29","identities":{},"bots":0,"total":0},{"date":"2026-05-30","identities":{},"bots":0,"total":0},{"date":"2026-05-31","identities":{},"bots":0,"total":0},{"date":"2026-06-01","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-06-02","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-06-03","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-06-04","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2026-06-05","identities":{},"bots":0,"total":0},{"date":"2026-06-06","identities":{},"bots":0,"total":0},{"date":"2026-06-07","identities":{},"bots":0,"total":0},{"date":"2026-06-08","identities":{"github-work:redacted":7},"bots":0,"total":7},{"date":"2026-06-09","identities":{"github-work:redacted":12},"bots":0,"total":12},{"date":"2026-06-10","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-06-11","identities":{},"bots":0,"total":0},{"date":"2026-06-12","identities":{},"bots":0,"total":0},{"date":"2026-06-13","identities":{},"bots":0,"total":0},{"date":"2026-06-14","identities":{},"bots":0,"total":0},{"date":"2026-06-15","identities":{},"bots":0,"total":0},{"date":"2026-06-16","identities":{"github:personal":15},"bots":0,"total":15},{"date":"2026-06-17","identities":{"github-work:redacted":13,"github:personal":15},"bots":0,"total":28},{"date":"2026-06-18","identities":{},"bots":0,"total":0},{"date":"2026-06-19","identities":{},"bots":0,"total":0},{"date":"2026-06-20","identities":{},"bots":0,"total":0},{"date":"2026-06-21","identities":{},"bots":0,"total":0},{"date":"2026-06-22","identities":{},"bots":0,"total":0},{"date":"2026-06-23","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-06-24","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-06-25","identities":{},"bots":0,"total":0},{"date":"2026-06-26","identities":{},"bots":0,"total":0},{"date":"2026-06-27","identities":{},"bots":0,"total":0},{"date":"2026-06-28","identities":{},"bots":0,"total":0},{"date":"2026-06-29","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2026-06-30","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-07-01","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2026-07-02","identities":{},"bots":0,"total":0},{"date":"2026-07-03","identities":{},"bots":0,"total":0},{"date":"2026-07-04","identities":{},"bots":0,"total":0},{"date":"2026-07-05","identities":{},"bots":0,"total":0},{"date":"2026-07-06","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-07-07","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-07-08","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-07-09","identities":{},"bots":0,"total":0},{"date":"2026-07-10","identities":{},"bots":0,"total":0},{"date":"2026-07-11","identities":{},"bots":0,"total":0},{"date":"2026-07-12","identities":{},"bots":0,"total":0},{"date":"2026-07-13","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-07-14","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-07-15","identities":{},"bots":0,"total":0},{"date":"2026-07-16","identities":{},"bots":0,"total":0},{"date":"2026-07-17","identities":{},"bots":0,"total":0},{"date":"2026-07-18","identities":{},"bots":0,"total":0},{"date":"2026-07-19","identities":{},"bots":0,"total":0},{"date":"2026-07-20","identities":{},"bots":0,"total":0},{"date":"2026-07-21","identities":{},"bots":0,"total":0},{"date":"2026-07-22","identities":{},"bots":0,"total":0},{"date":"2026-07-23","identities":{},"bots":0,"total":0},{"date":"2026-07-24","identities":{},"bots":0,"total":0},{"date":"2026-07-25","identities":{},"bots":0,"total":0},{"date":"2026-07-26","identities":{},"bots":0,"total":0},{"date":"2026-07-27","identities":{},"bots":0,"total":0},{"date":"2026-07-28","identities":{},"bots":0,"total":0},{"date":"2026-07-29","identities":{},"bots":0,"total":0},{"date":"2026-07-30","identities":{},"bots":0,"total":0},{"date":"2026-07-31","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":34},"bots":0,"total":34},{"date":"2026-08-01","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":31},"bots":0,"total":31},{"date":"2026-08-02","identities":{},"bots":0,"total":0},{"date":"2026-08-03","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":49},"bots":0,"total":49},{"date":"2026-08-04","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":14},"bots":0,"total":14},{"date":"2026-08-05","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":47,"github-work:redacted":1},"bots":0,"total":48},{"date":"2026-08-06","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":158},"bots":0,"total":158},{"date":"2026-08-07","identities":{"did:plc:ggmpabld7lsjai55okau7oip":1,"did:plc:nlzmjyfv6loqtxyzvdcznwgf":186},"bots":0,"total":187},{"date":"2026-08-08","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":200},"bots":0,"total":200},{"date":"2026-08-09","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":74},"bots":0,"total":74},{"date":"2026-08-10","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":44,"github-work:redacted":5},"bots":0,"total":49},{"date":"2026-08-11","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":177},"bots":0,"total":177},{"date":"2026-08-12","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":143,"github-work:redacted":2},"bots":0,"total":145},{"date":"2026-08-13","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":82},"bots":0,"total":82},{"date":"2026-08-14","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":19},"bots":0,"total":19},{"date":"2026-08-15","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":77},"bots":0,"total":77},{"date":"2026-08-16","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":43},"bots":0,"total":43},{"date":"2026-08-17","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":119},"bots":0,"total":119},{"date":"2026-08-18","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":70},"bots":0,"total":70},{"date":"2026-08-19","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":236},"bots":0,"total":236},{"date":"2026-08-20","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":197},"bots":0,"total":197},{"date":"2026-08-21","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":106},"bots":0,"total":106},{"date":"2026-08-22","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":31},"bots":0,"total":31},{"date":"2026-08-23","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":15},"bots":0,"total":15},{"date":"2026-08-24","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":106},"bots":0,"total":106},{"date":"2026-08-25","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":125},"bots":0,"total":125},{"date":"2026-08-26","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":130},"bots":0,"total":130},{"date":"2026-08-27","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":64},"bots":0,"total":64},{"date":"2026-08-28","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":160},"bots":0,"total":160},{"date":"2026-08-29","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":139},"bots":0,"total":139},{"date":"2026-08-30","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":178},"bots":0,"total":178},{"date":"2026-08-31","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":134},"bots":0,"total":134},{"date":"2026-09-01","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":90,"github-work:redacted":57},"bots":0,"total":147},{"date":"2026-09-02","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":123,"github-work:redacted":64},"bots":0,"total":187},{"date":"2026-09-03","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":275,"github-work:redacted":103,"github:personal":15},"bots":0,"total":393},{"date":"2026-09-04","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":179,"github-work:redacted":6},"bots":0,"total":185},{"date":"2026-09-05","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":127},"bots":0,"total":127},{"date":"2026-09-06","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":11},"bots":0,"total":11},{"date":"2026-09-07","identities":{},"bots":0,"total":0},{"date":"2026-09-08","identities":{"github-work:redacted":7},"bots":0,"total":7},{"date":"2026-09-09","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":87,"github-work:redacted":22},"bots":0,"total":109},{"date":"2026-09-10","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":57,"github-work:redacted":22},"bots":0,"total":79},{"date":"2026-09-11","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":131,"github-work:redacted":21},"bots":0,"total":152},{"date":"2026-09-12","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":74},"bots":0,"total":74},{"date":"2026-09-13","identities":{},"bots":0,"total":0},{"date":"2026-09-14","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":61,"github-work:redacted":25},"bots":0,"total":86},{"date":"2026-09-15","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":39,"github-work:redacted":54},"bots":0,"total":93},{"date":"2026-09-16","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":3,"github-work:redacted":28},"bots":0,"total":31},{"date":"2026-09-17","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":10,"github-work:redacted":47},"bots":0,"total":57},{"date":"2026-09-18","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-09-19","identities":{},"bots":0,"total":0},{"date":"2026-09-20","identities":{},"bots":0,"total":0},{"date":"2026-09-21","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":40,"github-work:redacted":8},"bots":0,"total":48},{"date":"2026-09-22","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":147,"github-work:redacted":33},"bots":0,"total":180},{"date":"2026-09-23","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":104,"github-work:redacted":12},"bots":0,"total":116},{"date":"2026-09-24","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":16,"github-work:redacted":19},"bots":0,"total":35},{"date":"2026-09-25","identities":{"github-work:redacted":5},"bots":0,"total":5},{"date":"2026-09-26","identities":{},"bots":0,"total":0},{"date":"2026-09-27","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":50},"bots":0,"total":50},{"date":"2026-09-28","identities":{},"bots":0,"total":0},{"date":"2026-09-29","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":35,"github-work:redacted":1},"bots":0,"total":36},{"date":"2026-09-30","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":7,"github-work:redacted":8},"bots":0,"total":15},{"date":"2026-10-01","identities":{"github-work:redacted":12},"bots":0,"total":12},{"date":"2026-10-02","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":7,"github-work:redacted":5,"github:personal":3},"bots":0,"total":15},{"date":"2026-10-03","identities":{},"bots":0,"total":0},{"date":"2026-10-04","identities":{},"bots":0,"total":0},{"date":"2026-10-05","identities":{"github-work:redacted":1},"bots":0,"total":1},{"date":"2026-10-06","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-10-07","identities":{"github-work:redacted":3},"bots":0,"total":3},{"date":"2026-10-08","identities":{"github-work:redacted":2},"bots":0,"total":2},{"date":"2026-10-09","identities":{"github-work:redacted":7},"bots":0,"total":7},{"date":"2026-10-10","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":19},"bots":0,"total":19},{"date":"2026-10-11","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":96},"bots":0,"total":96},{"date":"2026-10-12","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":52},"bots":0,"total":52},{"date":"2026-10-13","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":8},"bots":0,"total":8},{"date":"2026-10-14","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":88,"github-work:redacted":26},"bots":0,"total":114},{"date":"2026-10-15","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":103,"github-work:redacted":17},"bots":0,"total":120},{"date":"2026-10-16","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":127,"github-work:redacted":1},"bots":0,"total":128},{"date":"2026-10-17","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":50},"bots":0,"total":50},{"date":"2026-10-18","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":3},"bots":0,"total":3},{"date":"2026-10-19","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":34,"github-work:redacted":18,"github:personal":55},"bots":0,"total":107},{"date":"2026-10-20","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":62,"github-work:redacted":6,"github:personal":34},"bots":38,"total":140},{"date":"2026-10-21","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":15,"github:personal":15},"bots":23,"total":53},{"date":"2026-10-22","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":38},"bots":85,"total":123},{"date":"2026-10-23","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":25},"bots":0,"total":25},{"date":"2026-10-24","identities":{},"bots":0,"total":0},{"date":"2026-10-25","identities":{"did:plc:nlzmjyfv6loqtxyzvdcznwgf":36},"bots":37,"total":73}],"hourly":{"series":["did:plc:ggmpabld7lsjai55okau7oip","did:plc:nlzmjyfv6loqtxyzvdcznwgf","github-work:redacted","github:personal","bots"],"rows":[[489331,0,0,3,0,0],[489350,0,0,4,0,0],[489354,0,0,2,0,0],[489375,0,0,1,0,0],[489377,0,0,1,0,0],[489520,0,0,1,0,0],[489522,0,0,1,0,0],[489523,0,0,1,0,0],[489543,0,0,1,0,0],[489544,0,0,2,0,0],[489545,0,0,1,0,0],[489550,0,0,1,0,0],[489591,0,0,2,0,0],[489592,0,0,4,0,0],[489665,0,0,4,0,0],[489666,0,0,5,0,0],[489667,0,0,1,0,0],[489709,0,0,1,0,0],[489711,0,0,7,0,0],[489712,0,0,6,0,0],[489734,0,0,3,0,0],[489735,0,0,2,0,0],[489762,0,0,1,0,0],[489858,0,0,1,0,0],[489877,0,0,1,0,0],[489879,0,0,1,0,0],[490000,0,0,2,0,0],[490002,0,0,6,0,0],[490003,0,0,1,0,0],[490004,0,0,1,0,0],[490148,0,0,0,5,0],[490149,0,0,0,2,0],[490151,0,0,0,1,0],[490219,0,0,2,0,0],[490239,0,0,1,0,0],[490242,0,0,1,0,0],[490244,0,0,1,0,0],[490261,0,0,1,0,0],[490264,0,0,2,0,0],[490357,0,0,1,0,0],[490358,0,0,4,0,0],[490359,0,0,1,0,0],[490363,0,0,1,0,0],[490364,0,0,1,0,0],[490386,0,0,0,3,0],[490390,0,0,0,3,0],[490413,0,0,0,3,0],[490549,0,0,1,0,0],[490696,0,0,2,0,0],[491394,0,0,1,0,0],[491395,0,0,1,0,0],[491443,0,0,1,0,0],[491513,0,0,1,0,0],[491516,0,0,0,2,0],[491682,0,0,3,0,0],[491702,0,0,1,0,0],[491727,0,0,1,0,0],[491755,0,0,1,0,0],[491895,0,0,1,0,0],[492039,0,0,1,0,0],[492043,0,0,1,0,0],[492063,0,0,4,0,0],[492064,0,0,4,0,0],[492065,0,0,5,0,0],[492066,0,0,3,0,0],[492089,0,0,1,0,0],[492090,0,0,16,0,0],[492212,0,0,1,0,0],[492231,0,0,1,0,0],[492232,0,0,1,0,0],[492279,0,0,0,1,0],[492280,0,0,0,2,0],[492281,0,0,0,8,0],[492282,0,0,0,3,0],[492328,0,0,0,1,0],[492329,0,0,0,2,0],[492330,0,0,0,4,0],[492331,0,0,0,2,0],[492332,0,0,0,2,0],[492353,0,0,0,2,0],[492372,0,0,0,4,0],[492373,0,0,0,6,0],[492374,0,0,0,3,0],[492375,0,0,0,1,0],[492376,0,0,0,11,0],[492377,0,0,0,5,0],[492378,0,0,0,1,0],[492398,0,0,0,1,0],[492399,0,0,0,1,0],[492400,0,0,0,2,0],[492401,0,0,0,6,0],[492402,0,0,0,4,0],[492446,0,0,0,1,0],[492447,0,0,0,4,0],[492468,0,0,0,2,0],[492469,0,0,0,1,0],[492470,0,0,0,4,0],[492471,0,0,0,1,0],[492504,0,0,0,18,0],[492505,0,0,0,3,0],[492567,0,0,2,0,0],[492568,0,0,1,0,0],[492571,0,0,1,0,0],[492907,0,0,1,0,0],[492951,0,0,1,0,0],[493070,0,0,1,0,0],[493074,0,0,9,0,0],[493097,0,0,3,0,0],[493098,0,0,2,0,0],[493099,0,0,1,0,0],[493119,0,0,1,0,0],[493189,0,0,1,0,0],[493190,0,0,1,0,0],[493191,0,0,1,0,0],[493193,0,0,3,0,0],[493194,0,0,2,0,0],[493196,0,0,10,0,0],[493197,0,0,2,0,0],[493198,0,0,8,0,0],[493217,0,0,4,0,0],[493219,0,0,2,0,0],[493220,0,0,4,0,0],[493237,0,0,5,0,0],[493260,0,0,7,0,0],[493410,0,0,0,1,0],[493428,0,0,1,0,0],[493429,0,0,3,0,0],[493430,0,0,3,0,0],[493455,0,0,1,0,0],[493556,0,0,1,0,0],[493697,0,0,1,0,0],[493698,0,0,2,0,0],[493719,0,0,1,0,0],[493726,0,0,1,0,0],[493746,0,0,7,0,0],[493747,0,0,8,0,0],[493748,0,0,8,0,0],[493886,0,0,1,0,0],[493910,0,0,3,0,0],[493936,0,0,3,0,0],[494052,0,0,1,0,0],[494053,0,0,3,0,0],[494054,0,0,3,0,0],[494055,0,0,1,0,0],[494056,0,0,2,0,0],[494104,0,0,1,0,0],[494221,0,0,2,0,0],[494222,0,0,8,0,0],[494223,0,0,10,0,0],[494225,0,0,11,0,0],[494226,0,0,2,0,0],[494245,0,0,4,0,0],[494371,0,0,0,15,0],[494372,0,0,0,6,0],[494389,0,0,1,0,0],[494436,0,0,1,0,0],[494437,0,0,5,0,0],[494438,0,0,1,0,0],[494443,0,0,1,0,0],[494534,0,0,1,0,0],[494557,0,0,2,0,0],[494582,0,0,3,0,0],[494612,0,0,3,0,0],[494613,0,0,1,0,0],[494614,0,0,1,0,0],[494702,0,0,2,0,0],[494703,0,0,3,0,0],[494705,0,0,2,0,0],[494726,0,0,8,0,0],[494727,0,0,2,0,0],[494729,0,0,1,0,0],[494734,0,0,1,0,0],[494755,0,0,1,0,0],[494756,0,0,1,0,0],[494902,0,0,0,2,0],[494903,0,0,0,13,0],[494904,0,0,0,7,0],[494905,0,0,0,8,0],[494916,0,0,5,0,0],[494917,0,0,5,0,0],[494918,0,0,1,0,0],[494920,0,0,1,0,0],[494922,0,0,1,0,0],[495066,0,0,1,0,0],[495090,0,0,1,0,0],[495209,0,0,3,0,0],[495211,0,0,2,0,0],[495235,0,0,1,0,0],[495253,0,0,1,0,0],[495254,0,0,2,0,0],[495255,0,0,1,0,0],[495259,0,0,1,0,0],[495372,0,0,3,0,0],[495405,0,0,1,0,0],[495425,0,0,1,0,0],[495544,0,0,1,0,0],[495567,0,0,1,0,0],[495974,0,1,0,0,0],[495975,0,1,0,0,0],[495978,0,1,0,0,0],[495979,0,17,0,0,0],[495980,0,10,0,0,0],[495981,0,4,0,0,0],[495985,0,2,0,0,0],[495986,0,2,0,0,0],[495987,0,3,0,0,0],[495988,0,7,0,0,0],[495989,0,6,0,0,0],[496003,0,5,0,0,0],[496004,0,4,0,0,0],[496005,0,2,0,0,0],[496044,0,5,0,0,0],[496045,0,16,0,0,0],[496046,0,3,0,0,0],[496047,0,9,0,0,0],[496048,0,2,0,0,0],[496049,0,8,0,0,0],[496050,0,3,0,0,0],[496051,0,3,0,0,0],[496069,0,7,0,0,0],[496070,0,3,0,0,0],[496075,0,2,0,0,0],[496076,0,2,0,0,0],[496080,0,3,0,0,0],[496081,0,4,0,0,0],[496082,0,2,0,0,0],[496095,0,0,1,0,0],[496096,0,1,0,0,0],[496097,0,6,0,0,0],[496098,0,14,0,0,0],[496099,0,15,0,0,0],[496100,0,2,0,0,0],[496105,0,2,0,0,0],[496115,0,6,0,0,0],[496116,0,13,0,0,0],[496117,0,19,0,0,0],[496118,0,7,0,0,0],[496119,0,16,0,0,0],[496120,0,13,0,0,0],[496121,0,8,0,0,0],[496122,0,18,0,0,0],[496123,0,1,0,0,0],[496124,0,4,0,0,0],[496125,0,7,0,0,0],[496126,0,27,0,0,0],[496127,0,17,0,0,0],[496128,0,8,0,0,0],[496129,0,19,0,0,0],[496130,0,10,0,0,0],[496131,0,9,0,0,0],[496132,0,2,0,0,0],[496145,0,4,0,0,0],[496146,0,13,0,0,0],[496147,0,23,0,0,0],[496148,0,12,0,0,0],[496149,1,25,0,0,0],[496150,0,37,0,0,0],[496151,0,24,0,0,0],[496152,0,30,0,0,0],[496153,0,22,0,0,0],[496154,0,5,0,0,0],[496169,0,2,0,0,0],[496170,0,30,0,0,0],[496171,0,22,0,0,0],[496172,0,32,0,0,0],[496173,0,27,0,0,0],[496174,0,10,0,0,0],[496175,0,20,0,0,0],[496176,0,11,0,0,0],[496177,0,3,0,0,0],[496189,0,3,0,0,0],[496191,0,7,0,0,0],[496192,0,4,0,0,0],[496195,0,5,0,0,0],[496196,0,4,0,0,0],[496197,0,14,0,0,0],[496198,0,16,0,0,0],[496199,0,7,0,0,0],[496200,0,13,0,0,0],[496201,0,5,0,0,0],[496217,0,0,2,0,0],[496218,0,0,3,0,0],[496222,0,2,0,0,0],[496223,0,24,0,0,0],[496224,0,8,0,0,0],[496225,0,17,0,0,0],[496226,0,11,0,0,0],[496227,0,8,0,0,0],[496228,0,1,0,0,0],[496237,0,3,0,0,0],[496238,0,11,0,0,0],[496239,0,8,0,0,0],[496240,0,12,0,0,0],[496241,0,29,0,0,0],[496242,0,53,0,0,0],[496243,0,16,0,0,0],[496261,0,10,0,0,0],[496262,0,22,0,0,0],[496263,0,38,2,0,0],[496265,0,2,0,0,0],[496266,0,7,0,0,0],[496267,0,11,0,0,0],[496268,0,7,0,0,0],[496269,0,13,0,0,0],[496270,0,21,0,0,0],[496271,0,12,0,0,0],[496272,0,6,0,0,0],[496273,0,5,0,0,0],[496286,0,7,0,0,0],[496287,0,1,0,0,0],[496288,0,8,0,0,0],[496289,0,19,0,0,0],[496291,0,24,0,0,0],[496292,0,12,0,0,0],[496315,0,1,0,0,0],[496317,0,15,0,0,0],[496318,0,3,0,0,0],[496323,0,18,0,0,0],[496324,0,4,0,0,0],[496331,0,2,0,0,0],[496332,0,17,0,0,0],[496333,0,7,0,0,0],[496334,0,8,0,0,0],[496335,0,6,0,0,0],[496336,0,2,0,0,0],[496337,0,1,0,0,0],[496338,0,7,0,0,0],[496341,0,5,0,0,0],[496361,0,3,0,0,0],[496362,0,8,0,0,0],[496363,0,14,0,0,0],[496364,0,8,0,0,0],[496365,0,4,0,0,0],[496366,0,2,0,0,0],[496367,0,4,0,0,0],[496369,0,2,0,0,0],[496370,0,12,0,0,0],[496382,0,16,0,0,0],[496383,0,13,0,0,0],[496384,0,22,0,0,0],[496385,0,6,0,0,0],[496386,0,9,0,0,0],[496387,0,24,0,0,0],[496388,0,2,0,0,0],[496389,0,6,0,0,0],[496390,0,1,0,0,0],[496391,0,6,0,0,0],[496392,0,5,0,0,0],[496393,0,1,0,0,0],[496406,0,9,0,0,0],[496407,0,7,0,0,0],[496410,0,8,0,0,0],[496411,0,7,0,0,0],[496412,0,7,0,0,0],[496413,0,11,0,0,0],[496414,0,10,0,0,0],[496415,0,5,0,0,0],[496416,0,17,0,0,0],[496417,0,23,0,0,0],[496418,0,14,0,0,0],[496419,0,5,0,0,0],[496420,0,10,0,0,0],[496421,0,5,0,0,0],[496430,0,23,0,0,0],[496431,0,11,0,0,0],[496432,0,12,0,0,0],[496433,0,14,0,0,0],[496434,0,8,0,0,0],[496435,0,15,0,0,0],[496436,0,20,0,0,0],[496437,0,17,0,0,0],[496438,0,19,0,0,0],[496439,0,23,0,0,0],[496440,0,23,0,0,0],[496441,0,9,0,0,0],[496442,0,7,0,0,0],[496443,0,12,0,0,0],[496444,0,7,0,0,0],[496452,0,7,0,0,0],[496453,0,6,0,0,0],[496454,0,9,0,0,0],[496455,0,8,0,0,0],[496456,0,1,0,0,0],[496457,0,3,0,0,0],[496458,0,11,0,0,0],[496459,0,21,0,0,0],[496460,0,21,0,0,0],[496461,0,19,0,0,0],[496462,0,17,0,0,0],[496463,0,16,0,0,0],[496464,0,9,0,0,0],[496465,0,4,0,0,0],[496466,0,10,0,0,0],[496467,0,3,0,0,0],[496476,0,4,0,0,0],[496477,0,7,0,0,0],[496478,0,9,0,0,0],[496479,0,13,0,0,0],[496480,0,15,0,0,0],[496481,0,9,0,0,0],[496482,0,5,0,0,0],[496483,0,5,0,0,0],[496484,0,3,0,0,0],[496485,0,8,0,0,0],[496486,0,2,0,0,0],[496488,0,2,0,0,0],[496492,0,2,0,0,0],[496500,0,7,0,0,0],[496501,0,3,0,0,0],[496502,0,2,0,0,0],[496503,0,1,0,0,0],[496505,0,1,0,0,0],[496506,0,2,0,0,0],[496507,0,2,0,0,0],[496508,0,2,0,0,0],[496509,0,2,0,0,0],[496510,0,5,0,0,0],[496524,0,2,0,0,0],[496528,0,2,0,0,0],[496529,0,6,0,0,0],[496531,0,4,0,0,0],[496532,0,1,0,0,0],[496539,0,6,0,0,0],[496550,0,6,0,0,0],[496552,0,4,0,0,0],[496553,0,1,0,0,0],[496554,0,28,0,0,0],[496555,0,4,0,0,0],[496556,0,5,0,0,0],[496557,0,13,0,0,0],[496558,0,22,0,0,0],[496559,0,17,0,0,0],[496560,0,15,0,0,0],[496561,0,20,0,0,0],[496562,0,3,0,0,0],[496563,0,5,0,0,0],[496573,0,8,0,0,0],[496574,0,5,0,0,0],[496575,0,3,0,0,0],[496576,0,6,0,0,0],[496577,0,10,0,0,0],[496578,0,6,0,0,0],[496579,0,5,0,0,0],[496580,0,23,0,0,0],[496581,0,6,0,0,0],[496582,0,4,0,0,0],[496583,0,6,0,0,0],[496585,0,22,0,0,0],[496587,0,4,0,0,0],[496596,0,4,0,0,0],[496597,0,18,0,0,0],[496598,0,10,0,0,0],[496599,0,26,0,0,0],[496600,0,2,0,0,0],[496601,0,17,0,0,0],[496602,0,25,0,0,0],[496603,0,2,0,0,0],[496608,0,5,0,0,0],[496609,0,7,0,0,0],[496610,0,6,0,0,0],[496611,0,1,0,0,0],[496621,0,4,0,0,0],[496623,0,7,0,0,0],[496624,0,2,0,0,0],[496625,0,6,0,0,0],[496626,0,13,0,0,0],[496627,0,12,0,0,0],[496631,0,1,0,0,0],[496632,0,7,0,0,0],[496633,0,2,0,0,0],[496634,0,10,0,0,0],[496635,0,13,0,0,0],[496636,0,9,0,0,0],[496637,0,3,0,0,0],[496644,0,2,0,0,0],[496645,0,11,0,0,0],[496646,0,8,0,0,0],[496647,0,7,0,0,0],[496648,0,11,0,0,0],[496649,0,8,0,0,0],[496650,0,6,0,0,0],[496651,0,11,0,0,0],[496652,0,6,0,0,0],[496653,0,7,0,0,0],[496654,0,17,0,0,0],[496655,0,22,0,0,0],[496656,0,23,0,0,0],[496657,0,20,0,0,0],[496658,0,6,0,0,0],[496659,0,13,0,0,0],[496660,0,29,0,0,0],[496661,0,22,0,0,0],[496662,0,15,0,0,0],[496663,0,5,0,0,0],[496664,0,2,0,0,0],[496666,0,4,0,0,0],[496681,0,6,0,0,0],[496682,0,17,0,0,0],[496683,0,18,0,0,0],[496684,0,13,0,0,0],[496685,0,3,0,0,0],[496686,0,15,0,0,0],[496687,0,8,0,0,0],[496692,0,10,0,0,0],[496693,0,9,0,0,0],[496694,0,16,0,0,0],[496695,0,2,0,0,0],[496696,0,5,0,0,0],[496697,0,7,0,0,0],[496698,0,5,0,0,0],[496700,0,13,0,0,0],[496701,0,20,0,0,0],[496702,0,3,0,0,0],[496703,0,8,0,0,0],[496704,0,15,0,0,0],[496705,0,1,0,0,0],[496706,0,3,0,0,0],[496707,0,1,0,0,0],[496709,0,1,0,0,0],[496710,0,1,0,0,0],[496711,0,1,0,0,0],[496715,0,10,0,0,0],[496716,0,12,0,0,0],[496717,0,13,0,0,0],[496718,0,2,0,0,0],[496719,0,2,0,0,0],[496720,0,17,0,0,0],[496721,0,12,0,0,0],[496722,0,6,0,0,0],[496723,0,3,0,0,0],[496724,0,15,0,0,0],[496725,0,11,0,0,0],[496726,0,7,0,0,0],[496727,0,1,0,0,0],[496742,0,2,2,0,0],[496743,0,21,42,0,0],[496744,0,3,7,0,0],[496745,0,32,0,0,0],[496746,0,14,4,0,0],[496747,0,16,2,0,0],[496751,0,2,0,0,0],[496752,0,2,0,0,0],[496753,0,1,0,0,0],[496754,0,13,0,0,0],[496755,0,16,0,0,0],[496756,0,20,0,0,0],[496757,0,8,0,0,0],[496766,0,1,1,0,0],[496767,0,5,8,0,0],[496768,0,2,21,0,0],[496769,0,7,15,0,0],[496770,0,6,13,0,0],[496771,0,12,6,0,0],[496772,0,9,0,0,0],[496773,0,8,0,0,0],[496774,0,10,0,0,0],[496775,0,3,0,0,0],[496776,0,5,0,0,0],[496777,0,18,0,0,0],[496778,0,22,0,0,0],[496779,0,21,0,0,0],[496780,0,16,0,0,0],[496781,0,17,0,0,0],[496782,0,24,0,0,0],[496783,0,7,0,0,0],[496784,0,8,0,0,0],[496785,0,10,0,0,0],[496786,0,16,0,0,0],[496787,0,6,5,0,0],[496788,0,8,7,0,0],[496789,0,1,14,0,0],[496790,0,0,27,0,0],[496791,0,4,14,5,0],[496792,0,1,17,8,0],[496793,0,9,4,2,0],[496794,0,25,13,0,0],[496795,0,12,2,0,0],[496796,0,8,0,0,0],[496797,0,18,0,0,0],[496798,0,14,0,0,0],[496799,0,5,0,0,0],[496800,0,5,0,0,0],[496801,0,12,2,0,0],[496802,0,6,3,0,0],[496803,0,17,1,0,0],[496804,0,10,0,0,0],[496805,0,3,0,0,0],[496806,0,1,0,0,0],[496811,0,4,0,0,0],[496812,0,13,0,0,0],[496813,0,17,0,0,0],[496814,0,26,0,0,0],[496815,0,14,0,0,0],[496816,0,7,0,0,0],[496817,0,5,0,0,0],[496818,0,11,0,0,0],[496819,0,3,0,0,0],[496820,0,10,0,0,0],[496821,0,5,0,0,0],[496822,0,8,0,0,0],[496823,0,2,0,0,0],[496824,0,1,0,0,0],[496825,0,5,0,0,0],[496826,0,8,0,0,0],[496827,0,4,0,0,0],[496828,0,3,0,0,0],[496829,0,5,0,0,0],[496830,0,3,0,0,0],[496835,0,1,0,0,0],[496836,0,11,0,0,0],[496837,0,3,0,0,0],[496840,0,8,0,0,0],[496841,0,5,0,0,0],[496842,0,11,0,0,0],[496843,0,15,0,0,0],[496846,0,6,0,0,0],[496847,0,38,0,0,0],[496848,0,11,0,0,0],[496911,0,0,2,0,0],[496913,0,0,2,0,0],[496915,0,0,3,0,0],[496932,0,18,3,0,0],[496933,0,14,2,0,0],[496934,0,21,4,0,0],[496936,0,0,2,0,0],[496937,0,0,2,0,0],[496938,0,7,4,0,0],[496939,0,15,1,0,0],[496940,0,6,3,0,0],[496941,0,6,1,0,0],[496955,0,2,3,0,0],[496956,0,8,2,0,0],[496958,0,0,1,0,0],[496959,0,1,0,0,0],[496960,0,0,2,0,0],[496961,0,2,1,0,0],[496962,0,6,1,0,0],[496963,0,18,2,0,0],[496964,0,6,3,0,0],[496965,0,13,3,0,0],[496966,0,0,1,0,0],[496967,0,1,3,0,0],[496968,0,0,2,0,0],[496978,0,0,3,0,0],[496980,0,4,0,0,0],[496981,0,17,0,0,0],[496982,0,19,3,0,0],[496983,0,10,4,0,0],[496985,0,8,3,0,0],[496986,0,4,0,0,0],[496987,0,3,0,0,0],[496988,0,27,4,0,0],[496989,0,12,2,0,0],[496990,0,12,0,0,0],[496991,0,15,0,0,0],[496992,0,16,0,0,0],[496993,0,5,0,0,0],[497004,0,7,0,0,0],[497005,0,13,0,0,0],[497006,0,8,0,0,0],[497007,0,3,0,0,0],[497008,0,10,0,0,0],[497009,0,7,0,0,0],[497013,0,4,0,0,0],[497014,0,1,0,0,0],[497053,0,0,2,0,0],[497054,0,3,0,0,0],[497055,0,9,0,0,0],[497056,0,16,0,0,0],[497057,0,2,1,0,0],[497058,0,4,0,0,0],[497059,0,9,3,0,0],[497060,0,8,11,0,0],[497061,0,9,8,0,0],[497063,0,1,0,0,0],[497076,0,0,3,0,0],[497077,0,4,3,0,0],[497078,0,10,14,0,0],[497079,0,9,8,0,0],[497080,0,2,6,0,0],[497081,0,10,13,0,0],[497082,0,4,5,0,0],[497083,0,0,2,0,0],[497101,0,0,3,0,0],[497102,0,0,3,0,0],[497103,0,0,12,0,0],[497104,0,0,2,0,0],[497105,0,0,3,0,0],[497107,0,0,1,0,0],[497108,0,0,1,0,0],[497109,0,3,3,0,0],[497125,0,0,8,0,0],[497126,0,0,9,0,0],[497127,0,0,18,0,0],[497128,0,0,4,0,0],[497129,0,8,7,0,0],[497130,0,2,1,0,0],[497148,0,0,2,0,0],[497209,0,4,0,0,0],[497210,0,3,0,0,0],[497222,0,7,0,0,0],[497223,0,7,0,0,0],[497224,0,4,4,0,0],[497227,0,0,4,0,0],[497228,0,13,0,0,0],[497231,0,2,0,0,0],[497243,0,3,4,0,0],[497244,0,26,4,0,0],[497245,0,18,1,0,0],[497246,0,9,1,0,0],[497247,0,7,12,0,0],[497248,0,3,0,0,0],[497249,0,2,1,0,0],[497250,0,26,1,0,0],[497251,0,21,8,0,0],[497252,0,14,1,0,0],[497253,0,11,0,0,0],[497254,0,7,0,0,0],[497268,0,4,2,0,0],[497269,0,14,5,0,0],[497270,0,18,1,0,0],[497271,0,15,0,0,0],[497272,0,15,0,0,0],[497273,0,17,0,0,0],[497274,0,17,1,0,0],[497275,0,4,0,0,0],[497276,0,0,3,0,0],[497293,0,0,4,0,0],[497295,0,0,3,0,0],[497297,0,0,1,0,0],[497299,0,0,7,0,0],[497301,0,4,3,0,0],[497303,0,12,1,0,0],[497316,0,0,2,0,0],[497317,0,0,1,0,0],[497319,0,0,2,0,0],[497365,0,8,0,0,0],[497366,0,34,0,0,0],[497367,0,8,0,0,0],[497411,0,0,1,0,0],[497412,0,7,0,0,0],[497413,0,5,0,0,0],[497414,0,6,0,0,0],[497415,0,9,0,0,0],[497416,0,2,0,0,0],[497417,0,3,0,0,0],[497418,0,3,0,0,0],[497439,0,5,0,0,0],[497440,0,2,0,0,0],[497445,0,0,5,0,0],[497446,0,0,1,0,0],[497447,0,0,2,0,0],[497448,0,0,1,0,0],[497462,0,0,1,0,0],[497463,0,0,2,0,0],[497466,0,0,3,0,0],[497467,0,0,2,0,0],[497468,0,0,1,0,0],[497469,0,0,2,0,0],[497487,0,0,0,3,0],[497488,0,0,3,0,0],[497489,0,7,2,0,0],[497563,0,0,1,0,0],[497582,0,0,1,0,0],[497590,0,0,2,0,0],[497605,0,0,2,0,0],[497613,0,0,1,0,0],[497631,0,0,1,0,0],[497638,0,0,1,0,0],[497654,0,0,2,0,0],[497655,0,0,1,0,0],[497656,0,0,3,0,0],[497658,0,0,1,0,0],[497684,0,7,0,0,0],[497685,0,1,0,0,0],[497686,0,4,0,0,0],[497687,0,7,0,0,0],[497688,0,8,0,0,0],[497689,0,13,0,0,0],[497690,0,6,0,0,0],[497691,0,2,0,0,0],[497692,0,12,0,0,0],[497693,0,3,0,0,0],[497700,0,1,0,0,0],[497701,0,7,0,0,0],[497702,0,13,0,0,0],[497703,0,7,0,0,0],[497704,0,9,0,0,0],[497706,0,3,0,0,0],[497707,0,12,0,0,0],[497712,0,1,0,0,0],[497713,0,1,0,0,0],[497716,0,2,0,0,0],[497717,0,2,0,0,0],[497718,0,2,0,0,0],[497724,0,5,0,0,0],[497725,0,3,0,0,0],[497731,0,1,0,0,0],[497732,0,6,0,0,0],[497733,0,2,0,0,0],[497734,0,11,0,0,0],[497735,0,16,0,0,0],[497736,0,8,0,0,0],[497771,0,0,2,0,0],[497772,0,1,2,0,0],[497773,0,2,0,0,0],[497774,0,19,4,0,0],[497775,0,7,0,0,0],[497776,0,2,0,0,0],[497777,0,11,12,0,0],[497778,0,6,4,0,0],[497779,0,19,0,0,0],[497780,0,2,0,0,0],[497781,0,10,0,0,0],[497782,0,4,1,0,0],[497783,0,5,1,0,0],[497784,0,10,0,0,0],[497785,0,2,0,0,0],[497795,0,0,1,0,0],[497796,0,7,1,0,0],[497797,0,4,1,0,0],[497798,0,5,0,0,0],[497799,0,16,4,0,0],[497800,0,5,2,0,0],[497801,0,4,4,0,0],[497802,0,2,3,0,0],[497803,0,12,1,0,0],[497804,0,14,0,0,0],[497805,0,6,0,0,0],[497806,0,15,0,0,0],[497807,0,1,0,0,0],[497820,0,16,0,0,0],[497821,0,19,0,0,0],[497822,0,6,0,0,0],[497823,0,12,0,0,0],[497824,0,42,1,0,0],[497825,0,11,0,0,0],[497826,0,3,0,0,0],[497828,0,1,0,0,0],[497829,0,2,0,0,0],[497830,0,7,0,0,0],[497831,0,8,0,0,0],[497832,0,2,0,0,0],[497835,0,2,0,0,0],[497847,0,3,0,0,0],[497850,0,15,0,0,0],[497851,0,21,0,0,0],[497852,0,7,0,0,0],[497870,0,2,0,0,0],[497873,0,1,0,0,0],[497894,0,10,3,0,0],[497895,0,12,4,4,0],[497896,0,4,3,3,0],[497898,0,6,4,3,0],[497899,0,0,3,15,0],[497900,0,0,0,3,0],[497901,0,0,1,10,0],[497902,0,1,0,15,0],[497903,0,1,0,2,0],[497917,0,0,0,3,0],[497918,0,0,2,14,0],[497919,0,5,1,6,1],[497920,0,2,1,2,0],[497921,0,4,0,0,1],[497922,0,2,1,0,0],[497923,0,11,0,0,8],[497924,0,7,1,1,6],[497925,0,20,0,3,4],[497926,0,8,0,2,7],[497927,0,3,0,3,11],[497928,0,0,0,8,4],[497929,0,3,0,6,3],[497930,0,0,0,1,1],[497932,0,0,0,0,1],[497933,0,0,0,0,2],[497940,0,5,0,0,0],[497941,0,0,0,0,3],[497942,0,0,0,0,4],[497943,0,1,0,0,2],[497944,0,6,0,0,2],[497945,0,0,0,0,1],[497953,0,0,0,0,1],[497955,0,0,0,0,1],[497959,0,0,0,0,3],[497966,0,2,0,0,3],[497967,0,7,0,0,7],[497968,0,10,0,0,3],[497969,0,6,0,0,5],[497970,0,0,0,0,31],[497971,0,1,0,0,13],[497972,0,7,0,0,14],[497973,0,1,0,0,4],[497974,0,4,0,0,0],[497991,0,9,0,0,0],[497992,0,15,0,0,0],[497993,0,1,0,0,0],[498039,0,3,0,0,3],[498040,0,4,0,0,0],[498041,0,10,0,0,12],[498042,0,13,0,0,5],[498043,0,1,0,0,9],[498044,0,5,0,0,0],[498045,0,0,0,0,5],[498046,0,0,0,0,3]]},"commit_types":{"weeks":["2025-10-20","2025-10-27","2025-11-03","2025-11-10","2025-11-17","2025-11-24","2025-12-01","2025-12-08","2025-12-15","2025-12-22","2025-12-29","2026-01-05","2026-01-12","2026-01-19","2026-01-26","2026-02-02","2026-02-09","2026-02-16","2026-02-23","2026-03-02","2026-03-09","2026-03-16","2026-03-23","2026-03-30","2026-04-06","2026-04-13","2026-04-20","2026-04-27","2026-05-04","2026-05-11","2026-05-18","2026-05-25","2026-06-01","2026-06-08","2026-06-15","2026-06-22","2026-06-29","2026-07-06","2026-07-13","2026-07-20","2026-07-27","2026-08-03","2026-08-10","2026-08-17","2026-08-24","2026-08-31","2026-09-07","2026-09-14","2026-09-21","2026-09-28","2026-10-05","2026-10-12","2026-10-19"],"types":[{"name":"feat","total":2034,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,214,374,336,266,125,26,95,19,35,199,115]},{"name":"fix","total":1312,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,128,147,149,191,115,34,108,11,71,122,148]},{"name":"docs","total":1199,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,113,140,137,244,252,57,24,77,10,4,51,86]},{"name":"test","total":412,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,26,43,63,142,23,3,40,3,0,15,12]},{"name":"refactor","total":317,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,45,51,56,45,11,21,30,2,2,9,11]},{"name":"build","total":102,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,16,2,20,17,3,3,4,1,0,9,1]},{"name":"perf","total":99,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,2,8,25,16,12,2,0,1,2,13,11]},{"name":"chore","total":81,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,10,8,5,5,2,0,0,0,1,12,8]},{"name":"style","total":19,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,3,2,2,5,0,0,0,1,0,0,0]},{"name":"other","total":15,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,0,0,1,0,0,0,0,0,0,0,0]},{"name":"ci","total":7,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,3,1,0,0,1]},{"name":"revert","total":2,"weekly":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0]}],"untyped":202,"no_subject":1327},"land_gap":{"gaps":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,10,11,12,13,13,13,13,13,15,15,16,16,18,18,19,21,21,22,24,25,29,30,33,34,34,37,43,44,45,47,49,51,52,52,52,52,54,54,56,56,57,57,57,57,58,59,60,60,60,61,62,64,65,65,65,66,66,66,67,67,68,69,69,70,70,70,72,72,72,73,73,74,76,76,77,78,79,79,79,81,82,82,83,84,85,85,85,86,87,88,89,89,90,90,90,91,91,92,92,95,96,96,98,98,98,99,99,99,101,101,101,101,102,102,102,102,103,103,104,105,105,105,105,106,106,107,107,108,109,109,109,110,110,112,113,114,114,114,114,116,116,117,117,118,120,120,120,120,120,121,121,122,122,122,123,123,124,124,124,125,125,125,125,126,126,127,127,128,128,128,128,128,129,130,130,130,130,131,132,132,134,134,134,134,134,135,135,136,136,136,137,137,137,138,139,139,139,139,139,140,140,140,140,140,141,141,141,142,142,144,145,145,146,147,147,148,149,149,150,151,151,152,152,153,154,155,155,155,155,155,155,155,156,156,156,156,157,158,158,158,159,159,160,160,161,162,162,163,163,165,165,167,167,168,168,169,169,169,171,171,171,171,172,172,173,174,174,174,174,176,176,176,177,177,177,179,179,180,182,182,182,183,183,183,184,184,184,184,184,186,186,186,187,187,187,187,187,188,188,189,190,190,191,191,194,194,194,194,195,195,196,196,196,197,197,197,198,198,199,200,201,201,201,201,202,203,204,204,204,206,207,208,208,208,209,210,211,211,212,212,212,212,213,213,214,214,216,217,218,218,218,219,219,219,220,220,220,221,222,223,223,223,225,226,227,229,229,231,231,231,231,232,232,232,232,232,232,233,235,235,235,236,236,237,237,238,238,238,239,239,239,240,241,242,242,242,243,243,244,244,244,245,245,245,245,246,247,247,247,249,249,249,249,251,251,252,253,253,253,254,255,255,255,255,256,256,256,257,258,258,258,258,259,259,260,260,260,261,261,262,262,266,266,266,267,267,267,268,268,269,269,270,271,271,271,271,271,272,272,273,273,273,275,275,276,277,279,279,280,280,281,282,283,283,284,286,286,287,287,289,289,290,290,290,292,295,295,295,295,295,297,298,299,300,301,305,307,308,309,311,311,312,313,315,317,318,319,319,320,320,321,321,322,322,323,323,323,324,324,324,325,325,326,327,327,327,328,329,330,331,332,332,332,332,334,335,337,337,338,338,338,339,340,340,341,341,342,342,343,343,344,344,344,344,345,345,345,349,349,349,350,350,351,351,351,351,353,354,355,355,356,356,357,357,359,359,360,360,360,361,362,363,363,363,363,363,363,364,364,364,364,365,366,366,366,367,367,368,368,368,368,368,370,370,370,370,371,371,371,374,375,375,375,377,379,380,381,381,381,381,382,383,383,385,385,385,385,386,386,388,388,389,389,392,392,395,396,396,397,398,398,399,399,400,400,401,401,402,402,403,406,406,407,407,407,408,410,411,412,413,414,417,417,418,419,422,422,422,425,425,425,426,426,426,427,427,428,429,430,431,431,431,431,432,433,433,433,434,434,435,435,435,436,438,439,442,443,443,445,446,446,449,451,451,451,451,452,453,454,454,456,457,457,460,461,461,461,461,464,465,465,466,467,467,468,468,470,470,471,471,471,473,473,474,474,475,475,477,478,479,479,480,480,480,481,481,481,482,483,483,486,486,488,488,489,491,492,492,493,493,493,493,493,494,494,494,494,497,498,499,500,501,501,502,502,502,503,504,504,505,505,506,506,506,507,508,508,508,509,509,510,510,510,510,510,514,514,514,517,517,517,518,518,519,519,519,519,520,520,520,520,522,523,526,526,527,527,527,527,527,529,530,530,530,531,532,532,533,533,535,536,537,537,538,539,539,540,542,542,544,544,544,544,545,546,547,549,550,551,552,553,553,554,555,555,557,558,558,561,562,562,563,564,564,566,567,567,568,570,570,570,571,571,571,572,573,573,574,575,575,578,578,579,580,580,581,581,582,584,584,584,584,584,585,585,586,586,587,587,589,590,596,596,596,597,598,598,598,603,605,605,606,607,607,608,608,610,613,613,613,614,615,616,617,617,622,622,623,623,623,624,626,627,629,629,631,632,634,634,635,641,644,645,646,647,648,648,648,649,650,652,652,654,654,656,657,658,661,663,664,664,665,665,667,669,670,672,672,672,674,674,674,679,680,680,680,680,680,682,683,684,684,685,685,685,687,691,691,691,691,695,696,696,698,699,699,699,699,700,700,700,701,702,703,705,705,706,707,709,709,715,715,716,716,717,722,722,722,723,725,729,731,732,733,736,736,736,736,737,738,739,740,740,740,740,742,743,745,748,748,748,749,749,749,750,751,751,753,754,755,756,756,758,760,761,762,763,763,764,764,765,765,766,767,767,767,768,771,771,771,777,779,781,781,782,783,783,783,784,786,786,788,789,790,790,791,791,791,792,793,794,795,795,795,796,796,796,797,797,799,799,800,800,801,804,806,810,810,811,812,813,816,817,818,819,819,820,820,820,821,821,824,824,825,827,828,828,832,832,833,839,839,840,841,841,842,844,845,849,849,850,850,853,854,854,855,856,857,857,858,860,861,861,862,863,864,864,865,868,870,876,885,885,886,887,888,888,890,891,891,892,893,896,897,898,901,901,902,904,906,907,908,908,909,911,914,916,918,919,920,921,922,923,927,929,929,937,937,938,939,940,940,941,941,941,943,945,948,950,952,953,954,954,954,956,956,956,956,959,960,962,963,963,964,965,967,968,968,969,970,970,972,973,973,974,975,975,976,976,976,977,983,984,984,985,986,987,990,990,991,992,993,994,995,995,995,996,996,997,998,998,1000,1001,1001,1001,1001,1002,1002,1003,1004,1004,1006,1008,1012,1013,1014,1016,1017,1018,1020,1020,1022,1024,1025,1025,1026,1033,1035,1038,1038,1038,1038,1038,1038,1042,1042,1042,1042,1045,1045,1045,1047,1050,1053,1053,1055,1055,1055,1055,1058,1059,1060,1061,1064,1066,1069,1070,1070,1070,1071,1073,1073,1074,1075,1075,1075,1077,1079,1080,1080,1082,1082,1083,1087,1088,1089,1091,1092,1092,1095,1097,1098,1098,1100,1101,1101,1101,1101,1104,1104,1105,1108,1108,1112,1113,1114,1116,1117,1118,1118,1120,1126,1126,1127,1129,1129,1131,1132,1135,1135,1138,1143,1143,1144,1146,1148,1148,1149,1150,1153,1155,1158,1159,1159,1160,1161,1167,1168,1169,1170,1170,1173,1173,1173,1176,1177,1177,1179,1180,1186,1191,1193,1196,1196,1198,1199,1202,1205,1207,1208,1209,1209,1210,1211,1214,1214,1215,1217,1223,1226,1226,1232,1233,1234,1235,1235,1238,1238,1246,1247,1247,1248,1250,1252,1257,1257,1257,1259,1260,1260,1260,1260,1262,1262,1263,1265,1266,1267,1267,1269,1271,1272,1273,1274,1275,1277,1277,1277,1282,1282,1283,1284,1285,1286,1286,1289,1291,1292,1293,1295,1298,1299,1301,1304,1304,1305,1307,1308,1309,1309,1309,1310,1311,1314,1314,1316,1317,1317,1317,1318,1318,1319,1320,1322,1323,1323,1325,1327,1327,1329,1333,1335,1335,1336,1337,1341,1346,1346,1346,1346,1346,1347,1347,1347,1347,1351,1352,1352,1353,1355,1355,1355,1357,1360,1361,1361,1361,1362,1362,1362,1362,1362,1366,1366,1366,1366,1368,1368,1371,1371,1371,1372,1373,1379,1381,1381,1381,1384,1386,1386,1386,1386,1388,1389,1391,1394,1401,1402,1403,1407,1407,1411,1412,1414,1419,1420,1420,1422,1423,1423,1423,1423,1430,1433,1433,1437,1439,1441,1442,1443,1443,1446,1450,1450,1451,1453,1454,1458,1459,1460,1462,1469,1469,1471,1473,1474,1474,1482,1483,1483,1484,1486,1486,1487,1489,1490,1490,1491,1492,1492,1498,1500,1502,1511,1514,1516,1517,1519,1525,1529,1530,1531,1531,1531,1532,1532,1535,1535,1538,1540,1540,1543,1544,1545,1547,1548,1548,1548,1549,1552,1552,1563,1563,1564,1564,1567,1568,1568,1569,1570,1573,1573,1573,1573,1575,1582,1583,1584,1585,1586,1586,1586,1598,1598,1598,1599,1600,1602,1603,1606,1606,1612,1612,1614,1614,1614,1617,1617,1617,1618,1623,1625,1625,1626,1628,1628,1630,1630,1632,1632,1639,1639,1640,1642,1642,1642,1643,1648,1650,1654,1654,1655,1657,1657,1661,1661,1661,1662,1664,1667,1673,1674,1675,1678,1683,1684,1688,1688,1689,1690,1691,1692,1696,1696,1702,1704,1705,1709,1717,1717,1721,1722,1722,1722,1722,1722,1722,1723,1724,1724,1726,1726,1728,1728,1729,1733,1734,1735,1735,1738,1744,1747,1748,1750,1751,1751,1758,1760,1764,1766,1766,1767,1768,1768,1771,1771,1776,1776,1779,1783,1783,1785,1788,1792,1797,1801,1808,1817,1819,1821,1824,1824,1830,1831,1831,1842,1844,1846,1853,1855,1856,1856,1857,1860,1861,1862,1863,1866,1867,1867,1868,1871,1872,1875,1878,1879,1884,1886,1888,1895,1896,1898,1899,1902,1904,1906,1907,1908,1909,1920,1921,1924,1927,1929,1929,1930,1936,1940,1944,1948,1949,1953,1957,1960,1961,1962,1964,1966,1968,1969,1970,1972,1974,1979,1984,1985,1987,1991,1992,1994,1995,1996,1996,1996,2001,2002,2002,2003,2005,2006,2007,2008,2008,2008,2015,2016,2018,2020,2020,2021,2025,2026,2029,2029,2030,2030,2031,2033,2036,2037,2038,2040,2041,2048,2049,2053,2059,2062,2065,2066,2072,2073,2075,2077,2079,2081,2081,2083,2083,2084,2084,2085,2087,2090,2095,2095,2096,2098,2101,2104,2109,2120,2121,2124,2125,2128,2131,2131,2131,2135,2137,2138,2138,2138,2138,2139,2145,2146,2148,2150,2150,2151,2157,2164,2164,2167,2168,2170,2171,2173,2175,2178,2179,2180,2185,2187,2187,2190,2192,2192,2192,2192,2194,2195,2197,2197,2200,2202,2203,2204,2209,2209,2210,2210,2212,2212,2213,2213,2213,2215,2217,2219,2223,2225,2230,2230,2231,2233,2233,2235,2242,2242,2243,2244,2244,2246,2250,2254,2261,2265,2270,2273,2275,2275,2283,2285,2286,2288,2291,2292,2295,2295,2295,2296,2296,2296,2300,2300,2306,2312,2313,2322,2323,2329,2331,2331,2336,2337,2337,2337,2339,2341,2348,2350,2350,2354,2357,2357,2359,2373,2375,2378,2379,2380,2380,2381,2387,2387,2388,2389,2389,2391,2392,2394,2397,2398,2399,2400,2401,2407,2411,2415,2416,2418,2418,2427,2429,2433,2434,2437,2438,2444,2444,2450,2455,2456,2457,2457,2460,2460,2465,2465,2469,2470,2470,2472,2473,2476,2478,2478,2480,2480,2481,2483,2485,2491,2495,2496,2499,2501,2505,2509,2510,2514,2517,2520,2523,2524,2527,2529,2536,2539,2540,2541,2541,2542,2543,2547,2552,2554,2554,2556,2556,2559,2560,2561,2563,2563,2570,2571,2576,2578,2578,2580,2580,2580,2587,2599,2604,2605,2607,2608,2609,2614,2614,2615,2616,2616,2619,2623,2627,2627,2630,2630,2633,2634,2639,2639,2639,2645,2649,2651,2654,2654,2657,2658,2659,2663,2667,2669,2670,2670,2671,2671,2671,2686,2688,2688,2689,2689,2691,2696,2697,2702,2709,2721,2722,2727,2730,2731,2733,2740,2740,2749,2749,2754,2759,2760,2766,2767,2772,2772,2772,2775,2775,2778,2781,2784,2784,2785,2786,2789,2789,2789,2789,2789,2789,2790,2790,2791,2791,2792,2797,2800,2802,2806,2808,2810,2813,2814,2824,2831,2840,2849,2854,2858,2870,2873,2876,2879,2880,2886,2887,2892,2895,2895,2896,2909,2916,2920,2925,2927,2934,2936,2939,2940,2940,2956,2957,2963,2967,2975,2976,2977,2980,2983,2989,2994,2994,2995,3004,3007,3009,3012,3017,3019,3021,3024,3024,3031,3034,3036,3036,3036,3042,3044,3055,3058,3060,3063,3064,3067,3074,3076,3077,3078,3078,3081,3083,3084,3084,3085,3089,3090,3098,3099,3100,3103,3105,3107,3115,3118,3119,3120,3120,3120,3120,3124,3125,3130,3135,3137,3137,3141,3145,3151,3156,3156,3161,3166,3168,3168,3170,3171,3172,3177,3181,3184,3186,3186,3186,3191,3194,3195,3196,3200,3201,3207,3207,3214,3217,3220,3225,3227,3231,3236,3237,3238,3241,3241,3244,3244,3250,3257,3258,3260,3260,3262,3262,3263,3263,3264,3264,3266,3267,3272,3276,3282,3283,3300,3304,3305,3307,3307,3308,3316,3319,3323,3323,3326,3342,3364,3366,3375,3376,3376,3382,3389,3390,3390,3390,3390,3393,3394,3396,3397,3404,3406,3411,3416,3416,3418,3419,3431,3436,3437,3445,3449,3463,3478,3489,3492,3505,3506,3508,3508,3512,3514,3516,3521,3523,3532,3544,3544,3544,3548,3551,3555,3557,3563,3569,3571,3574,3583,3586,3594,3609,3609,3613,3619,3624,3625,3627,3630,3632,3640,3641,3654,3654,3670,3681,3683,3689,3691,3702,3708,3714,3722,3725,3727,3734,3736,3743,3750,3753,3755,3770,3771,3773,3791,3795,3797,3800,3800,3801,3812,3814,3816,3818,3827,3829,3852,3854,3856,3857,3861,3866,3869,3869,3872,3875,3877,3879,3881,3883,3885,3885,3887,3897,3899,3907,3908,3918,3925,3934,3938,3942,3953,3954,3963,3965,3972,3973,3995,3995,3996,4005,4007,4014,4015,4016,4018,4019,4023,4025,4026,4027,4029,4032,4033,4041,4052,4056,4067,4071,4078,4078,4078,4081,4085,4086,4090,4096,4098,4117,4122,4125,4151,4164,4166,4168,4171,4177,4185,4194,4194,4202,4202,4207,4208,4220,4240,4262,4268,4274,4282,4284,4286,4297,4299,4306,4328,4339,4342,4344,4353,4366,4367,4370,4371,4373,4376,4379,4387,4406,4408,4415,4420,4429,4429,4434,4437,4437,4440,4440,4447,4447,4468,4492,4497,4502,4504,4505,4505,4506,4507,4518,4525,4527,4532,4536,4545,4564,4565,4566,4571,4571,4576,4576,4581,4585,4599,4608,4609,4609,4612,4629,4631,4634,4634,4647,4650,4652,4653,4665,4668,4670,4680,4685,4690,4698,4701,4704,4704,4706,4716,4719,4720,4728,4732,4736,4741,4743,4746,4760,4761,4772,4776,4780,4780,4785,4795,4806,4812,4813,4824,4828,4837,4852,4853,4857,4859,4862,4864,4864,4865,4865,4869,4881,4887,4894,4898,4900,4915,4926,4933,4940,4947,4970,5000,5008,5013,5014,5026,5041,5046,5051,5052,5052,5053,5055,5058,5060,5066,5090,5091,5098,5105,5111,5112,5116,5116,5119,5142,5147,5150,5169,5170,5173,5178,5183,5189,5189,5214,5219,5222,5225,5229,5245,5246,5264,5287,5319,5321,5327,5332,5337,5346,5354,5358,5365,5384,5394,5417,5429,5434,5437,5443,5453,5470,5473,5488,5495,5512,5521,5522,5534,5538,5542,5548,5556,5568,5575,5578,5585,5586,5597,5599,5608,5618,5623,5626,5634,5637,5647,5653,5661,5662,5680,5685,5686,5686,5695,5707,5720,5720,5722,5749,5759,5763,5765,5766,5771,5774,5777,5781,5783,5783,5789,5795,5810,5816,5823,5831,5843,5849,5881,5886,5886,5899,5900,5903,5904,5905,5925,5926,5949,5949,5951,5954,5964,5967,5972,5972,5976,5991,5993,5995,5999,6002,6009,6013,6026,6028,6039,6045,6046,6052,6057,6070,6083,6101,6101,6108,6112,6113,6119,6144,6154,6159,6160,6210,6229,6245,6245,6252,6254,6265,6282,6287,6292,6317,6328,6337,6341,6346,6350,6352,6356,6403,6403,6406,6408,6419,6428,6428,6432,6437,6438,6438,6463,6465,6465,6474,6475,6517,6528,6549,6551,6552,6590,6609,6636,6645,6650,6660,6678,6684,6697,6716,6717,6747,6747,6750,6753,6771,6819,6829,6841,6856,6866,6869,6878,6879,6886,6889,6901,6902,6903,6906,6909,6910,6914,6916,6922,6937,6942,6944,6955,6981,7007,7021,7046,7051,7055,7096,7108,7129,7133,7147,7168,7169,7180,7189,7205,7213,7218,7225,7225,7226,7228,7251,7254,7264,7271,7272,7278,7289,7304,7319,7319,7323,7336,7374,7384,7391,7399,7508,7538,7579,7582,7589,7629,7643,7654,7655,7659,7670,7678,7691,7692,7693,7697,7715,7724,7726,7734,7754,7785,7806,7820,7892,7911,7914,7919,7945,7950,7973,7997,8009,8015,8018,8026,8085,8111,8112,8113,8114,8115,8130,8213,8224,8233,8242,8250,8274,8275,8294,8309,8337,8350,8373,8419,8425,8431,8438,8448,8450,8471,8472,8474,8474,8476,8477,8483,8485,8486,8486,8487,8487,8498,8514,8518,8529,8547,8564,8578,8578,8579,8584,8587,8589,8591,8592,8592,8611,8638,8648,8680,8682,8694,8719,8719,8726,8744,8760,8780,8815,8840,8842,8845,8849,8852,8859,8865,8865,8865,8865,8869,8880,8883,8889,8889,8896,8903,8903,8905,8906,8907,8919,8923,8927,8933,8947,8947,8951,8969,8970,8974,8978,8993,8999,9002,9005,9008,9009,9010,9032,9047,9058,9091,9111,9120,9123,9127,9129,9144,9151,9155,9161,9182,9217,9276,9294,9296,9297,9301,9320,9334,9340,9340,9351,9354,9357,9373,9376,9377,9383,9406,9415,9421,9423,9435,9443,9446,9463,9471,9475,9501,9503,9541,9550,9550,9565,9586,9589,9622,9683,9687,9699,9710,9755,9767,9778,9781,9783,9784,9794,9802,9806,9818,9832,9839,9853,9868,9875,9877,9880,9898,9898,9915,9921,9924,9924,9924,9927,9976,9976,9977,9977,9977,9986,9999,10050,10054,10056,10057,10059,10081,10091,10093,10095,10098,10099,10110,10114,10131,10139,10151,10173,10175,10177,10179,10181,10183,10188,10188,10194,10199,10207,10246,10306,10331,10333,10333,10367,10396,10409,10426,10464,10469,10491,10493,10508,10509,10567,10580,10611,10621,10621,10639,10657,10661,10661,10667,10680,10708,10714,10728,10740,10797,10805,10848,10848,10868,10873,10874,10881,10895,10898,10904,10933,10936,10970,10973,11045,11049,11087,11088,11129,11148,11219,11227,11231,11241,11241,11255,11260,11272,11282,11287,11293,11353,11354,11407,11420,11430,11444,11464,11474,11474,11476,11487,11556,11586,11608,11672,11733,11759,11759,11769,11808,11850,11920,11941,11948,11954,11957,11970,11979,11998,12011,12028,12050,12069,12097,12104,12106,12106,12116,12150,12178,12179,12193,12206,12215,12225,12226,12305,12335,12354,12354,12355,12420,12440,12462,12492,12516,12600,12730,12744,12762,12771,12773,12807,12839,12840,12850,12856,12905,12918,13006,13053,13121,13127,13155,13199,13235,13240,13241,13247,13269,13310,13335,13344,13375,13381,13382,13389,13389,13401,13427,13443,13460,13465,13471,13506,13516,13546,13554,13578,13585,13616,13631,13697,13700,13747,13758,13774,13825,13830,13840,13852,13853,13872,13902,13914,13948,13974,14009,14058,14088,14095,14137,14146,14249,14285,14342,14377,14382,14388,14409,14456,14465,14469,14470,14492,14497,14516,14553,14556,14580,14588,14597,14599,14607,14617,14666,14667,14710,14710,14712,14830,14849,14855,14898,14909,14923,15000,15008,15010,15017,15019,15041,15051,15070,15078,15089,15126,15160,15174,15197,15200,15250,15267,15274,15277,15306,15311,15349,15367,15385,15396,15398,15448,15468,15472,15478,15483,15534,15634,15658,15659,15794,15840,15847,15858,15858,15860,15877,15878,15887,15963,15965,15991,15992,15995,16019,16039,16044,16047,16118,16184,16270,16371,16376,16409,16460,16475,16493,16494,16499,16513,16537,16590,16592,16599,16609,16614,16641,16642,16692,16713,16741,16815,16825,16828,16830,16888,16956,17032,17036,17055,17241,17283,17284,17311,17367,17370,17380,17391,17405,17407,17410,17414,17423,17456,17479,17501,17596,17596,17621,17649,17656,17684,17694,17696,17738,17796,17809,17852,17868,17940,17945,18030,18095,18175,18190,18247,18288,18312,18340,18356,18389,18411,18413,18420,18431,18504,18560,18610,18640,18641,18664,18664,18664,18683,18716,18725,18730,18750,18784,18785,18801,18805,18812,18853,18857,18866,18945,18989,19040,19056,19073,19103,19113,19119,19124,19127,19156,19183,19191,19200,19300,19385,19440,19486,19490,19503,19503,19523,19524,19556,19605,19630,19642,19662,19706,19773,19778,19786,19823,19831,19843,19860,19875,19889,19914,19941,19945,19977,20000,20011,20032,20056,20077,20116,20259,20281,20305,20345,20376,20389,20426,20509,20811,20849,20998,21104,21174,21281,21299,21349,21353,21394,21449,21481,21534,21585,21594,21684,21725,21738,21807,21914,22024,22041,22120,22137,22155,22324,22415,22415,22569,22635,22711,22732,22748,22811,22863,22863,22913,22968,23168,23283,23322,23375,23399,23412,23446,23446,23452,23485,23489,24413,24452,24488,24567,24633,24769,24785,25272,25275,25305,25332,25404,25432,25502,25692,25863,25865,25958,26025,26138,26225,26335,26424,26456,26477,26523,26540,26541,26554,26594,26615,26756,26839,26844,26886,26891,26957,27032,27044,27059,27165,27439,27481,27665,27893,28106,28146,28241,28347,28433,28436,28443,28766,28843,28863,28863,28968,29040,29066,29066,29092,29256,29338,29366,29366,29416,29532,29551,29591,29892,29964,30048,30057,30057,30090,30159,30175,30191,30230,30262,30346,30501,30510,30519,30537,30607,30625,30650,30695,30727,30764,30786,30878,30900,30937,30957,30989,31022,31039,31054,31168,31187,31241,31486,31494,31617,31733,31824,31828,31836,31844,31906,31914,31950,31967,31967,31967,31968,31968,31972,32000,32003,32027,32043,32138,32177,32195,32262,32337,32379,32386,32412,32479,32571,32577,32617,32626,32640,32680,32828,32864,32884,32894,32955,32970,33014,33037,33042,33042,33049,33056,33061,33150,33226,33248,33289,33299,33340,33374,33381,33441,33442,33534,33579,33838,33888,33967,33980,34021,34077,34135,34164,34164,34174,34182,34272,34279,34302,34406,34519,34618,34682,34692,34772,34787,34808,34818,34830,34877,34896,34909,34994,35012,35032,35080,35104,35263,35378,35416,35452,35472,35578,35630,35738,35888,35903,36027,36039,36057,36057,36062,36143,36217,36375,36380,36380,36560,36623,36696,36856,36893,37030,37091,37202,37290,37302,37302,37313,37344,37374,37387,37531,37802,37806,37966,37980,37998,38022,38027,38057,38119,38176,38196,38217,38217,38234,38280,38438,38556,38640,38663,38663,38683,38707,38763,38821,38902,38960,38992,39125,39157,39321,39367,39434,39434,39513,39552,39799,39830,39845,39908,39933,39987,39987,39997,40006,40049,40140,40211,40214,40225,40229,40363,40376,40478,40571,40613,40858,40959,41079,41107,41131,41144,41238,41303,41309,41314,41374,41414,41507,41552,41579,41592,41704,41756,41815,41825,41841,41845,41909,41935,41982,42092,42109,42118,42120,42131,42156,42167,42218,42302,42314,42316,42359,42359,42408,42444,42519,42631,42666,42683,42711,42715,42730,42730,42766,42787,42790,42804,42838,42846,42959,42976,42995,43014,43035,43092,43111,43258,43349,43383,43840,43840,43840,43861,43957,44015,44015,44051,44217,44260,44260,44284,44306,44324,44383,44504,44618,44624,44631,44640,44768,44776,44776,44831,44860,44867,44902,45008,45016,45020,45128,45280,45318,45407,45485,45485,45550,45551,45569,45628,45637,45665,45684,45756,45798,45888,45918,45935,46087,46118,46120,46128,46192,46303,46377,46382,46419,46419,46419,46419,46419,46464,46466,46471,46475,46527,46544,46607,46610,46666,46669,46702,46727,46782,46803,46836,46850,46850,46850,47025,47194,47338,47468,47576,47694,47708,47803,47836,47847,47852,47900,47959,48063,48115,48192,48212,48418,48712,48789,48856,48981,49013,49160,49175,49245,49252,49329,49413,49419,49435,49455,49559,49625,49656,49806,49970,50038,50142,50242,50425,50496,50534,50651,50971,51001,51212,51361,51516,51574,51676,51701,51724,52003,52045,52048,52058,52099,52101,52134,52162,52192,52217,52388,52418,52505,52608,52650,52695,52730,52812,52911,52925,52926,53147,53518,53556,53569,53602,53602,53622,53658,53766,53774,53783,53874,53900,53973,54173,54174,54174,54174,54175,54186,54186,54187,54187,54196,54206,54243,54255,54264,54408,54416,54419,54432,54444,54445,54474,54549,54650,54658,54667,54679,54725,54802,54825,54865,54991,55046,55055,55059,55123,55193,55252,55264,55291,55323,55399,55495,55527,55580,55594,55685,55823,56039,56124,56149,56185,56191,56348,56484,56498,56630,56638,56817,56898,56919,57133,57177,57360,57420,57489,57554,57557,57561,57568,57571,57571,57571,57613,57736,57784,57804,57815,57903,57985,58010,58085,58090,58109,58332,58338,58355,58456,58472,58516,58684,58757,58783,59153,59169,59175,59179,59188,59193,59304,59470,59510,59666,59916,59975,60018,60187,60192,60203,60238,60311,60413,60440,60522,60612,60688,60772,60800,60919,60932,61013,61047,61087,61090,61292,61314,61331,61334,61400,61436,61441,61442,61447,61462,61513,61595,61710,61742,61742,61742,61742,61835,61869,61953,61959,61992,61999,62011,62061,62118,62125,62196,62207,62260,62329,62393,62449,62512,62521,62562,62585,62585,62591,62595,62597,62604,62660,62672,62763,62788,62849,62913,62942,63070,63147,63148,63269,63278,63298,63391,63504,63522,63558,63589,63665,63674,63685,63722,63727,63732,63782,63856,63879,63906,64021,64248,64259,64282,64318,64368,64404,64448,64666,64716,64728,64783,64972,65026,65094,65104,65104,65140,65219,65245,65257,65289,65311,65313,65398,65488,65531,65584,65621,65649,65765,65776,65871,65921,65941,66048,66100,66203,66230,66233,66363,66377,66434,66475,66501,66578,66595,66687,66708,66711,66751,66783,66801,66831,66842,66945,66954,66954,66973,67028,67067,67082,67094,67215,67256,67299,67385,67442,67627,67640,67788,67826,67882,67948,68022,68072,68168,68177,68275,68285,68300,68469,68477,68552,68820,68820,69186,69233,69236,69242,69253,69256,69290,69380,69424,69472,69482,69494,69555,69861,69892,69913,70101,70143,70241,70563,70858,70891,70911,71046,71175,71178,71185,71213,71310,71783,71827,71992,72003,72081,72479,72547,72658,72856,72870,72921,72989,73033,73034,73109,73286,73311,73467,73524,73576,73783,73893,74167,74296,74357,74677,74695,74699,74737,74811,74898,74915,74971,74996,75020,75261,75310,75441,75513,75517,75547,75550,75578,75583,75606,75607,75748,75753,75818,76266,76459,76469,76503,76563,76678,76695,76734,76867,76920,76928,76928,76928,76928,76941,76977,77025,77101,77194,77236,77255,77482,77495,77520,77576,77671,77727,77738,77781,77814,77817,77948,78015,78029,78036,78050,78065,78144,78204,78257,78352,78474,78488,78558,78703,78767,78910,78922,78954,79019,79274,79278,79281,79303,79436,79448,79451,79529,79563,79609,79626,79638,79685,79746,79794,79809,79954,80171,80186,80232,80247,80319,80350,80474,80486,80540,80580,80648,80722,80852,80964,81140,81215,81268,81284,81425,81455,81491,81515,81564,81566,81947,81956,81990,82023,82161,82182,82261,82282,82306,82467,82493,82530,82577,82600,82629,82639,82643,82702,82748,82759,82792,82829,82853,82953,83021,83030,83041,83044,83200,83310,83336,83348,83356,83401,83403,83560,83575,83668,83770,83811,83823,83827,83870,83901,83910,83937,83965,83977,83989,84047,84055,84068,84221,84266,84348,84523,84576,84703,84761,84793,84853,84900,84934,85014,85122,85198,85328,85429,85481,85865,85953,85979,86447,87131,87142,87268,87361,87701,87715,87853,87933,88022,88054,88334,88383,88524,88617,88623,88646,88758,88797,88914,89172,89173,89394,90255,90369,90666,90881,91098,91161,91412,91438,91489,91542,91636,91878,92597,92697,92698,92739,92896,92899,92906,93024,93143,93235,93316,93517,93598,93602,93630,93671,93673,93735,93840,93948,93958,94794,95311,95359,95414,95455,95463,95466,95475,95516,95532,95565,95581,95664,95859,95860,95883,95992,96206,96324,96433,96584,96767,96807,96953,97036,97259,97365,97744,97766,97817,97888,98176,98188,98266,98526,98536,98778,98807,98809,98825,98835,98945,99009,99062,99064,99201,99229,99285,99309,99550,99607,99776,99859,100311,100378,100425,100429,100430,100441,100727,100880,100914,100937,101082,101107,101233,101274,101460,101845,101914,102177,102550,102566,102634,102781,102782,102784,103057,103164,104015,104140,104184,104309,104435,104488,104623,105081,105108,105416,105585,105822,105833,106468,106470,106472,107342,107428,107444,107470,107472,107930,108135,108685,109486,109654,109718,110043,110247,110541,110631,110743,110881,110928,110930,110958,110968,111216,111281,111296,111396,111428,111437,111502,111976,112000,112016,112074,112142,112216,112227,112232,112303,112420,112459,112481,112698,112700,112817,112999,113101,113103,113326,113354,113544,113828,113869,113973,114568,114959,115014,115453,115572,115660,115936,116084,116128,116160,116162,116339,116383,116405,116754,116789,117157,117368,117416,117427,117548,117797,118437,118564,118989,119030,119037,119643,119660,120029,120043,120402,120418,120588,120840,121007,121217,121348,121523,121811,121916,121928,122376,122524,122527,122553,122614,122718,122774,122793,122809,122856,123832,123846,123860,123876,123940,124532,125763,125839,125956,126941,127488,128365,129632,129665,129754,130612,130817,131307,132451,132567,132599,133779,133807,134349,134578,135113,135357,135475,135537,136020,136030,136113,136590,136602,136873,137466,138652,138696,138730,138809,138899,139127,139167,139496,139992,140243,140327,140397,140412,140498,140726,140936,141471,141589,141600,141610,141813,142236,142442,142485,142506,143960,144210,144636,145267,145346,145384,145444,145542,145550,145730,145750,145750,145758,145758,146045,146045,146428,147004,147024,147349,147450,147700,149065,150230,150490,151312,151430,151654,151774,153010,153078,153229,153386,153426,153751,153809,154012,155737,155758,155837,155903,155939,155955,156063,156063,156298,156374,156399,156470,156633,156815,156919,157196,157886,158118,158222,158223,158476,158508,158905,159147,159651,159747,160090,160998,161144,161418,161865,162199,162300,162442,162602,162640,162701,163133,163171,163327,163522,163588,163825,163930,163943,164150,164284,164574,164717,164916,165115,165160,165442,165480,165752,167126,167374,167925,168477,168494,168523,168552,168620,168746,168779,169075,169113,169126,169152,169636,169748,169756,169757,170112,170348,170349,170374,170425,170470,170581,170772,171015,171338,171862,172499,172510,172796,173057,173091,173179,173277,173436,173473,173513,173634,173780,173827,173888,173893,173925,174175,174317,174435,174495,174499,174634,174704,174906,174946,174975,175096,175210,175413,175622,175721,175726,175769,175876,175917,175941,175983,176088,176206,176242,176366,176415,176542,176593,176632,176658,176663,176807,176807,176973,176990,177163,177718,177859,177884,177885,178502,178612,178616,178710,179315,179323,179358,179931,180137,180440,181566,181942,182250,183415,186026,186380,188050,188276,194660,197053,198636,198699,207947,208059,213289,220510,221708,224233,239581,243850,244660,245120,245162,247410,255044,255298,255474,255664,260564,261958,261975,262681,262838,264648,290373,290392,290418,292835,296863,297555,299176,299700,299730,302340,304457,306183,306915,306980,306981,306982,307056,307800,308144,310258,311030,312554,313678,315418,317049,317605,318080,319213,319546,319712,319800,319849,319891,319960,320054,320104,320633,321546,321658,322289,323380,324549,324578,327117,328077,329287,329979,330869,330895,331014,331026,331133,331140,331161,331239,331500,339915,345572,348682,348710,349100,349297,349457,349676,350048,350097,350181,350387,351716,351739,351852,351855,352078,352099,353185,353265,353299,353400,353563,353583,353621,353686,353763,353784,353825,353910,353918,353938,353985,353990,353997,354020,354070,354083,354106,354149,354234,354244,354337,354356,354390,354471,354487,354549,354714,354751,354915,355142,355245,358462,358479,368514,369235,371338,371948,373300,373909,377377,383987,384740,385977,389389,392156,414405,435131,435321,448920,449207,462430,466029,466033,468033,470096,486566,505771,518602,524949,524954,528240,528246,530397,533646,533700,533721,591266,601917,602139,602502,603066,703405,704013,704017,746785,1358018,1358024,1691226,1762563,3936450,3936460,3936469,3937981,3938002,3938011,3939337,3939366,3939371,3939377,3939391,3939405,3963665,4022718,4064221,4064428,4066260,4067089,4067968,4069179,4093896,4094699,4109626,4111264,4111428,4123669,4141875,4141885,4141896,4143456,4143465,4143554,4143639,4177534,4178543,4182849,4204831,4205804,4206894,4207141,4207174,4207878,4208655,4208885,4209354,4215316,4215523,4216281,4219329,4219414,4236024],"authored_days":[282,283,290,285,278,281,286,284,286,281,283,283,284,278,283,282,297,279,286,279,281,284,284,278,279,281,278,291,285,286,287,302,283,287,279,278,281,278,303,283,285,278,282,281,290,283,284,279,278,289,284,293,284,297,285,286,297,279,279,278,302,295,283,296,284,286,281,279,287,297,298,297,297,278,287,282,283,283,302,285,282,303,281,296,302,283,281,288,295,287,281,297,285,278,287,279,281,287,289,297,284,283,278,281,284,278,306,284,296,293,296,279,283,282,287,289,283,298,283,278,281,295,299,302,297,281,290,298,307,281,279,286,296,286,302,286,278,285,279,278,296,285,279,297,285,278,295,281,281,285,281,296,286,281,281,299,285,281,279,295,284,281,297,295,295,297,278,296,281,278,283,278,284,285,278,287,286,296,286,279,313,313,354,354,313,313,320,354,314,320,354,304,309,313,313,314,306,313,313,309,313,354,278,279,285,296,288,297,281,279,289,293,302,288,281,284,295,281,284,283,284,284,284,278,278,283,297,278,278,281,281,281,281,278,283,285,281,302,282,284,281,285,285,286,295,303,283,278,279,279,278,281,278,281,290,284,303,290,297,295,299,295,288,281,286,290,283,284,281,279,281,285,279,279,283,281,281,281,281,296,297,286,281,287,299,285,285,295,285,286,295,281,278,283,283,283,286,284,285,281,279,286,283,278,284,296,279,279,281,285,285,295,278,283,279,285,283,297,290,287,283,298,295,297,307,279,299,285,284,297,279,284,281,309,278,286,287,287,296,298,359,286,298,288,295,286,360,361,286,312,297,310,289,286,314,360,286,286,314,286,286,287,295,298,286,313,318,296,287,309,290,286,286,314,298,286,312,287,286,286,286,289,286,286,290,285,312,302,289,289,285,312,359,312,300,298,312,285,286,298,286,361,360,298,295,286,285,310,287,314,312,287,288,290,286,361,312,286,298,308,308,298,284,313,289,289,286,295,298,286,359,286,285,359,315,312,298,354,298,315,286,288,298,286,286,286,297,286,289,289,360,289,286,309,359,314,285,286,295,362,314,311,284,309,289,286,295,291,297,285,286,293,306,286,295,285,314,315,285,286,295,295,308,298,286,286,295,286,288,291,312,289,299,305,286,286,321,302,298,287,359,285,286,295,289,292,295,314,320,361,314,302,302,306,290,314,289,295,287,297,309,296,285,286,305,286,297,285,286,286,297,289,286,297,296,303,289,298,286,306,281,295,306,359,297,296,289,288,286,289,289,360,306,306,298,298,289,314,286,297,303,289,361,306,297,298,295,298,285,297,299,289,289,364,298,298,298,297,286,288,289,298,299,295,309,297,286,299,318,298,289,291,311,359,306,297,286,286,286,286,286,319,286,309,299,311,289,286,298,303,285,297,286,284,286,286,289,286,297,298,289,311,286,286,297,289,319,303,285,289,284,286,286,286,290,286,319,293,289,299,298,308,295,284,284,312,359,285,293,298,289,297,286,314,286,286,285,361,318,285,289,293,284,297,293,293,286,361,298,286,319,297,295,298,303,303,319,285,305,297,284,319,298,364,297,299,285,290,286,297,284,285,299,298,290,286,282,306,314,298,290,288,288,295,361,286,286,314,303,299,286,287,297,314,314,298,287,288,285,295,286,287,286,310,286,298,353,296,284,298,289,297,299,284,286,364,364,287,284,297,284,297,285,295,285,289,290,299,298,306,296,298,293,290,298,284,286,298,298,319,298,319,295,286,298,284,313,296,284,285,284,359,297,295,299,298,295,286,309,285,285,286,295,297,284,299,298,284,288,290,283,285,295,299,359,289,286,298,298,314,298,298,359,293,285,288,359,288,293,361,285,314,286,286,289,314,286,285,314,359,359,286,290,287,293,286,284,285,359,306,285,297,314,284,359,338,321,295,304,323,314,290,305,297,359,306,289,359,359,302,295,303,304,303,286,319,289,297,305,285,304,289,297,297,306,353,287,355,290,289,290,279,283,305,299,297,290,304,299,295,314,285,298,295,284,285,303,321,297,304,289,298,321,338,321,289,285,309,283,298,285,309,318,299,286,286,304,285,297,286,286,361,361,361,290,288,290,286,297,297,286,286,290,290,359,319,290,321,318,310,304,310,295,284,285,315,297,290,289,289,297,314,314,295,297,290,283,314,286,295,290,284,290,298,297,285,295,284,314,318,298,312,318,285,321,293,286,320,298,310,312,359,360,286,284,290,295,289,298,320,361,295,284,290,295,285,309,289,321,285,331,289,286,306,314,289,310,338,290,290,284,305,298,287,309,306,361,289,285,286,319,309,319,297,297,297,297,285,314,286,286,286,285,285,284,303,297,323,293,323,285,283,286,359,303,285,312,289,304,304,289,304,314,319,308,314,288,286,302,304,295,289,298,309,297,297,295,295,333,290,303,282,297,285,302,297,286,286,297,297,323,285,297,288,310,286,358,307,286,289,312,286,299,285,364,361,285,299,304,304,299,293,314,303,312,297,306,299,285,318,285,285,285,286,309,286,286,286,291,286,359,298,286,355,297,310,285,298,297,303,303,303,285,285,311,284,285,303,298,295,300,298,286,286,286,285,290,303,354,284,338,338,289,298,319,285,290,284,295,300,303,354,298,354,284,300,309,290,284,359,286,300,310,286,286,286,298,359,290,289,290,293,286,284,287,359,286,289,304,285,290,300,285,293,285,290,288,300,304,286,285,289,284,291,359,286,298,286,320,359,319,319,289,312,324,293,284,320,288,285,285,284,290,290,354,354,300,319,290,298,324,290,289,284,285,284,341,286,310,287,359,296,323,318,298,354,298,310,285,361,361,312,361,290,298,312,361,298,284,284,299,364,310,287,313,312,313,284,320,304,295,359,336,312,310,310,298,293,285,310,297,289,297,284,319,303,295,341,295,289,353,284,284,319,290,298,298,295,359,320,297,359,297,290,290,290,289,295,361,361,361,297,289,314,296,361,297,284,284,295,286,298,285,361,314,297,321,290,287,313,313,284,298,319,303,324,353,302,287,302,318,285,299,290,285,298,284,312,302,324,324,324,290,312,303,312,309,359,286,286,321,310,290,285,323,286,303,360,285,297,304,286,308,306,359,303,359,303,304,353,285,284,285,359,303,323,289,305,304,298,285,285,297,285,319,318,286,297,359,298,298,284,284,306,321,298,289,284,286,285,359,298,295,298,297,289,287,289,289,289,303,308,298,312,324,289,304,287,284,304,310,298,299,286,298,287,298,361,289,288,287,295,331,284,298,312,289,330,312,355,312,287,290,290,314,297,361,298,298,341,298,284,293,290,311,312,299,297,318,287,297,312,304,297,289,284,293,288,288,304,354,303,310,289,309,285,291,310,303,286,295,305,284,324,349,285,297,297,297,284,323,290,298,303,283,361,305,289,298,297,297,298,284,293,303,309,289,324,314,303,310,349,284,338,298,331,323,311,303,303,309,285,359,303,361,361,284,305,285,290,304,289,291,338,284,303,303,303,283,284,304,304,305,318,319,289,361,291,361,309,284,309,319,299,289,304,299,306,282,289,306,309,291,312,358,306,284,287,288,291,287,286,361,287,288,286,289,320,306,349,364,287,355,359,302,354,286,290,284,286,309,312,285,284,291,290,285,354,285,331,286,302,282,285,291,289,355,299,296,320,354,298,293,288,319,361,361,295,338,324,289,306,284,306,289,298,308,288,360,285,286,349,302,298,284,309,324,354,303,289,286,286,289,359,285,309,318,298,302,289,285,359,284,360,303,312,314,302,284,285,319,297,298,297,307,361,309,297,291,298,303,298,351,312,331,298,321,312,310,306,298,302,359,289,298,289,302,338,298,353,354,289,323,286,286,306,299,305,289,293,353,353,302,323,302,291,291,291,290,298,351,353,303,308,290,297,290,290,303,311,285,298,309,285,297,361,295,355,318,360,303,285,351,309,284,359,364,364,295,285,295,299,295,303,289,361,289,304,360,287,285,318,361,288,309,354,289,309,331,289,289,295,282,306,360,291,300,331,289,298,298,349,360,353,318,302,289,284,285,361,361,361,289,285,285,360,290,318,324,297,289,281,318,308,297,297,364,313,313,338,289,361,361,302,361,302,288,364,286,359,298,291,333,290,306,284,312,303,289,360,297,297,302,354,289,289,297,293,333,287,303,302,302,302,297,338,306,338,290,303,324,331,364,303,306,338,287,289,299,353,354,360,298,364,297,287,290,364,364,305,341,287,303,364,355,284,318,361,289,364,297,361,303,289,285,361,289,361,361,364,359,291,361,289,297,289,324,331,304,291,289,353,303,295,310,303,289,364,291,332,289,291,364,283,309,364,289,289,364,303,284,298,359,303,323,309,291,298,289,303,308,289,302,331,295,288,285,364,323,286,286,291,288,306,305,284,290,285,290,291,323,287,290,285,303,290,296,303,314,303,288,314,314,359,306,297,303,293,297,303,290,289,284,305,289,290,287,331,283,311,288,305,298,331,285,307,307,307,332,321,321,309,307,285,307,307,307,307,307,359,331,309,290,331,355,291,291,291,354,309,299,302,289,297,354,354,289,303,306,324,354,298,298,298,291,303,309,298,298,298,359,336,314,295,298,314,286,364,297,324,359,361,364,291,288,360,287,283,286,303,304,304,338,293,360,291,288,304,297,361,359,290,303,304,298,359,359,291,359,359,359,291,289,295,303,295,309,312,318,320,299,360,332,360,304,361,298,354,309,309,312,309,304,304,306,308,309,361,361,304,284,304,354,290,318,309,298,303,304,353,299,299,321,338,287,306,307,298,331,323,290,356,356,361,284,289,355,314,310,353,298,314,361,331,293,332,287,281,354,310,284,300,298,298,289,284,320,314,324,310,289,298,333,298,323,295,324,351,323,289,361,284,351,305,310,353,314,332,313,354,284,318,290,313,361,359,295,285,298,284,313,314,298,320,353,298,338,284,313,285,310,353,290,318,293,313,313,284,359,295,284,285,285,309,295,323,353,290,310,285,353,290,319,297,354,285,310,288,354,295,284,295,303,284,283,284,294,359,287,284,311,303,295,284,284,353,284,307,294,287,302,359,302,353,290,290,319,353,314,308,303,284,331,356,320,302,361,354,302,284,302,289,300,299,299,284,289,284,289,299,361,289,309,359,289,320,289,289,290,285,307,305,284,354,284,284,356,295,321,359,289,298,309,321,307,359,319,312,289,289,354,305,285,309,303,364,284,321,298,303,320,295,298,284,303,318,299,286,324,298,298,299,306,355,312,289,318,305,284,299,312,320,312,289,319,331,319,319,319,319,303,284,307,312,355,338,354,284,304,298,312,354,331,331,286,286,303,298,332,332,297,303,306,314,318,283,331,359,351,324,286,323,353,285,285,331,353,306,351,285,353,285,338,285,353,321,290,351,295,353,286,299,299,288,286,299,353,283,353,332,285,285,308,295,284,355,299,284,284,299,286,354,354,284,354,320,338,299,284,310,286,319,353,286,286,310,306,359,364,288,338,300,320,331,354,306,297,295,297,297,297,297,330,297,353,332,353,359,299,310,320,295,299,318,319,283,309,307,359,351,359,312,353,353,364,303,297,312,359,318,359,364,318,289,324,359,285,320,353,289,285,353,323,285,355,308,318,323,307,318,355,289,353,331,320,312,312,354,303,321,283,297,296,318,291,309,356,310,364,298,364,298,318,297,299,302,302,307,307,351,355,302,320,287,320,364,364,285,285,355,311,302,310,285,295,297,297,298,298,298,311,310,304,304,304,285,311,285,295,305,296,331,355,356,319,312,296,359,354,296,284,321,324,358,358,331,309,296,284,286,310,364,320,312,354,304,321,290,310,288,318,298,355,354,290,290,353,353,310,331,320,290,353,353,318,353,290,314,331,332,298,318,290,354,298,303,310,310,353,290,361,299,310,299,331,298,354,285,286,358,306,286,318,288,354,287,285,313,353,331,310,358,332,320,312,306,359,304,304,304,304,320,284,304,318,355,359,290,310,351,304,304,304,356,354,320,353,304,299,323,290,353,285,331,310,304,295,354,308,285,298,332,308,353,353,306,294,318,284,361,361,299,361,302,285,331,323,321,354,299,299,302,299,299,310,302,302,310,299,332,331,314,284,353,308,321,318,284,354,318,286,321,318,310,361,306,320,284,298,293,332,310,298,298,298,298,353,364,359,293,324,299,309,308,314,290,318,324,310,296,306,353,299,320,324,361,360,305,302,302,306,318,297,299,361,353,290,290,361,299,296,304,351,320,332,285,295,304,351,283,284,324,303,287,310,351,298,351,284,355,355,318,320,309,303,320,296,284,330,294,306,310,309,293,331,290,309,303,290,331,303,287,290,358,284,299,309,358,332,309,295,320,353,321,308,331,361,297,361,331,311,295,360,295,309,298,321,297,290,286,286,298,297,314,320,361,306,285,309,360,308,308,295,295,354,285,323,290,290,294,289,354,331,306,287,304,355,304,297,306,308,304,364,364,284,360,353,305,287,318,355,295,331,354,289,353,308,321,323,305,355,296,291,331,308,354,299,331,291,320,354,297,308,360,320,290,320,308,299,310,361,291,320,323,320,321,353,361,291,320,354,311,284,354,308,298,324,284,290,290,303,303,303,303,312,290,321,303,353,320,308,295,311,321,321,353,331,321,314,297,309,314,309,309,359,320,297,296,279,298,297,284,324,306,299,306,330,308,285,331,285,285,290,309,285,285,364,311,331,296,312,285,323,297,331,324,331,290,308,309,284,297,308,353,308,298,314,308,311,309,308,318,296,299,323,296,353,353,290,324,318,331,354,351,323,364,321,364,364,364,364,361,320,331,355,355,309,290,320,351,353,295,283,361,361,361,323,314,290,308,290,309,320,289,331,298,298,306,289,295,298,309,302,302,299,312,299,359,302,353,312,331,311,290,303,299,361,285,299,285,296,298,331,331,320,304,298,320,312,332,331,303,285,297,309,320,311,304,284,320,320,290,331,320,320,359,332,359,290,284,354,306,320,331,353,310,298,308,320,303,361,303,310,303,320,303,296,310,309,309,320,290,297,310,290,359,354,298,299,299,331,364,308,298,299,309,298,355,354,298,299,297,299,298,310,355,285,290,323,361,359,361,361,361,364,306,331,332,353,290,299,313,297,308,299,308,299,364,332,298,298,331,297,298,331,353,310,297,297,297,297,308,320,298,297,299,364,353,353,331,361,331,308,323,306,353,310,356,361,308,299,290,331,308,323,303,364,309,297,308,297,364,359,302,364,311,290,320,312,312,293,302,304,304,306,359,359,311,302,308,355,308,306,312,364,306,320,306,290,310,354,364,355,311,358,355,355,323,320,302,314,355,361,305,299,305,361,355,305,297,361,298,361,361,299,361,353,355,355,356,299,358,353,353,291,361,312,364,303,308,355,312,309,299,285,351,285,361,354,354,310,323,323,308,296,364,311,364,312,291,364,310,309,355,302,361,310,309,310,353,310,359,356,355,299,291,355,310,296,296,360,303,285,310,285,355,355,355,302,302,312,303,354,353,320,303,312,320,305,319,296,358,354,355,358,358,358,312,306,306,306,306,306,361,338,309,312,303,353,312,324,321,303,290,293,359,320,331,354,354,320,320,306,306,306,306,291,299,364,306,306,306,306,306,293,302,354,320,302,293,312,353,353,324,320,293,354,338,330,291,297,361,354,330,361,364,291,311,297,309,296,285,361,361,361,361,351,293,285,309,321,285,302,299,293,297,311,302,302,364,302,302,364,364,302,302,293,302,302,308,291,332,323,361,309,332,299,299,297,294,332,294,332,321,293,361,320,311,309,306,296,311,320,364,291,353,308,332,353,351,309,297,355,293,361,306,308,361,293,291,324,353,308,294,284,332,293,323,311,293,294,330,323,310,293,293,311,310,299,311,324,311,323,332,293,353,353,358,302,293,353,285,361,295,324,351,351,353,330,361,330,338,353,323,299,361,302,302,302,332,302,302,302,302,302,358,309,323,330,296,296,330,320,358,295,309,361,330,361,330,361,361,299,353,306,306,306,306,306,313,313,291,330,314,308,351,358,304,358,312,297,355,309,323,297,355,291,314,309,299,331,304,304,304,304,287,304,304,313,313,294,311,306,290,331,319,355,364,330,323,296,355,353,303,353,297,324,303,364,359,309,296,296,314,314,311,361,297,312,312,304,311,299,287,311,330,296,296,311,355,359,319,323,290,323,290,290,290,304,290,290,320,364,364,356,297,323,355,314,297,306,354,314,287,314,308,314,359,323,338,290,290,290,319,308,290,290,331,357,332,306,293,332,314,312,310,312,331,293,364,294,331,296,293,321,285,294,285,312,332,332,312,331,299,355,287,312,323,294,312,310,331,332,308,291,293,297,310,308,290,290,308,323,314,359,314,323,297,314,331,306,287,355,355,338,330,332,297,361,323,330,293,312,297,312,331,287,323,312,355,330,296,287,294,297,323,330,297,312,355,323,306,364,319,364,330,364,319,299,330,312,331,323,293,331,323,364,360,364,320,331,364,355,312,312,293,355,321,294,287,311,330,293,312,311,355,331,331,354,308,293,308,296,338,354,308,294,311,311,294,355,293,311,354,311,308,311,331,292,292,293,293,292,294,294,331,308,297,303,294,314,314,287,331,318,308,330,293,318,331,312,330,330,297,308,308,318,311,292,331,321,311,355,294,296,311,294,308,308,311,292,311,292,311,338,312,308,320,311,318,308,318,355,331,308,308,320,297,312,318,312,312,308,308,296,296,318,318,296,318,320,308,318,312,312,312,311,294,319,321,355,294,355,319,292,312,304,294,321,355,292,312,308,361,308,331,312,312,303,321,319,319,297,319,312,308,308,312,312,312,305,313,313,313,312,312,338,312,297,321,319,318,312,331,305,305,292,297,292,318,308,321,292,292,313,291,305,305,292,297,359,359,308,312,303,282,292,297,292,313,321,282,305,314,297,305,331,305,305,305,312,308,321,297,308,287,308,287,305,314,297,304,314,314,308,297,287,361,305,297,321,310,305,308,304,304,314,318,314,308,304,318,297,319,318,297,318,297,297,312,308,304,304,304,308,312,312,283,331,312,297,355,312,312,313,331,312,312,331,312,304,312,313,313,313,313,312,308,304,312,331,297,312,312,361,293,304,304,304,293,361,304,304,304,293,308,355,304,304,355,308,304,312,304,308,304,304,312,308,312,314,312,313,313,313,293,314,361,308,304,304,306,312,313,303,312,360,360,312,293,293,293,313,304,311,303,306,306,308,312,308,313,313,312,303,313,307,304,308,351,304,304,313,298,303,298,308,351,306,312,306,306,312,313,308,351,304,304,304,312,312,299,298,312,313,303,298,308,304,298,312,308,351,308,298,351,308,308,308,298,312,299,304,304,304,304,304,306,299,304,308,308,298,313,308,313,308,306,313,298,308,306,306,306,313,306,306,312,298,293,298,312,304,304,304,304,304,298,304,304,312,308,312,293,308,298,308,312,307,312,312,312,360,308,293,312,306,308,298,313,308,312,308,289,289,289,293,313,313,308,307,312,308,313,306,312,313,312,306,313,312,313,313,311,311,306,305,311,311,311,311,311,302,302,308,312,313,313,306,306,311,312,306,306,311,350,304,311,312,312,312,312,306,312,312,311,308,311,304,306,313,313,312,311,306,313,313,312,311,311,311,306,306,312,311,312,311,313,313,313,311,312,312,311,313,311,312,311,312,312,314,304,304,304,321,312,312,306,360,312,306,306,312,308,313,312,312,304,312,308,354,354,351,312,308,311,308,312,312,312,313,312,308,312,354,321,321,354,321,354,312,311,312,312,361,321,312,354,311,354,321,311,310,354,312,321,311,312,312,330,311,312,312,354,330,311,312,312,321,312,313,313,313,313,312,313,313,312,313,312,330,330,312,330,354,312,289,321,312,311,311,311,312,360,311,311,360,321,304,304,360,321,321,321,321,321,306,306,321,306,312,312,308,312,308,308,320,312,312,312,312,311,320,320,312,291,306,312,312,312,312,312,330,312,312,312,320,333,320,312,333,312,333,312,333,311,311,311,311,311,320,333,319,311,312,311,330,333,311,308,330,311,312,330,311,305,305,305,361,311,333,314,333,323,333,308,320,314,308,308,308,312,308,333,312,321,331,311,354,354,320,321,321,320,308,320,291,291,291,291,311,308,311,331,318,331,354,331,354,333,354,331,330,333,320,331,354,354,331,320,351,349,351,305,312,349,318,318,318,318,318,320,318,331,319,331,319,319,330,330,320,358,358,313,330,319,319,314,356,319,318,330,331,318,319,320,295,295,295,295,295,295,295,295,295,331,295,331,331,331,331,297,320,320,331,320,320,349,349,349,295,297,349,312,331,297,310,355,309,312,312,312,297,331,321,310,297,313,297,313,313,331,310,297,295,320,331,297,312,331,320,297,331,355,331,297,313,309,312,354,297,312,309,313,313,308,308,308,297,312,297,312,291,314,309,320,309,309,297,355,331,295,309,297,309,321,309,309,309,314,331,309,331,355,355,320,320,297,309,331,354,296,308,331,331,308,308,320,305,297,331,331,320,356,320,331,331,355,308,331,331,313,331,309,308,331,313,313,355,308,297,313,309,309,309,309,331,331,331,331,313,331,308,331,309,308,297,312,331,297,331,331,359,331,331,313,309,313,313,331,308,313,305,297,331,331,331,320,305,305,320,305,331,331,305,309,307,320,320,356,305,331,331,305,307,356,331,297,356,356,289,289,309,309,313,297,356,320,309,356,309,309,309,320,309,297,304,320,320,303,309,313,351,351,304,303,303,309,305,303,356,297,309,303,297,294,304,294,356,309,297,356,313,291,359,309,356,291,312,297,309,312,356,356,356,297,356,294,291,356,356,356,297,291,294,297,289,297,359,359,308,313,313,313,313,296,308,296,296,297,297,359,302,302,297,356,302,308,308,302,356,297,297,295,294,308,308,308,308,307,308,289,308,307,291,297,308,308,307,297,320,303,303,308,297,303,297,297,307,294,297,297,307,289,289,312,292,292,351,294,351,320,292,308,307,307,308,313,313,307,308,307,320,357,308,304,308,289,289,307,308,308,307,311,294,338,311,308,308,311,360,338,313,338,312,307,312,311,311,312,302,302,338,310,310,310,310,311,311,313,294,307,313,305,302,305,289,313,305,310,302,310,307,305,310,313,310,289,360,310,307,360,307,307,294,307,313,313,313,289,313,307,313,356,356,356,313,313,289,313,294,313,294,356,313,307,313,338,313,313,289,288,294,307,313,313,289,354,320,307,307,307,307,307,307,289,320,294,320,296,288,288,305,313,296,307,307,338,320,307,313,313,320,360,338,307,307,313,320,320,320,320,313,307,313,320,307,313,291,291,320,291,320,356,289,320,289,355,320,291,320,307,307,307,355,307,355,312,294,294,294,313,294,291,291,313,313,291,312,313,307,287,313,313,313,305,313,357,358,358,313,307,307,313,305,307,307,307,287,307,296,310,302,310,310,296,358,313,313,358,307,307,358,313,307,358,296,296,307,307,302,313,313,307,355,307,355,355,355,355,307,318,307,296,301,307,307,307,355,307,355,307,332,301,301,332,307,332,332,302,302,291,302,332,307,358,291,307,291,291,332,307,291,307,332,301,301,302,332,332,332,302,332,332,332,332,332,332,332,302,332,302,302,302,350,350,350,350,350,350,350,350,350,350,332,350,350,332,332,332,332,332,332,332,306,332,332,332,301,301,301,332,332,302,302,332,306,332,332,332,350,358,358,350,350,358,301,301,301,302,318,332,332,332,332,332,332,332,332,306,332,332,301,301,350,350,350,306,332,358,358,358,332,332,306,350,350,350,350,350,332,332,350,350,350,350,332,332,332,350,350,350,350,332,306,332,332,291,350,350,350,350,350,350,350,350,350,332,332,332,291,350,350,332,332,332,313,332,313,306,313,350,350,302,350,350,350,313,350,350,350,306,313,307,350,318,318,306,307,318,306,318,318,318,307,307,289,318,301,301,291,291,318,307,318,318,318,307,289,307,306,307,313,313,313,307,289,306,307,307,306,289,289,289,289,313,313,307,306,306,307,303,312,352,312,352,352,352,352,352,312,313,312,351,307,312,307,312,352,352,351,305,307,351,307,307,351,351,351,351,351,351,312,351,351,307,307,307,307,307,307,307,312,307,307,351,351,307,307,350,350,350,312,312,307,350,312,350,350,350,350,350,350,350,350,350,350,350,312,312,307,307,307,307,312,312,312,312,312,350,307,356,307,350,350,359,307,286,307,350,350,350,350,307,350,350,350,350,350,350,350,350,350,350,350,350,321,293,321,321,350,321,321,293,350,350,350,350,336,336,336,306,336,350,336,350,306,336,336,336,336,350,350,306,332,336,332,306,336,332,332,332,332,336,312,336,306,312,339,362,362,339,300,362,300,362,312,300,362,306,300,306,300,339,312,339,339,339,339,293,362,362,362,336,285,336,362,300,306,362,336,336,336,336,362,336,336,336,336,336,336,336,349,300,336,336,336,300,336,336,336,336,336,336,349,349,300,336,349,362,336,349,362,336,362,349,336,349,349,362,336,336,336,362,336,362,362,336,336,362,351,362,351,306,306,306,362,362,300,300,362,300,300,336,300,336,336,300,362,300,300,351,351,308,308,308,311,311,311,311,355,355,361,356,356,356,356,356,356,356,356,356,356,291,291,291,350,307,279,307,311,311,315,315,307,315,314,314,314,315,307,307,307,307,356,307,356,306,306,306,314,306,314,314,314,314,314,314,314,306,306,355,306,306,300,300,306,306,306,306,314,314,314,314,314,314,314,314,306,307,309,326,326,326,326,326,326,326,326,326,326,355,355,355,355,286,286,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,286,286,314,314,314,314,314,314,314,309,309,309,308,308,286,354,354,309,309,309,309,309,309,309,309,332,312,323,323,297,297,323,324,324,324,354,354,354,354,354,341,341,341,325,325,325,314,314,315,315,315,314,314,314,314,314,314,314,314,314,314,314,313,313,313,313,313,313,313,313,313,313,313,312,313,313,313,313,313,313,313,311,311,313,312,312,312,312,312,312,312,312,312,311,311,311,311,311,311],"start":"2025-10-26","median_secs":4366,"p90_secs":110541,"p99_secs":703405,"slowest":[{"gap_secs":4236024,"subject":"refactor(clients)!: pair an account with its host in one type","repo":"permadeath.com/atgc","authored_at":"2026-09-02T01:00:26Z","committed_at":"2026-10-21T01:40:50Z"},{"gap_secs":4219414,"subject":"refactor(model): read a pull's target repo in one place","repo":"permadeath.com/atgc","authored_at":"2026-09-02T17:51:01Z","committed_at":"2026-10-21T13:54:35Z"},{"gap_secs":4219329,"subject":"refactor(model): fold state records in one place","repo":"permadeath.com/atgc","authored_at":"2026-09-02T18:07:48Z","committed_at":"2026-10-21T14:09:57Z"},{"gap_secs":4216281,"subject":"fix(pr): read the repo owner's status records when listing","repo":"permadeath.com/atgc","authored_at":"2026-09-02T18:58:36Z","committed_at":"2026-10-21T14:09:57Z"},{"gap_secs":4215523,"subject":"feat(stack)!: settle a contributor's stack without an index","repo":"permadeath.com/atgc","authored_at":"2026-09-02T19:11:14Z","committed_at":"2026-10-21T14:09:57Z"},{"gap_secs":4215316,"subject":"fix(stack): never enter a chain through a record that has no at-uri","repo":"permadeath.com/atgc","authored_at":"2026-09-02T20:14:04Z","committed_at":"2026-10-21T15:09:20Z"},{"gap_secs":4209354,"subject":"refactor(features)!: a body plan is a value over a catalogue, not an enum","repo":"lance.blue/sds","authored_at":"2026-09-03T21:10:08Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4208885,"subject":"feat(features): a VTOL is a body plan, and its rotor is the whole of it","repo":"lance.blue/sds","authored_at":"2026-09-03T21:17:57Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4208655,"subject":"docs(unit-types): what a body plan is made of, and what a VTOL's movement costs","repo":"lance.blue/sds","authored_at":"2026-09-03T21:21:47Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4207878,"subject":"fix(features): a transfer answer is three values, because MegaMek gives three","repo":"lance.blue/sds","authored_at":"2026-09-03T21:34:44Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4207174,"subject":"feat(protocol): a terrain kind's answer for a flier is two numbers","repo":"lance.blue/sds","authored_at":"2026-09-03T22:17:49Z","committed_at":"2026-10-22T14:57:23Z"},{"gap_secs":4207141,"subject":"feat(features): a quad and a tripod are body plans, measured not derived","repo":"lance.blue/sds","authored_at":"2026-09-03T21:47:01Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4206894,"subject":"feat(features): a torso-mounted cockpit is a fact about a design, not a plan","repo":"lance.blue/sds","authored_at":"2026-09-03T21:51:08Z","committed_at":"2026-10-22T14:26:02Z"},{"gap_secs":4205804,"subject":"feat(features): a flier's position includes its elevation","repo":"lance.blue/sds","authored_at":"2026-09-03T22:40:39Z","committed_at":"2026-10-22T14:57:23Z"},{"gap_secs":4204831,"subject":"feat(features): the movement corpus records a helicopter that flies","repo":"lance.blue/sds","authored_at":"2026-09-03T22:56:52Z","committed_at":"2026-10-22T14:57:23Z"},{"gap_secs":4182849,"subject":"docs(c3): no network has ever been formed in a match here","repo":"lance.blue/sds","authored_at":"2026-09-04T04:31:46Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4178543,"subject":"refactor(model): move the last chain walk, and trust the knot's own document","repo":"permadeath.com/atgc","authored_at":"2026-09-02T16:58:27Z","committed_at":"2026-10-21T01:40:50Z"},{"gap_secs":4177534,"subject":"fix(issue): read the repo owner's state records too","repo":"permadeath.com/atgc","authored_at":"2026-09-02T17:15:16Z","committed_at":"2026-10-21T01:40:50Z"},{"gap_secs":4143639,"subject":"feat(c3): what a network brackets, per unit, on the wire","repo":"lance.blue/sds","authored_at":"2026-09-04T15:25:16Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4143554,"subject":"feat(c3): the projection reads the bracket its spotter earns","repo":"lance.blue/sds","authored_at":"2026-09-04T15:26:41Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4143465,"subject":"feat(c3): the harness reads a V2 scenario's seats, and a lance to try it on","repo":"lance.blue/sds","authored_at":"2026-09-04T15:28:10Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4143456,"subject":"docs(c3): what the jar says, and why the network belongs in the scenario","repo":"lance.blue/sds","authored_at":"2026-09-04T15:28:19Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4141896,"subject":"fix(c3): battle value rounds the way the jar rounds","repo":"lance.blue/sds","authored_at":"2026-09-04T15:54:19Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4141885,"subject":"feat(c3): the generator prices the network it writes","repo":"lance.blue/sds","authored_at":"2026-09-04T15:54:30Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4141875,"subject":"feat(c3): sds scenarios --c3 writes a networked suite","repo":"lance.blue/sds","authored_at":"2026-09-04T15:54:40Z","committed_at":"2026-10-22T14:25:55Z"},{"gap_secs":4123669,"subject":"fix(pr): count and list a pull's rounds the same way","repo":"permadeath.com/atgc","authored_at":"2026-09-03T21:28:37Z","committed_at":"2026-10-21T14:56:26Z"},{"gap_secs":4111428,"subject":"docs(ev): three armour types reduce damage per weapon, not per location","repo":"lance.blue/sds","authored_at":"2026-09-04T00:50:17Z","committed_at":"2026-10-21T14:54:05Z"},{"gap_secs":4111264,"subject":"fix(features): armour that eats damage was priced as though it did not","repo":"lance.blue/sds","authored_at":"2026-09-04T00:46:36Z","committed_at":"2026-10-21T14:47:40Z"},{"gap_secs":4109626,"subject":"feat(protocol): armour that takes a point off every N, on the wire","repo":"lance.blue/sds","authored_at":"2026-09-04T00:42:17Z","committed_at":"2026-10-21T14:16:03Z"},{"gap_secs":4094699,"subject":"feat(ev): carry whether a unit mounts AMS, and what it would engage","repo":"lance.blue/sds","authored_at":"2026-09-04T04:42:07Z","committed_at":"2026-10-21T14:07:06Z"},{"gap_secs":4093896,"subject":"feat(ev): a missile shot at an AMS carrier takes four off its cluster roll","repo":"lance.blue/sds","authored_at":"2026-09-04T05:01:27Z","committed_at":"2026-10-21T14:13:03Z"},{"gap_secs":4069179,"subject":"fix(pr): refuse a merge in the range a patch-only pull is built from","repo":"permadeath.com/atgc","authored_at":"2026-09-04T12:19:36Z","committed_at":"2026-10-21T14:39:15Z"},{"gap_secs":4067968,"subject":"fix(pr): refuse to merge a pull that is closed or already merged","repo":"permadeath.com/atgc","authored_at":"2026-09-04T12:39:47Z","committed_at":"2026-10-21T14:39:15Z"},{"gap_secs":4067089,"subject":"fix(pr): say when a diff will not apply by itself","repo":"permadeath.com/atgc","authored_at":"2026-09-04T13:24:31Z","committed_at":"2026-10-21T15:09:20Z"},{"gap_secs":4066260,"subject":"fix(pr,stack): name the scope a write costs before spending it","repo":"permadeath.com/atgc","authored_at":"2026-09-04T13:51:47Z","committed_at":"2026-10-21T15:22:47Z"},{"gap_secs":4064428,"subject":"fix(stack): keep a stack aimed at one branch through adopt and resubmit","repo":"permadeath.com/atgc","authored_at":"2026-09-04T12:54:46Z","committed_at":"2026-10-21T13:55:14Z"},{"gap_secs":4064221,"subject":"fix(stack): refuse a sync whose two halves name different branches","repo":"permadeath.com/atgc","authored_at":"2026-09-04T12:58:13Z","committed_at":"2026-10-21T13:55:14Z"},{"gap_secs":4022718,"subject":"test: cover the scope refusal, and say how model/ is divided","repo":"permadeath.com/atgc","authored_at":"2026-09-05T01:57:29Z","committed_at":"2026-10-21T15:22:47Z"},{"gap_secs":3963665,"subject":"docs(browser): an epic for seating sds on lance.blue and then in the browser","repo":"lance.blue/sds","authored_at":"2026-09-05T16:44:41Z","committed_at":"2026-10-21T13:45:46Z"},{"gap_secs":3939405,"subject":"docs(harness): correct default bot in documentation","repo":"lance.blue/sds","authored_at":"2026-09-05T23:28:17Z","committed_at":"2026-10-21T13:45:02Z"},{"gap_secs":3939391,"subject":"docs(playing): correct architecture description","repo":"lance.blue/sds","authored_at":"2026-09-05T23:28:31Z","committed_at":"2026-10-21T13:45:02Z"},{"gap_secs":3939377,"subject":"docs(candidates): PERFORMANCE.md and training.md still described the removed candidate cap","repo":"lance.blue/sds","authored_at":"2026-09-05T23:28:27Z","committed_at":"2026-10-21T13:44:44Z"},{"gap_secs":3939371,"subject":"docs(objectives): the tactic is Withdraw, not Retreat","repo":"lance.blue/sds","authored_at":"2026-09-05T23:28:33Z","committed_at":"2026-10-21T13:44:44Z"},{"gap_secs":3939366,"subject":"docs(melee): phaseName() already gives PHYSICAL its own tally","repo":"lance.blue/sds","authored_at":"2026-09-05T23:28:38Z","committed_at":"2026-10-21T13:44:44Z"},{"gap_secs":3939337,"subject":"docs(readme): correct default bot in example command","repo":"lance.blue/sds","authored_at":"2026-09-05T23:29:25Z","committed_at":"2026-10-21T13:45:02Z"},{"gap_secs":3938011,"subject":"docs(observability): exploration is movement-only, not movement and firing.","repo":"lance.blue/sds","authored_at":"2026-09-05T23:51:51Z","committed_at":"2026-10-21T13:45:22Z"},{"gap_secs":3938002,"subject":"docs(plan): remove reference to nonexistent plan/complete/ directory.","repo":"lance.blue/sds","authored_at":"2026-09-05T23:52:00Z","committed_at":"2026-10-21T13:45:22Z"},{"gap_secs":3937981,"subject":"docs(plan): remove references to nonexistent complete/ directory.","repo":"lance.blue/sds","authored_at":"2026-09-05T23:52:21Z","committed_at":"2026-10-21T13:45:22Z"},{"gap_secs":3936469,"subject":"docs(candidates): tmm feature was renamed to level_tmm","repo":"lance.blue/sds","authored_at":"2026-09-06T00:17:25Z","committed_at":"2026-10-21T13:45:14Z"},{"gap_secs":3936460,"subject":"docs(tactics): fix doc-comment reference to a renamed Status variant","repo":"lance.blue/sds","authored_at":"2026-09-06T00:17:34Z","committed_at":"2026-10-21T13:45:14Z"},{"gap_secs":3936450,"subject":"docs(candidates): note that the four-verb generator flag is gone","repo":"lance.blue/sds","authored_at":"2026-09-06T00:17:44Z","committed_at":"2026-10-21T13:45:14Z"},{"gap_secs":1762563,"subject":"fix(collection): stop the footer drawing from a signal handler","repo":"permadeath.com/didbot-claude","authored_at":"2026-09-05T02:58:00Z","committed_at":"2026-09-25T12:34:03Z"},{"gap_secs":1691226,"subject":"fix(plan): drop check-plan's reference to a script that never existed","repo":"permadeath.com/didbot-claude","authored_at":"2026-09-05T22:46:47Z","committed_at":"2026-09-25T12:33:53Z"},{"gap_secs":1358024,"subject":"feat(index)!: follow a server over com.atproto.sync.subscribeRepos","repo":"permadeath.com/vibescrobble.com","authored_at":"2026-09-16T21:39:49Z","committed_at":"2026-10-02T14:53:33Z"},{"gap_secs":1358018,"subject":"refactor(index): drop the names didbot retired","repo":"permadeath.com/vibescrobble.com","authored_at":"2026-09-16T21:39:55Z","committed_at":"2026-10-02T14:53:33Z"},{"gap_secs":746785,"subject":"fix(plugin): spell the sign-in commands as didbot oauth","repo":"permadeath.com/didbot-claude","authored_at":"2026-09-16T21:06:57Z","committed_at":"2026-09-25T12:33:22Z"},{"gap_secs":704017,"subject":"build: build the production image with the pinned rustc 1.97.1","repo":"permadeath.com/didbot","authored_at":"2026-10-02T17:04:25Z","committed_at":"2026-10-10T20:38:02Z"},{"gap_secs":704013,"subject":"feat(infra): encrypt both EBS volumes under a customer-managed KMS key","repo":"permadeath.com/didbot","authored_at":"2026-10-02T17:04:41Z","committed_at":"2026-10-10T20:38:14Z"}]},"repos":[{"repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","name":"didbot","full_name":"permadeath.com/didbot","url":"https://tangled.org/permadeath.com/didbot","website":"https://did.bot","owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":1841,"mine":1841,"last_30":288},{"repo_key":"tangled:did:plc:gspkabpde4kx47fj3bhiwrms","name":"atgc","full_name":"permadeath.com/atgc","url":"https://tangled.org/permadeath.com/atgc","website":null,"owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":838,"mine":838,"last_30":36},{"repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","name":"sds","full_name":"lance.blue/sds","url":"https://tangled.org/lance.blue/sds","website":null,"owner":"did:plc:a2j2g42ai6v65qpbvb6hmubi","knot":"knot1.tangled.sh","commits":741,"mine":741,"last_30":52},{"repo_key":"tangled:did:plc:c7revjn3xut66tmriqey4j6p","name":"vibescrobble.com","full_name":"permadeath.com/vibescrobble.com","url":"https://tangled.org/permadeath.com/vibescrobble.com","website":"https://vibescrobble.com","owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":741,"mine":741,"last_30":514},{"repo_key":"tangled:did:plc:dgkn4sgicqawm3djtlje4xhh","name":"headquarters","full_name":"lance.blue/headquarters","url":"https://tangled.org/lance.blue/headquarters","website":null,"owner":"did:plc:a2j2g42ai6v65qpbvb6hmubi","knot":"knot1.tangled.sh","commits":577,"mine":575,"last_30":2},{"repo_key":"github:redacted:work:h_9c89d8877ef704ad","name":"work GitHub \u00b7 h_9c89d8877ef704ad","full_name":"work GitHub \u00b7 h_9c89d8877ef704ad","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":418,"mine":418,"last_30":71},{"repo_key":"tangled:did:plc:bz2xb4ejbeeszw6frdcxm3sn","name":"substandard","full_name":"permadeath.com/substandard","url":"https://tangled.org/permadeath.com/substandard","website":null,"owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":342,"mine":342,"last_30":48},{"repo_key":"tangled:did:plc:ggrnua45ltx7sxk6o4no45lc","name":"helm","full_name":"lance.blue/helm","url":"https://tangled.org/lance.blue/helm","website":null,"owner":"did:plc:a2j2g42ai6v65qpbvb6hmubi","knot":"knot1.tangled.sh","commits":243,"mine":243,"last_30":2},{"repo_key":"tangled:did:plc:6g2oekc75hx7swfxwvhyhfxf","name":"arena","full_name":"lance.blue/arena","url":"https://tangled.org/lance.blue/arena","website":null,"owner":"did:plc:a2j2g42ai6v65qpbvb6hmubi","knot":"knot1.tangled.sh","commits":232,"mine":230,"last_30":2},{"repo_key":"tangled:did:plc:v36piv3jeklgka53ogmfxn66","name":"infra","full_name":"lance.blue/infra","url":"https://tangled.org/lance.blue/infra","website":null,"owner":"did:plc:a2j2g42ai6v65qpbvb6hmubi","knot":"knot1.tangled.sh","commits":183,"mine":181,"last_30":2},{"repo_key":"github:redacted:personal:h_1a424e012963153b","name":"personal GitHub \u00b7 h_1a424e012963153b","full_name":"personal GitHub \u00b7 h_1a424e012963153b","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":92,"mine":92,"last_30":77},{"repo_key":"github:redacted:personal:h_74ad699c47b1addd","name":"personal GitHub \u00b7 h_74ad699c47b1addd","full_name":"personal GitHub \u00b7 h_74ad699c47b1addd","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":90,"mine":90,"last_30":0},{"repo_key":"github:redacted:work:h_dfedf33665d4a4e8","name":"work GitHub \u00b7 h_dfedf33665d4a4e8","full_name":"work GitHub \u00b7 h_dfedf33665d4a4e8","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":73,"mine":73,"last_30":7},{"repo_key":"github:redacted:work:h_817b787bd9b33e7d","name":"work GitHub \u00b7 h_817b787bd9b33e7d","full_name":"work GitHub \u00b7 h_817b787bd9b33e7d","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":65,"mine":65,"last_30":7},{"repo_key":"github:redacted:work:h_22b4a3a898182b97","name":"work GitHub \u00b7 h_22b4a3a898182b97","full_name":"work GitHub \u00b7 h_22b4a3a898182b97","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":63,"mine":63,"last_30":1},{"repo_key":"github:redacted:work:h_987d5694cf930d3f","name":"work GitHub \u00b7 h_987d5694cf930d3f","full_name":"work GitHub \u00b7 h_987d5694cf930d3f","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":62,"mine":62,"last_30":0},{"repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","name":"dev.permadeath.com","full_name":"permadeath.com/dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com","website":null,"owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":61,"mine":60,"last_30":60},{"repo_key":"github:redacted:work:h_815daac7382d4072","name":"work GitHub \u00b7 h_815daac7382d4072","full_name":"work GitHub \u00b7 h_815daac7382d4072","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":53,"mine":53,"last_30":7},{"repo_key":"tangled:did:plc:jdjdbeosqdyd63swtewojj6m","name":"didbot-claude","full_name":"permadeath.com/didbot-claude","url":"https://tangled.org/permadeath.com/didbot-claude","website":null,"owner":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","knot":"knot1.tangled.sh","commits":50,"mine":50,"last_30":25},{"repo_key":"github:redacted:work:h_919f24acf2af3f21","name":"work GitHub \u00b7 h_919f24acf2af3f21","full_name":"work GitHub \u00b7 h_919f24acf2af3f21","url":"","website":null,"owner":"","knot":"github \u00b7 redacted","commits":48,"mine":48,"last_30":5}],"projects":[{"repo_key":"tangled:did:plc:c7revjn3xut66tmriqey4j6p","name":"vibescrobble.com","full_name":"permadeath.com/vibescrobble.com","url":"https://tangled.org/permadeath.com/vibescrobble.com","website":"https://vibescrobble.com","knot":"knot1.tangled.sh","last_30":514,"prior_90":227,"weekly":[0,0,0,112,70,40,2,25,3,87,266,136],"redacted":false},{"repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","name":"didbot","full_name":"permadeath.com/didbot","url":"https://tangled.org/permadeath.com/didbot","website":"https://did.bot","knot":"knot1.tangled.sh","last_30":288,"prior_90":1553,"weekly":[0,0,0,277,563,305,110,320,40,25,158,43],"redacted":false},{"repo_key":"github:redacted:personal:h_1a424e012963153b","name":"personal GitHub \u00b7 h_1a424e012963153b","full_name":"personal GitHub \u00b7 h_1a424e012963153b","url":"","website":null,"knot":"github \u00b7 redacted","last_30":77,"prior_90":15,"weekly":[0,0,0,0,15,0,0,0,0,0,0,77],"redacted":true},{"repo_key":"github:redacted:work:h_9c89d8877ef704ad","name":"work GitHub \u00b7 h_9c89d8877ef704ad","full_name":"work GitHub \u00b7 h_9c89d8877ef704ad","url":"","website":null,"knot":"github \u00b7 redacted","last_30":71,"prior_90":347,"weekly":[0,0,0,0,229,70,20,28,19,8,43,1],"redacted":true},{"repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","name":"dev.permadeath.com","full_name":"permadeath.com/dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com","website":null,"knot":"knot1.tangled.sh","last_30":60,"prior_90":0,"weekly":[0,0,0,0,0,0,0,0,0,0,0,60],"redacted":false},{"repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","name":"sds","full_name":"lance.blue/sds","url":"https://tangled.org/lance.blue/sds","website":null,"knot":"knot1.tangled.sh","last_30":52,"prior_90":689,"weekly":[0,0,173,365,151,0,0,0,0,0,0,52],"redacted":false},{"repo_key":"tangled:did:plc:bz2xb4ejbeeszw6frdcxm3sn","name":"substandard","full_name":"permadeath.com/substandard","url":"https://tangled.org/permadeath.com/substandard","website":null,"knot":"knot1.tangled.sh","last_30":48,"prior_90":294,"weekly":[150,107,34,0,3,0,0,0,0,0,0,48],"redacted":false},{"repo_key":"tangled:did:plc:gspkabpde4kx47fj3bhiwrms","name":"atgc","full_name":"permadeath.com/atgc","url":"https://tangled.org/permadeath.com/atgc","website":null,"knot":"knot1.tangled.sh","last_30":36,"prior_90":802,"weekly":[168,255,83,162,134,0,0,0,0,0,0,36],"redacted":false},{"repo_key":"github:redacted:personal:h_4e2e495aa2105508","name":"personal GitHub \u00b7 h_4e2e495aa2105508","full_name":"personal GitHub \u00b7 h_4e2e495aa2105508","url":"","website":null,"knot":"github \u00b7 redacted","last_30":27,"prior_90":0,"weekly":[0,0,0,0,0,0,0,0,0,0,0,27],"redacted":true},{"repo_key":"tangled:did:plc:jdjdbeosqdyd63swtewojj6m","name":"didbot-claude","full_name":"permadeath.com/didbot-claude","url":"https://tangled.org/permadeath.com/didbot-claude","website":null,"knot":"knot1.tangled.sh","last_30":25,"prior_90":25,"weekly":[0,0,0,0,14,4,1,12,6,3,2,8],"redacted":false}],"recent":[{"sha":"a31e9d4fad31db42502624c320c922aac0c11317","short":"a31e9d4fad","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/a31e9d4fad31db42502624c320c922aac0c11317","authored_at":"2026-10-25T22:30:56Z","message":"docs(harness): measure the repeat-run variance"},{"sha":"d558b652ab018cf6e5bc5dc522c46b992492749d","short":"d558b652ab","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/d558b652ab018cf6e5bc5dc522c46b992492749d","authored_at":"2026-10-25T22:07:10Z","message":"docs: regenerate the mockup and previews with the restored styles"},{"sha":"a0199f2644eb94a4f2447adbbb305d3402bb8e99","short":"a0199f2644","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/a0199f2644eb94a4f2447adbbb305d3402bb8e99","authored_at":"2026-10-25T22:07:09Z","message":"fix: restore the comment opener before the commit-types styles"},{"sha":"ffbc1cbaed7c0dd3f9749d29caba9e47f3ac9bc9","short":"ffbc1cbaed","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/ffbc1cbaed7c0dd3f9749d29caba9e47f3ac9bc9","authored_at":"2026-10-25T21:49:07Z","message":"docs: regenerate the mockup and previews with the paired charts"},{"sha":"91db160a2bf3a3971b2cc3ad471aa947ff6986e3","short":"91db160a2b","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/91db160a2bf3a3971b2cc3ad471aa947ff6986e3","authored_at":"2026-10-25T21:49:07Z","message":"feat: pair commits by date and by time, and drop the identities card"},{"sha":"d3d2cc3d6fdb07e7ce01e34b04d30833d33bbd99","short":"d3d2cc3d6f","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/d3d2cc3d6fdb07e7ce01e34b04d30833d33bbd99","authored_at":"2026-10-25T21:44:13Z","message":"feat: a written-to-landed scatter of author-to-commit gaps by date"},{"sha":"48e46211d36570f46c115af89a8a9e4424f74ebe","short":"48e46211d3","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/48e46211d36570f46c115af89a8a9e4424f74ebe","authored_at":"2026-10-25T21:37:34Z","message":"docs: regenerate the mockup and previews with commit types"},{"sha":"2b92a591eca648aaea22f825762891058a6e7854","short":"2b92a591ec","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/2b92a591eca648aaea22f825762891058a6e7854","authored_at":"2026-10-25T21:36:36Z","message":"feat: a commit-types card of Conventional Commits per week"},{"sha":"b0dcd5c7682f8ff0e695ca5bbda2c595a3f023ee","short":"b0dcd5c768","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:c7revjn3xut66tmriqey4j6p","repo":"vibescrobble.com","url":"https://tangled.org/permadeath.com/vibescrobble.com/commit/b0dcd5c7682f8ff0e695ca5bbda2c595a3f023ee","authored_at":"2026-10-25T20:24:49Z","message":"fix(web): keep an agent's newest line when a reread announces older ones"},{"sha":"3f5a10ae0854d9255f4714bfcd9a034a8429627e","short":"3f5a10ae08","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","repo":"didbot","url":"https://tangled.org/permadeath.com/didbot/commit/3f5a10ae0854d9255f4714bfcd9a034a8429627e","authored_at":"2026-10-25T20:21:40Z","message":"fix(serve): end a getBlob body that reads slower than a minimum rate"},{"sha":"2e2f7e5c5ceeb6600a9d83034bb828c8b94026ab","short":"2e2f7e5c5c","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:c7revjn3xut66tmriqey4j6p","repo":"vibescrobble.com","url":"https://tangled.org/permadeath.com/vibescrobble.com/commit/2e2f7e5c5ceeb6600a9d83034bb828c8b94026ab","authored_at":"2026-10-25T20:19:07Z","message":"fix(index): count a line the fill reads again at the time it was first held"},{"sha":"ce6599a82fc9f853a7564f580ccdaf3962384230","short":"ce6599a82f","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:c7revjn3xut66tmriqey4j6p","repo":"vibescrobble.com","url":"https://tangled.org/permadeath.com/vibescrobble.com/commit/ce6599a82fc9f853a7564f580ccdaf3962384230","authored_at":"2026-10-25T20:15:05Z","message":"fix(index): take accounts let go for room off the leaderboard with the board"},{"sha":"c6586e771c13f37440065e140e9f78a8f21b9326","short":"c6586e771c","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","repo":"didbot","url":"https://tangled.org/permadeath.com/didbot/commit/c6586e771c13f37440065e140e9f78a8f21b9326","authored_at":"2026-10-25T20:10:19Z","message":"fix(oauth): charge the DPoP replay share per key, not per account"},{"sha":"63e5f1a25aa40502e28d193668e3727e56a29224","short":"63e5f1a25a","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/63e5f1a25aa40502e28d193668e3727e56a29224","authored_at":"2026-10-25T19:50:05Z","message":"docs(beliefs): record the attrition fit and its held-out evidence"},{"sha":"2770b0cfa53ebb1b19ae16f8adfc13021ad75dd3","short":"2770b0cfa5","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/2770b0cfa53ebb1b19ae16f8adfc13021ad75dd3","authored_at":"2026-10-25T19:49:52Z","message":"test(beliefs): pin the attrition fit's rates, split and refusals"},{"sha":"35f35cafe125e918599108a40ee94de7b5206423","short":"35f35cafe1","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/35f35cafe125e918599108a40ee94de7b5206423","authored_at":"2026-10-25T19:49:38Z","message":"feat(beliefs): fit per-side attrition from recorded per-round BV"},{"sha":"6c5d9e5ecec4e480cd59edb82289c48842cada07","short":"6c5d9e5ece","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/6c5d9e5ecec4e480cd59edb82289c48842cada07","authored_at":"2026-10-25T19:49:26Z","message":"docs: regenerate the mockup and previews with project sparklines"},{"sha":"3b68963c466e85b51592f67daa73196db79f1074","short":"3b68963c46","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/3b68963c466e85b51592f67daa73196db79f1074","authored_at":"2026-10-25T19:49:25Z","message":"feat: twelve-week sparklines under each project"},{"sha":"98e1c9e66b8aadc668792380a6e18c4a7e582ecc","short":"98e1c9e66b","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/98e1c9e66b8aadc668792380a6e18c4a7e582ecc","authored_at":"2026-10-25T19:40:12Z","message":"feat: a quiet daily sparkline of the trailing 30-day share"},{"sha":"afb6583d27f4273343071caa798c2d6481a1caa1","short":"afb6583d27","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","repo":"didbot","url":"https://tangled.org/permadeath.com/didbot/commit/afb6583d27f4273343071caa798c2d6481a1caa1","authored_at":"2026-10-25T19:34:34Z","message":"test(scenarios): run the firehose scenarios under announce = on-create"},{"sha":"6b45efa082524f2b7f5ac8427a8e35fe9e1c61f9","short":"6b45efa082","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/6b45efa082524f2b7f5ac8427a8e35fe9e1c61f9","authored_at":"2026-10-25T19:22:59Z","message":"docs(harness): record the timeout restart policy"},{"sha":"e7b1db43d93b308375b706ea38bcc1e60fa31f88","short":"e7b1db43d9","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/e7b1db43d93b308375b706ea38bcc1e60fa31f88","authored_at":"2026-10-25T19:22:55Z","message":"test(harness): exercise the timeout restart policy"},{"sha":"d4ce5ba8bae2a3c2fdb9214cadec55b0e75fbb1d","short":"d4ce5ba8ba","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/d4ce5ba8bae2a3c2fdb9214cadec55b0e75fbb1d","authored_at":"2026-10-25T19:22:43Z","message":"fix(harness): restart a live bot after a decision timeout"},{"sha":"5ae9312fd41086566dd60e30a843cc20ed36f76a","short":"5ae9312fd4","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/5ae9312fd41086566dd60e30a843cc20ed36f76a","authored_at":"2026-10-25T18:58:28Z","message":"docs: regenerate the mockup and previews with the wheel"},{"sha":"5a022d4055f45ca9734ffe9aca17187c1eca1952","short":"5a022d4055","author_did":"did:web:chalcedony-mara.test.pds.did.bot","author":"chalcedony-mara.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:v2aguxduy4e3ketkuxsvrohh","repo":"dev.permadeath.com","url":"https://tangled.org/permadeath.com/dev.permadeath.com/commit/5a022d4055f45ca9734ffe9aca17187c1eca1952","authored_at":"2026-10-25T18:41:54Z","message":"feat: a time-of-day wheel of commit activity"},{"sha":"c1f6baed0058382d76c13433df5b94767896e16c","short":"c1f6baed00","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/c1f6baed0058382d76c13433df5b94767896e16c","authored_at":"2026-10-25T18:35:57Z","message":"perf(scoring): bound the 8v8 decision and cache the tactic vocabulary"},{"sha":"c9922e8e655dd694871b533f0d46808072754686","short":"c9922e8e65","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:swttlkbjvcoln67iievud7b3","repo":"didbot","url":"https://tangled.org/permadeath.com/didbot/commit/c9922e8e655dd694871b533f0d46808072754686","authored_at":"2026-10-25T18:32:00Z","message":"fix(deps): bump tokio to 1.53.3 for RUSTSEC-2026-0386"},{"sha":"ad0eab92273f6d603feb6dda0ba0c35cde6b8c4a","short":"ad0eab9227","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/ad0eab92273f6d603feb6dda0ba0c35cde6b8c4a","authored_at":"2026-10-25T18:25:43Z","message":"perf(harness): shard the corpus save scan and default reads to a pool"},{"sha":"6e7f5d7a83c4c4a8b74a967ea8e4940881bd08f9","short":"6e7f5d7a83","author_did":"did:web:projective-bichuwa.test.pds.did.bot","author":"projective-bichuwa.test.pds.did.bot","color":"series-5","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/6e7f5d7a83c4c4a8b74a967ea8e4940881bd08f9","authored_at":"2026-10-25T18:25:36Z","message":"perf(training): parse corpus logs in parallel, accumulate in log order"},{"sha":"fbed55484b6b1419cb9b712eba0fa88c8fa48fd4","short":"fbed55484b","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:tkbde3j4vpjdxodc4jnylits","repo":"lexicons","url":"https://tangled.org/lance.blue/lexicons/commit/fbed55484b6b1419cb9b712eba0fa88c8fa48fd4","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"bd4440c7ead7cdd8dfbd8f3ac5e066dad9f8c762","short":"bd4440c7ea","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:dgkn4sgicqawm3djtlje4xhh","repo":"headquarters","url":"https://tangled.org/lance.blue/headquarters/commit/bd4440c7ead7cdd8dfbd8f3ac5e066dad9f8c762","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"d2dd1942df144cb07e5af485e92494cbee777000","short":"d2dd1942df","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:v36piv3jeklgka53ogmfxn66","repo":"infra","url":"https://tangled.org/lance.blue/infra/commit/d2dd1942df144cb07e5af485e92494cbee777000","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"651296739b563aa6740c257f30894cdd2f1dd06f","short":"651296739b","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:ggrnua45ltx7sxk6o4no45lc","repo":"helm","url":"https://tangled.org/lance.blue/helm/commit/651296739b563aa6740c257f30894cdd2f1dd06f","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"47b36b2c039a6fcec8d02ccb4248c6dfa2c684fe","short":"47b36b2c03","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/47b36b2c039a6fcec8d02ccb4248c6dfa2c684fe","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"d48db10dbb0461c0b6c5b1f4ca3fcf0429c7d8d9","short":"d48db10dbb","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:6g2oekc75hx7swfxwvhyhfxf","repo":"arena","url":"https://tangled.org/lance.blue/arena/commit/d48db10dbb0461c0b6c5b1f4ca3fcf0429c7d8d9","authored_at":"2026-10-25T18:07:53Z","message":"docs: sync AGENTS.md's shared sections and import it from CLAUDE.md"},{"sha":"8583baf95c7ea275cd5e2722482075eb9714943c","short":"8583baf95c","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:v36piv3jeklgka53ogmfxn66","repo":"infra","url":"https://tangled.org/lance.blue/infra/commit/8583baf95c7ea275cd5e2722482075eb9714943c","authored_at":"2026-10-25T18:06:33Z","message":"docs: rename CLAUDE.md to AGENTS.md"},{"sha":"47e3e33f2913c0539f9f146cf0afc9e2eb4cedba","short":"47e3e33f29","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:oa6imrllgexfgjic2hznue5z","repo":"sds","url":"https://tangled.org/lance.blue/sds/commit/47e3e33f2913c0539f9f146cf0afc9e2eb4cedba","authored_at":"2026-10-25T18:06:33Z","message":"docs: rename CLAUDE.md to AGENTS.md"},{"sha":"ed77a745c27954340832c1489d025dd58aaeaf39","short":"ed77a745c2","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:dgkn4sgicqawm3djtlje4xhh","repo":"headquarters","url":"https://tangled.org/lance.blue/headquarters/commit/ed77a745c27954340832c1489d025dd58aaeaf39","authored_at":"2026-10-25T18:06:33Z","message":"docs: rename CLAUDE.md to AGENTS.md"},{"sha":"aa1fce7aac963f90cb281201be657f2dd82fcdb9","short":"aa1fce7aac","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:6g2oekc75hx7swfxwvhyhfxf","repo":"arena","url":"https://tangled.org/lance.blue/arena/commit/aa1fce7aac963f90cb281201be657f2dd82fcdb9","authored_at":"2026-10-25T18:06:33Z","message":"docs: rename CLAUDE.md to AGENTS.md"},{"sha":"a7d85a0bf7d6bc818d0b90d46bdd0b9174348348","short":"a7d85a0bf7","author_did":"did:plc:nlzmjyfv6loqtxyzvdcznwgf","author":"permadeath.com","color":"series-red","repo_key":"tangled:did:plc:tkbde3j4vpjdxodc4jnylits","repo":"lexicons","url":"https://tangled.org/lance.blue/lexicons/commit/a7d85a0bf7d6bc818d0b90d46bdd0b9174348348","authored_at":"2026-10-25T18:06:33Z","message":"docs: rename CLAUDE.md to AGENTS.md"}],"status":{"repos_total":18,"repos_scanned":17,"repos_failed":1,"branches_total":353,"branches_indexed":308,"bots_known":615,"bots_active":615,"last_crawl_started":"2026-10-25T22:41:47Z","last_crawl_finished":"2026-10-25T22:41:56Z","global_summary_at":"2026-10-25T19:33:04Z","global_summary_stale":false,"budget_exhausted":false,"scope":"owned","queue_this_run":18,"commits_seen_this_run":856,"commits_new_this_run":59,"errors":[{"repo":"did:plc:v36piv3jeklgka53ogmfxn66","error":"reading commits for did:plc:v36piv3jeklgka53ogmfxn66 at claude/agents-md: GET https://knot1.tangled.sh/xrpc/sh.tangled.repo.log?repo=did%3Aplc%3Av36piv3jeklgka53ogmfxn66&ref=claude%2Fagents-md&limit=100&cursor=0 returned 404: {\"error\":\"RefNotFound\",\"message\":\"git reference not found\"}"}],"github":{"configured":false,"repos":0,"repos_scanned":0,"commits_new":0,"errors":0,"accounts":[]},"work_inbox":null}};</script> <script>"use strict";
const $ = (id) => document.getElementById(id);const state = { data: null, days: 30, wheelDays: 30, sharePeriod: "1y", table: false, wheelTable: false, typesTable: false, loading: false,};
/* ---------- formatting ---------- */
const number = new Intl.NumberFormat(undefined);const compactNumber = new Intl.NumberFormat(undefined, { notation: "compact", maximumFractionDigits: 1,});
function fmt(n) { return n >= 100000 ? compactNumber.format(n) : number.format(n);}
function pct(n) { return `${Number(n).toFixed(1)}%`;}
const SERIES_ORDER = [ "series-red", "series-1", "series-3", "series-4", "series-5", "series-6", "series-7",];
function slot(color) { const index = SERIES_ORDER.indexOf(color); return index >= 0 ? index : 99;}
function seriesColor(color) { return `var(--${color || "series-1"})`;}
function shortDate(iso) { const date = new Date(iso); if (Number.isNaN(date.getTime())) return iso; return date.toLocaleDateString(undefined, { month: "short", day: "numeric" });}
function dateTime(iso) { const date = new Date(iso); if (Number.isNaN(date.getTime())) return iso; return date.toLocaleString(undefined, { dateStyle: "medium", timeStyle: "short", });}
function dayLabel(day) { const date = new Date(`${day}T12:00:00Z`); return date.toLocaleDateString(undefined, { month: "short", day: "numeric" });}
function el(tag, className, text) { const node = document.createElement(tag); if (className) node.className = className; if (text !== undefined) node.textContent = text; return node;}
/* ---------- series ---------- */
function seriesList() { const data = state.data; if (!data) return []; const out = data.identities .filter((identity) => identity.kind === "personal" || identity.kind === "github") .map((identity) => ({ key: identity.did, label: identity.handle, color: identity.color, kind: identity.kind, })); if (data.summary.bots_tangled > 0) { out.push({ key: "bots", label: "did.bot agents", color: "series-5", kind: "bots" }); } out.sort((a, b) => slot(a.color) - slot(b.color)); return out;}
function valueFor(point, series) { if (series.kind === "personal" || series.kind === "github") { return (point.identities && point.identities[series.key]) || 0; } return point.bots || 0;}
function visiblePoints() { return state.data.daily.slice(-state.days);}
/* ---------- load ---------- */
async function load() { // A single-file mockup embeds the data before this script, so it can be // opened without a server or a fetch. if (window.__TALLY_DATA__) { state.data = window.__TALLY_DATA__; render(); return; } const main = document.querySelector("main"); if (state.loading) return; state.loading = true; main.classList.add("loading"); try { const response = await fetch("data/site.json", { cache: "no-store" }); if (!response.ok) throw new Error(`HTTP ${response.status}`); state.data = await response.json(); render(); } catch (error) { $("asof").textContent = `could not load data: ${error}`; } finally { state.loading = false; main.classList.remove("loading"); }}
/* ---------- render ---------- */
function render() { const data = state.data; const summary = data.summary; document.title = `${summary.title} · dev.permadeath.com`; $("title").textContent = summary.title; $("asof").textContent = `updated ${dateTime(summary.generated_at)}`;
renderMatrix(); renderProjects(); renderHero(summary); renderShare(summary); renderShareTrend(summary); renderKpis(summary); renderLegend(); renderChart(); renderTable(); renderWheel(); renderCommitTypes(); renderLandGap(); renderRepos(); renderRecent(); renderStatus();}
function dayDate(day) { return new Date(`${day}T12:00:00Z`);}
function matrixLevels(days) { const values = days .map((point) => point.total) .filter((value) => value > 0) .sort((a, b) => a - b); if (values.length === 0) return [1, 2, 3, 4]; const pick = (fraction) => values[Math.min(values.length - 1, Math.floor((values.length - 1) * fraction))]; let previous = 0; return [pick(0.25), pick(0.5), pick(0.75), pick(0.9)].map((value) => { previous = Math.max(previous + 1, value); return previous; });}
function matrixLevel(value, thresholds) { if (value <= 0) return 0; if (value <= thresholds[0]) return 1; if (value <= thresholds[1]) return 2; if (value <= thresholds[2]) return 3; if (value <= thresholds[3]) return 4; return 5;}
function renderMatrix() { const svg = $("matrix"); const days = state.data.daily || []; const total = days.reduce((sum, point) => sum + (point.total || 0), 0); $("matrix-total").textContent = fmt(total); svg.replaceChildren(); if (days.length === 0) return;
const start = dayDate(days[0].date); const startWeekday = start.getUTCDay(); const columns = Math.ceil((startWeekday + days.length) / 7); const cell = 12; const gap = 3; const step = cell + gap; const left = 30; const top = 18; const width = left + columns * step; const height = top + 7 * step; svg.setAttribute("viewBox", `0 0 ${width} ${height}`); svg.setAttribute("preserveAspectRatio", "xMinYMin meet");
const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; };
// Month labels sit at the first week that falls inside a new month. let lastMonth = -1; for (let column = 0; column < columns; column += 1) { const firstIndex = Math.max(0, column * 7 - startWeekday); if (firstIndex >= days.length) break; const date = dayDate(days[firstIndex].date); const month = date.getUTCMonth(); if (month === lastMonth) continue; lastMonth = month; const label = make("text", { x: left + column * step, y: 10, class: "matrix-month", }); label.textContent = date.toLocaleDateString(undefined, { month: "short" }).toUpperCase(); svg.append(label); }
for (const [row, label] of [[1, "MON"], [3, "WED"], [5, "FRI"]]) { const node = make("text", { x: 0, y: top + row * step + cell - 2, class: "matrix-weekday", }); node.textContent = label; svg.append(node); }
const thresholds = matrixLevels(days); for (let index = 0; index < columns * 7; index += 1) { const dayIndex = index - startWeekday; if (dayIndex < 0 || dayIndex >= days.length) continue; const point = days[dayIndex]; const value = point.total || 0; const level = matrixLevel(value, thresholds); const column = Math.floor(index / 7); const row = index % 7; const rect = make("rect", { x: left + column * step, y: top + row * step, width: cell, height: cell, rx: 2, class: "matrix-cell", "data-level": level, "data-date": point.date, "aria-label": `${point.date}: ${value} commits`, }); rect.style.fill = `var(--matrix-${level})`; rect.addEventListener("pointerenter", (event) => showMatrixTooltip(event, point)); rect.addEventListener("pointermove", (event) => showMatrixTooltip(event, point)); rect.addEventListener("pointerleave", hideMatrixTooltip); svg.append(rect); }
const activeDays = days.filter((point) => (point.total || 0) > 0).length; const best = days.reduce( (winner, point) => ((point.total || 0) > (winner.total || 0) ? point : winner), days[0], ); let streak = 0; for (let index = days.length - 1; index >= 0; index -= 1) { if ((days[index].total || 0) > 0) streak += 1; else break; } const stats = $("matrix-stats"); stats.replaceChildren(); for (const item of [ { label: "active days", value: `${activeDays}/${days.length}`, meta: `${Math.round((activeDays / days.length) * 100)}% of days`, }, { label: "best day", value: fmt(best ? best.total : 0), meta: best ? dayLabel(best.date) : "—", }, { label: "streak", value: `${streak}d`, meta: "current" }, ]) { const node = el("div", "matrix-stat"); node.append(el("p", "k", item.label)); node.append(el("p", "v", item.value)); node.append(el("p", "m", item.meta)); stats.append(node); }
const legend = $("matrix-legend"); legend.replaceChildren(); legend.append(el("li", "", "less")); for (let level = 1; level <= 5; level += 1) { const item = el("li"); const swatch = el("span", "matrix-swatch"); swatch.style.background = `var(--matrix-${level})`; item.append(swatch); legend.append(item); } legend.append(el("li", "", "more"));
const firstActive = days.find((point) => (point.total || 0) > 0); const note = $("matrix-note"); if (!firstActive) { note.textContent = "no activity · utc"; } else if (firstActive.date !== days[0].date) { note.textContent = `from ${dayLabel(firstActive.date)} · utc`; } else { note.textContent = "utc"; }
renderSparkline(days); renderCadence(days);}
function rate(value) { return Number.isInteger(value) ? fmt(value) : value.toFixed(1);}
function median(values) { if (values.length === 0) return 0; const middle = Math.floor(values.length / 2); return values.length % 2 ? values[middle] : (values[middle - 1] + values[middle]) / 2;}
function percentile(values, fraction) { if (values.length === 0) return 0; const index = Math.min(values.length - 1, Math.ceil(fraction * values.length) - 1); return values[Math.max(0, index)];}
function activeCadence(points) { const active = points .map((point) => Math.max(0, point.total || 0)) .filter((value) => value > 0) .sort((a, b) => a - b); if (active.length === 0) return { typical: null, busy: null, active: 0 }; return { typical: median(active), busy: percentile(active, 0.9), active: active.length, };}
function renderCadence(days) { const wrap = $("matrix-cadence"); const year = activeCadence(days); const month = activeCadence(days.slice(-30)); if (year.active === 0 && month.active === 0) { wrap.hidden = true; return; } const value = (number) => (number === null ? "—" : rate(number)); $("cadence-30-typical").textContent = value(month.typical); $("cadence-30-busy").textContent = value(month.busy); $("cadence-year-typical").textContent = value(year.typical); $("cadence-year-busy").textContent = value(year.busy); $("cadence-30-busy").title = "90th percentile of active days in the last 30 days"; $("cadence-year-busy").title = "90th percentile of active days in the last year"; $("matrix-cadence").setAttribute( "aria-label", `Typical and busy active days. Last 30 days: ${value(month.typical)} typical, ${value(month.busy)} busy across ${month.active} active days. Last year: ${value(year.typical)} typical, ${value(year.busy)} busy across ${year.active} active days.`, ); wrap.hidden = false;}
function renderSparkline(days) { const wrap = $("matrix-spark"); const svg = $("spark"); const values = days.map((point) => Math.max(0, point.total || 0)); const peak = Math.max(...values, 0); if (peak <= 0) { wrap.hidden = true; svg.replaceChildren(); return; }
const average = values.map((_, index) => { const start = Math.max(0, index - 6); const window = values.slice(start, index + 1); return window.reduce((sum, value) => sum + value, 0) / window.length; });
const width = 1000; const height = 72; const padX = 2; const padY = 7; const x = (index) => padX + (index / Math.max(1, values.length - 1)) * (width - padX * 2); const y = (value) => height - padY - (value / peak) * (height - padY * 2); const path = (series) => series .map((value, index) => `${index === 0 ? "M" : "L"}${x(index).toFixed(2)},${y(value).toFixed(2)}`) .join(" ");
svg.replaceChildren(); const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; };
svg.append( make("line", { x1: padX, x2: width - padX, y1: height - padY, y2: height - padY, class: "spark-baseline", }), ); const areaPath = `${path(values).replace(/^M/, "M")} L${x(values.length - 1).toFixed(2)},${height - padY} L${x(0).toFixed(2)},${height - padY} Z`; svg.append(make("path", { d: areaPath, class: "spark-area" })); svg.append(make("path", { d: path(values), class: "spark-daily" })); svg.append(make("path", { d: path(average), class: "spark-average" }));
const best = days.reduce( (winner, point) => ((point.total || 0) > (winner.total || 0) ? point : winner), days[0], ); const title = make("title"); title.textContent = `Daily commits, ${fmt(values.reduce((sum, value) => sum + value, 0))} total; peak ${fmt(peak)} on ${best.date}`; svg.prepend(title); svg.setAttribute( "aria-label", `Daily commits with a seven-day average. Peak ${fmt(peak)} on ${best.date}.`, ); wrap.hidden = false;}
function showMatrixTooltip(event, point) { const tooltip = $("matrix-tooltip"); tooltip.replaceChildren(); tooltip.append(el("div", "tip-date", point.date)); const you = Object.values(point.identities || {}).reduce((sum, value) => sum + value, 0); const row = (label, value, color) => { const item = el("div", "tip-row"); const name = el("span", "tip-name"); const key = el("span", "tip-key"); key.style.background = color; name.append(key, el("span", "", label)); item.append(name, el("span", "tip-value", number.format(value))); tooltip.append(item); }; row("you", you, "var(--accent)"); if (point.bots) row("did.bot agents", point.bots, "var(--series-6)"); row("total", point.total || 0, "var(--ink)"); tooltip.hidden = false;
const main = document.querySelector(".matrix-main").getBoundingClientRect(); let left = (event.clientX || 0) - main.left + 12; let top = (event.clientY || 0) - main.top + 12; const box = tooltip.getBoundingClientRect(); if (left + box.width > main.width - 6) left = Math.max(6, left - box.width - 24); if (top + box.height > main.height - 6) top = Math.max(6, top - box.height - 24); tooltip.style.left = `${left}px`; tooltip.style.top = `${top}px`;}
function hideMatrixTooltip() { $("matrix-tooltip").hidden = true;}
function projectMonogram(name) { const letters = (name || "?").replace(/[^a-z0-9]/gi, ""); return (letters.slice(0, 2) || "?").toUpperCase();}
function repoSource(repoKey) { return repoKey && repoKey.startsWith("github:") ? "github" : "tangled";}
// Known project homes. A repo record can carry a website; these fill in the// projects that predate that field. Everything else falls back to a domain// shaped repo/owner name, then to the owner's GitHub avatar.const KNOWN_SITES = { atgc: "https://atgc.codes", "atgc-stack-lab": "https://atgc.codes", substandard: "https://substandard.blog", didbot: "https://did.bot", "didbot-claude": "https://did.bot", "terraform-aws-didbot-pds": "https://did.bot", "vibescrobble.com": "https://vibescrobble.com", blogposts: "https://permadeath.com", "cat-photos": "https://permadeath.com",};
const KNOWN_FAVICONS = { atgc: "https://tangled.org/permadeath.com/atgc/raw/main/brand/png/icon-128.png", "atgc-stack-lab": "https://tangled.org/permadeath.com/atgc/raw/main/brand/png/icon-128.png", substandard: "https://substandard.blog/favicon.svg", didbot: "https://did.bot/favicon.svg", "didbot-claude": "https://did.bot/favicon.svg", "terraform-aws-didbot-pds": "https://did.bot/favicon.svg", "vibescrobble.com": "https://vibescrobble.com/favicon-32.png", blogposts: "https://permadeath.com/icon", "cat-photos": "https://permadeath.com/icon", "dev.permadeath.com": "https://permadeath.com/icon",};
function faviconFor(project) { const explicit = KNOWN_FAVICONS[project.name || ""]; if (explicit) return explicit; const known = KNOWN_SITES[project.name || ""]; const site = (known || project.website || "").trim(); let origin = ""; if (site) { try { origin = new URL(site).origin; } catch { origin = ""; } } const name = (project.name || "").trim(); if (!origin && name.includes(".")) origin = `https://${name}`; const owner = (project.full_name || "").split("/")[0]; if (!origin && owner.includes(".")) origin = `https://${owner}`; if (origin) return `${origin}/favicon.ico`; if ((project.repo_key || "").startsWith("github:") && owner) { return `https://github.com/${owner}.png?size=64`; } return "";}
function projectIcon(project) { const redacted = project.redacted || (project.repo_key || "").startsWith("github:redacted:"); const fallback = redacted ? "//" : projectMonogram(project.name); const icon = el("span", "project-icon"); const url = redacted ? "" : faviconFor(project); if (url) { const img = el("img", "project-favicon"); img.src = url; img.alt = ""; img.loading = "lazy"; img.decoding = "async"; img.addEventListener("error", () => { img.remove(); icon.classList.add("fallback"); icon.textContent = fallback; }); icon.append(img); } else { icon.classList.add("fallback"); icon.textContent = fallback; } icon.title = redacted ? "redacted repository" : project.name || ""; return icon;}
function renderProjects() { const list = $("project-ranking"); list.replaceChildren(); const projects = state.data.projects || []; if (projects.length === 0) { list.append(el("li", "sub", "No project activity in the last 30 days.")); return; } // One scale for every project, so the strips compare volume as well as // rhythm. const weeklyMax = Math.max(1, ...projects.flatMap((project) => project.weekly || [])); projects.forEach((project, index) => { const item = el("li", "project-row");
const rank = el("span", "project-rank", String(index + 1).padStart(2, "0")); const icon = projectIcon(project);
const body = el("div", "project-body"); const name = project.url ? el("a", "project-name") : el("span", "project-name"); if (project.url) name.href = project.url; name.append(el("span", "project-label", project.full_name || project.name)); name.title = project.full_name || project.name; const meta = el( "span", "project-meta", project.redacted ? "redacted repo" : project.knot || "source", ); body.append(name, meta);
const count = el("span", "project-count", fmt(project.last_30)); count.title = `${number.format(project.last_30)} commits in the last 30 days`;
if (Number.isFinite(project.prior_90)) { const priorRate = project.prior_90 / 3; const ratio = priorRate > 0 ? project.last_30 / priorRate : project.last_30 > 0 ? 2 : 1; const trend = ratio >= 1.25 ? "up" : ratio <= 0.8 ? "down" : "flat"; const symbol = trend === "up" ? "↑" : trend === "down" ? "↓" : "→"; const momentum = el("span", `project-momentum ${trend}`, symbol); momentum.title = `${number.format(project.last_30)} in the last 30 days vs ` + `${number.format(project.prior_90)} in the prior 90 days ` + `(${priorRate.toFixed(1)} per 30 days)`; momentum.setAttribute("aria-label", momentum.title); count.append(momentum); }
item.append(rank, icon, body, count, projectSpark(project, weeklyMax)); list.append(item); });}
// Twelve weekly bars under a project, oldest first; the last ends now.function projectSpark(project, max) { const weekly = project.weekly || []; const ns = "http://www.w3.org/2000/svg"; const svg = document.createElementNS(ns, "svg"); svg.setAttribute("class", "project-spark"); svg.setAttribute("viewBox", "0 0 120 22"); svg.setAttribute("preserveAspectRatio", "none"); svg.setAttribute("role", "img"); svg.setAttribute( "aria-label", `${project.full_name || project.name}: ${weekly.join(", ")} commits a week over 12 weeks`, ); const band = 120 / Math.max(1, weekly.length); weekly.forEach((value, week) => { const rect = document.createElementNS(ns, "rect"); const h = value > 0 ? Math.max(1.5, (value / max) * 22) : 0.75; rect.setAttribute("x", String(week * band + band * 0.15)); rect.setAttribute("y", String(22 - h)); rect.setAttribute("width", String(band * 0.7)); rect.setAttribute("height", String(h)); rect.setAttribute("class", value > 0 ? "project-spark-bar" : "project-spark-empty"); const title = document.createElementNS(ns, "title"); const weeksAgo = weekly.length - 1 - week; title.textContent = `${weeksAgo === 0 ? "last 7 days" : `${weeksAgo + 1} weeks ago`}: ${number.format(value)}`; rect.append(title); svg.append(rect); }); return svg;}
function renderHero(summary) { $("me-total").textContent = fmt(summary.me_total);}
const PERIOD_LABELS = { "30d": "30d", "90d": "90d", "1y": "1y", all: "all",};
function renderShare(summary) { const periods = summary.share_periods || {}; const period = periods[state.sharePeriod] || periods.all; if (!period) { $("share-value").textContent = "—"; return; } const label = PERIOD_LABELS[state.sharePeriod] || state.sharePeriod; $("share-label").textContent = `tangled · ${label}`;
if (!summary.share_available || period.share_all > 100) { $("share-value").textContent = "—"; $("share-fill").style.width = "0%"; $("share-meter").hidden = true; $("share-meter").setAttribute("aria-label", "Global Tangled total unavailable"); $("share-sub").textContent = summary.global_partial ? `partial · ${pct(summary.coverage_pct)} reached` : summary.global_summary_stale ? `stale · ${dateTime(summary.global_summary_at)}` : "no global total"; return; }
$("share-meter").hidden = false; $("share-value").textContent = pct(period.share_all); $("share-fill").style.width = `${Math.min(100, Math.max(0, period.share_all))}%`; $("share-meter").setAttribute( "aria-label", `${pct(period.share_all)} of Tangled commits over ${label}`, ); $("share-sub").textContent = `${fmt(period.me_tangled)} + ${fmt(period.bots_tangled)} / ${fmt(period.tangled_total)}` + ` · as of ${summary.global_summary_at ? dateTime(summary.global_summary_at) : "last run"}` + (summary.global_partial ? ` · ${pct(summary.coverage_pct)} reached` : "");}
function renderShareTrend(summary) { const wrap = $("share-trend"); const svg = $("share-spark"); svg.replaceChildren(); const points = summary.share_available ? summary.share_trend || [] : []; if (points.length < 2) { wrap.hidden = true; return; } wrap.hidden = false; wrap.querySelector(".share-trend-label").textContent = `trailing 30d, daily · since ${dayLabel(points[0][0])}`; const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; }; const W = 400; const H = 40; const max = Math.max(...points.map((point) => point[1])) * 1.1 || 1; const x = (index) => (index / (points.length - 1)) * W; // Zero sits on the baseline, so the line's height reads as the share. const y = (value) => H - 1 - (value / max) * (H - 4); svg.append(make("line", { x1: 0, x2: W, y1: H - 0.5, y2: H - 0.5, class: "chart-axis" })); const d = points.map((point, index) => `${index ? "L" : "M"} ${x(index).toFixed(1)} ${y(point[1]).toFixed(1)}`); svg.append(make("path", { d: d.join(" "), class: "share-trend-line" })); const cursor = make("line", { x1: 0, x2: 0, y1: 0, y2: H, class: "share-trend-cursor", visibility: "hidden" }); svg.append(cursor); const hit = make("rect", { x: 0, y: 0, width: W, height: H, class: "chart-hit" }); const tooltip = $("share-tooltip"); hit.addEventListener("pointermove", (event) => { const box = svg.getBoundingClientRect(); const index = Math.round(((event.clientX - box.left) / box.width) * (points.length - 1)); const point = points[Math.max(0, Math.min(points.length - 1, index))]; cursor.setAttribute("x1", x(points.indexOf(point))); cursor.setAttribute("x2", x(points.indexOf(point))); cursor.setAttribute("visibility", "visible"); tooltip.replaceChildren(el("div", "tip-date", dayLabel(point[0]))); const row = el("div", "tip-row"); row.append(el("span", "tip-name", "trailing 30d"), el("span", "tip-value", pct(point[1]))); tooltip.append(row); tooltip.hidden = false; const wrapBox = wrap.getBoundingClientRect(); const width = tooltip.offsetWidth || 160; let left = event.clientX - wrapBox.left + 12; if (left + width > wrapBox.width) left = Math.max(0, left - width - 24); tooltip.style.left = `${left}px`; tooltip.style.top = `${H + 6}px`; }); hit.addEventListener("pointerleave", () => { tooltip.hidden = true; cursor.setAttribute("visibility", "hidden"); }); svg.append(hit);}
function renderKpis(summary) { const wrap = $("kpis"); wrap.replaceChildren(); const cards = [ { label: "tangled", value: fmt(summary.me_tangled) }, { label: "github", value: fmt(summary.me_github) }, { label: "agents", value: fmt(summary.bots_tangled) }, { label: "30 days", value: fmt(summary.windows.me_30) }, ]; for (const card of cards) { const node = el("div", "kpi"); node.append(el("p", "label", card.label)); node.append(el("p", "value", card.value)); wrap.append(node); }}
function renderLegend() { const list = $("legend"); list.replaceChildren(); for (const series of seriesList()) { const item = el("li"); const swatch = el("span", "swatch"); swatch.style.background = seriesColor(series.color); item.append(swatch, el("span", "", series.label)); list.append(item); }}
function niceMax(value) { if (value <= 5) return 5; const exponent = Math.floor(Math.log10(value)); const fraction = value / 10 ** exponent; const step = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; return step * 10 ** exponent;}
function renderChart() { const svg = $("chart"); svg.replaceChildren(); const points = visiblePoints(); const series = seriesList(); if (points.length === 0) { const text = document.createElementNS("http://www.w3.org/2000/svg", "text"); text.setAttribute("x", "300"); text.setAttribute("y", "280"); text.setAttribute("text-anchor", "middle"); text.style.fill = "var(--muted)"; text.textContent = "No commits in this range yet."; svg.append(text); return; }
const W = 600; const H = 560; const margin = { left: 44, right: 10, top: 14, bottom: 30 }; const plotW = W - margin.left - margin.right; const plotH = H - margin.top - margin.bottom; const totals = points.map((point) => series.reduce((sum, item) => sum + valueFor(point, item), 0), ); const max = niceMax(Math.max(1, ...totals)); const y = (value) => margin.top + plotH - (value / max) * plotH;
const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) { node.setAttribute(key, String(value)); } return node; };
// Recessive, solid hairline grid. for (let i = 0; i <= 4; i += 1) { const value = (max * i) / 4; const gy = y(value); svg.append( make("line", { x1: margin.left, x2: W - margin.right, y1: gy, y2: gy, class: "chart-grid", }), ); const label = make("text", { x: margin.left - 8, y: gy + 4, "text-anchor": "end", class: "chart-tick", }); label.textContent = fmt(Math.round(value)); svg.append(label); }
const band = plotW / points.length; // On a one-year view the band is barely two pixels wide. Never let the bar // exceed its band; a hairline with air around it is more honest than two // columns sharing a pixel. const barW = Math.min(18, Math.max(1, band * 0.62)); const xLabelStep = Math.max(1, Math.ceil(points.length / 4));
points.forEach((point, index) => { const x = margin.left + index * band + (band - barW) / 2;
// Build bottom-up so the top of the stack can take the rounded cap. const segments = []; let cursor = margin.top + plotH; for (const item of series) { const value = valueFor(point, item); if (value <= 0) continue; const height = (value / max) * plotH; segments.push({ item, value, y: cursor - height, height }); cursor -= height; }
segments.forEach((segment, segmentIndex) => { const isBottom = segmentIndex === 0; const isTop = segmentIndex === segments.length - 1; const drawY = isBottom ? segment.y : segment.y + 2; const drawH = Math.max(0, segment.height - (isBottom ? 0 : 2)); if (drawH <= 0) return; const fill = seriesColor(segment.item.color); let node; if (isTop && drawH > 4) { const radius = 4; node = make("path", { d: roundedTopPath(x, drawY, barW, drawH, radius), }); } else { node = make("rect", { x, y: drawY, width: barW, height: drawH, rx: isTop ? 2 : 0, }); } node.style.fill = fill; svg.append(node); });
if (index % xLabelStep === 0 || index === points.length - 1) { const label = make("text", { x: margin.left + index * band + band / 2, y: H - 9, "text-anchor": "middle", class: "chart-tick", }); label.textContent = dayLabel(point.date); svg.append(label); }
const hit = make("rect", { x: margin.left + index * band, y: margin.top, width: band, height: plotH, class: "chart-hit", tabindex: "0", role: "button", "aria-label": `${point.date}: ${totals[index]} commits`, }); const show = (event) => showTooltip(event, point, series, totals[index], band, index, points.length); hit.addEventListener("pointermove", show); hit.addEventListener("pointerenter", show); hit.addEventListener("focus", show); hit.addEventListener("pointerleave", hideTooltip); hit.addEventListener("blur", hideTooltip); svg.append(hit); });
// Baseline is the only axis rule that needs ink. svg.append( make("line", { x1: margin.left, x2: W - margin.right, y1: margin.top + plotH, y2: margin.top + plotH, class: "chart-axis", }), );}
function roundedTopPath(x, y, width, height, radius) { const r = Math.min(radius, width / 2, height); return [ `M ${x} ${y + height}`, `L ${x} ${y + r}`, `Q ${x} ${y} ${x + r} ${y}`, `L ${x + width - r} ${y}`, `Q ${x + width} ${y} ${x + width} ${y + r}`, `L ${x + width} ${y + height}`, "Z", ].join(" ");}
function showTooltip(event, point, series, total, band, index, count) { const tooltip = $("tooltip"); tooltip.replaceChildren(); tooltip.append(el("div", "tip-date", dayLabel(point.date))); for (const item of series) { const value = valueFor(point, item); if (value <= 0) continue; const row = el("div", "tip-row"); const name = el("span", "tip-name"); const key = el("span", "tip-key"); key.style.background = seriesColor(item.color); name.append(key, el("span", "", item.label)); row.append(name, el("span", "tip-value", number.format(value))); tooltip.append(row); } const totalRow = el("div", "tip-row"); totalRow.append(el("span", "tip-name", "total"), el("span", "tip-value", number.format(total))); tooltip.append(totalRow);
tooltip.hidden = false; const wrap = tooltip.parentElement.getBoundingClientRect(); let left; if (event && event.clientX !== undefined) { left = event.clientX - wrap.left + 12; } else { left = (index + 0.5) * (wrap.width / count) + 12; } const width = tooltip.offsetWidth || 180; if (left + width > wrap.width - 6) left = Math.max(6, left - width - 24); tooltip.style.left = `${left}px`; tooltip.style.top = "12px";}
function hideTooltip() { $("tooltip").hidden = true;}
function renderTable() { const wrap = $("table-view"); const button = $("table-toggle"); button.setAttribute("aria-expanded", String(state.table)); button.textContent = state.table ? "Hide table" : "Table"; wrap.replaceChildren(); wrap.hidden = !state.table; if (!state.table) return;
const points = visiblePoints(); const series = seriesList(); const table = document.createElement("table"); const head = document.createElement("thead"); const headRow = document.createElement("tr"); headRow.append(el("th", "", "Date")); for (const item of series) headRow.append(el("th", "", item.label)); headRow.append(el("th", "", "Total")); head.append(headRow); table.append(head);
const body = document.createElement("tbody"); for (const point of points) { const row = document.createElement("tr"); row.append(el("td", "", point.date)); let total = 0; for (const item of series) { const value = valueFor(point, item); total += value; row.append(el("td", "", number.format(value))); } row.append(el("td", "", number.format(total))); body.append(row); } table.append(body); wrap.append(table); wrap.append(el("p", "table-scroll-note", "utc"));}
/* ---------- time-of-day wheel ---------- */
// The zone the wheel is drawn in: the site's, if it names a valid one,// otherwise the viewer's own.function wheelZone() { const viewer = Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC"; const pinned = state.data.summary.timezone; if (pinned) { try { new Intl.DateTimeFormat("en-US", { timeZone: pinned }); return { zone: pinned, pinned: true }; } catch { // An unknown zone name falls back to the viewer's. } } return { zone: viewer, pinned: false };}
// Commits per hour of the day, per series, over the selected range.function wheelBins(series, zone) { const hourly = state.data.hourly || { series: [], rows: [] }; const column = new Map(hourly.series.map((key, index) => [key, index + 1])); const columns = series.map((item) => column.get(item.key)); const bins = Array.from({ length: 24 }, () => series.map(() => 0)); const generated = new Date(state.data.summary.generated_at); const start = Date.UTC(generated.getUTCFullYear(), generated.getUTCMonth(), generated.getUTCDate()) - (state.wheelDays - 1) * 86400000; const hourOf = new Intl.DateTimeFormat("en-US", { timeZone: zone, hour: "numeric", hourCycle: "h23", }); for (const row of hourly.rows) { const at = row[0] * 3600000; if (at < start) continue; const hour = Number(hourOf.formatToParts(new Date(at)).find((part) => part.type === "hour").value) % 24; columns.forEach((col, index) => { if (col !== undefined) bins[hour][index] += row[col] || 0; }); } return bins;}
function hourRange(hour) { const pad = (value) => String(value).padStart(2, "0"); return `${pad(hour)}:00–${pad((hour + 1) % 24)}:00`;}
function renderWheel() { const svg = $("wheel"); svg.replaceChildren(); const series = seriesList(); const { zone, pinned } = wheelZone(); const bins = wheelBins(series, zone); const totals = bins.map((counts) => counts.reduce((sum, value) => sum + value, 0)); const total = totals.reduce((sum, value) => sum + value, 0); $("wheel-sub").textContent = pinned ? zone : `your time · ${zone}`;
const legend = $("wheel-legend"); legend.replaceChildren(); for (const item of series) { const entry = el("li"); const swatch = el("span", "swatch"); swatch.style.background = seriesColor(item.color); entry.append(swatch, el("span", "", item.label)); legend.append(entry); }
const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; }; const C = 220; const R0 = 72; const R = 186; // The busiest hour reaches the edge; rings mark round counts inside it. const max = Math.max(1, ...totals); const step = niceMax(max) / 4; const rings = [1, 2, 3, 4].map((k) => k * step).filter((value) => value <= max).slice(-2); // Area, not radius, follows the count: a wedge twice as far out would // otherwise read as four times the work. const radius = (value) => Math.sqrt(R0 * R0 + ((R * R - R0 * R0) * value) / max); const angle = (hour) => (hour / 24) * 2 * Math.PI - Math.PI / 2; const point = (r, a) => `${(C + r * Math.cos(a)).toFixed(2)} ${(C + r * Math.sin(a)).toFixed(2)}`; // An annular sector with a 1px inset on each side, so neighbours keep a // parallel 2px gap at every radius. const sector = (inner, outer, a1, a2) => { const outerInset = 1 / outer; const innerInset = 1 / inner; return [ `M ${point(outer, a1 + outerInset)}`, `A ${outer} ${outer} 0 0 1 ${point(outer, a2 - outerInset)}`, `L ${point(inner, a2 - innerInset)}`, `A ${inner} ${inner} 0 0 0 ${point(inner, a1 + innerInset)}`, "Z", ].join(" "); };
// Recessive rings, labelled once just inside the top of each. for (const value of rings) { const r = radius(value); svg.append(make("circle", { cx: C, cy: C, r, class: "chart-grid wheel-ring" })); const label = make("text", { x: C + 4, y: C - r + 11, class: "chart-tick wheel-ring-label" }); label.textContent = fmt(Math.round(value)); svg.append(label); } svg.append(make("circle", { cx: C, cy: C, r: R0, class: "chart-axis wheel-ring" }));
bins.forEach((counts, hour) => { const a1 = angle(hour); const a2 = angle(hour + 1); let cumulative = 0; const drawn = []; series.forEach((item, index) => { const value = counts[index]; if (value <= 0) return; const inner = radius(cumulative) + (drawn.length > 0 ? 2 : 0); cumulative += value; const outer = radius(cumulative); if (outer - inner < 0.5) return; const path = make("path", { d: sector(inner, outer, a1, a2) }); path.style.fill = seriesColor(item.color); drawn.push(path); }); svg.append(...drawn); });
// Hour labels every three hours, outside the ring; midnight at the top. for (let hour = 0; hour < 24; hour += 3) { const a = angle(hour); const label = make("text", { x: (C + (R + 16) * Math.cos(a)).toFixed(2), y: (C + (R + 16) * Math.sin(a) + 3.5).toFixed(2), "text-anchor": "middle", class: "chart-tick", }); label.textContent = String(hour).padStart(2, "0"); svg.append(label); }
const centre = make("text", { x: C, y: C + 4, "text-anchor": "middle", class: "wheel-total" }); centre.textContent = fmt(total); const centreLabel = make("text", { x: C, y: C + 22, "text-anchor": "middle", class: "chart-tick" }); centreLabel.textContent = "commits"; svg.append(centre, centreLabel);
// Hit targets cover the whole hour, inner ring to outer edge. bins.forEach((counts, hour) => { const hit = make("path", { d: sector(R0, R + 6, angle(hour), angle(hour + 1)), class: "chart-hit", tabindex: "0", role: "button", "aria-label": `${hourRange(hour)}: ${totals[hour]} commits`, }); const show = (event) => showWheelTooltip(event, hour, counts, series, totals[hour], total); hit.addEventListener("pointermove", show); hit.addEventListener("pointerenter", show); hit.addEventListener("focus", show); hit.addEventListener("pointerleave", hideWheelTooltip); hit.addEventListener("blur", hideWheelTooltip); svg.append(hit); });
renderWheelStats(totals, total); renderWheelTable(bins, series, totals);}
function showWheelTooltip(event, hour, counts, series, hourTotal, total) { const tooltip = $("wheel-tooltip"); tooltip.replaceChildren(); tooltip.append(el("div", "tip-date", hourRange(hour))); series.forEach((item, index) => { if (counts[index] <= 0) return; const row = el("div", "tip-row"); const name = el("span", "tip-name"); const key = el("span", "tip-key"); key.style.background = seriesColor(item.color); name.append(key, el("span", "", item.label)); row.append(name, el("span", "tip-value", number.format(counts[index]))); tooltip.append(row); }); const totalRow = el("div", "tip-row"); const share = total > 0 ? ` · ${pct((hourTotal / total) * 100)}` : ""; totalRow.append(el("span", "tip-name", "total"), el("span", "tip-value", `${number.format(hourTotal)}${share}`)); tooltip.append(totalRow);
tooltip.hidden = false; const wrap = tooltip.parentElement.getBoundingClientRect(); const width = tooltip.offsetWidth || 180; const height = tooltip.offsetHeight || 80; let left; let top; if (event && event.clientX !== undefined) { left = event.clientX - wrap.left + 14; top = event.clientY - wrap.top + 14; } else { const a = (hour + 0.5) / 24 * 2 * Math.PI - Math.PI / 2; left = wrap.width / 2 + Math.cos(a) * wrap.width * 0.3; top = wrap.height / 2 + Math.sin(a) * wrap.height * 0.3; } if (left + width > wrap.width - 6) left = Math.max(6, left - width - 28); if (top + height > wrap.height - 6) top = Math.max(6, top - height - 28); tooltip.style.left = `${left}px`; tooltip.style.top = `${top}px`;}
function hideWheelTooltip() { $("wheel-tooltip").hidden = true;}
function renderWheelStats(totals, total) { const stats = $("wheel-stats"); stats.replaceChildren(); if (total === 0) return; const peak = totals.indexOf(Math.max(...totals)); // The busiest eight hours in a row, wrapping past midnight. let bestStart = 0; let best = -1; for (let start = 0; start < 24; start += 1) { let sum = 0; for (let offset = 0; offset < 8; offset += 1) sum += totals[(start + offset) % 24]; if (sum > best) { best = sum; bestStart = start; } } const night = totals.slice(0, 6).reduce((sum, value) => sum + value, 0); for (const item of [ { label: "peak hour", value: hourRange(peak), meta: `${fmt(totals[peak])} commits` }, { label: "busiest 8h", value: `${hourRange(bestStart).slice(0, 5)}–${hourRange((bestStart + 7) % 24).slice(-5)}`, meta: `${pct((best / total) * 100)} of commits`, }, { label: "00–06", value: pct((night / total) * 100), meta: `${fmt(night)} commits` }, ]) { const node = el("div", "matrix-stat"); node.append(el("p", "k", item.label), el("p", "v", item.value), el("p", "m", item.meta)); stats.append(node); }}
function renderWheelTable(bins, series, totals) { const wrap = $("wheel-table"); const button = $("wheel-table-toggle"); button.setAttribute("aria-expanded", String(state.wheelTable)); button.textContent = state.wheelTable ? "Hide table" : "Table"; wrap.replaceChildren(); wrap.hidden = !state.wheelTable; if (!state.wheelTable) return; const table = document.createElement("table"); const head = document.createElement("thead"); const headRow = document.createElement("tr"); headRow.append(el("th", "", "Hour")); for (const item of series) headRow.append(el("th", "", item.label)); headRow.append(el("th", "", "Total")); head.append(headRow); const body = document.createElement("tbody"); bins.forEach((counts, hour) => { const row = document.createElement("tr"); row.append(el("td", "", hourRange(hour))); for (const value of counts) row.append(el("td", "", number.format(value))); row.append(el("td", "", number.format(totals[hour]))); body.append(row); }); table.append(head, body); wrap.append(table);}
/* ---------- commit types ---------- */
// Each type keeps its colour whatever its rank, in a validated adjacent// order from the bottom of the stack up; anything else folds into "other".const TYPE_COLORS = [ ["feat", "series-1"], ["fix", "series-2"], ["docs", "series-3"], ["test", "series-4"], ["refactor", "series-7"], ["other", "muted"],];
// The chart starts at the first week with enough typed commits for a// share to mean something (falling back to the first with any).function typesView(data) { const weekTotal = (week) => data.types.reduce((sum, row) => sum + row.weekly[week], 0); let first = data.weeks.findIndex((_, week) => weekTotal(week) >= 20); if (first < 0) first = Math.max(0, data.weeks.findIndex((_, week) => weekTotal(week) > 0)); const weeks = data.weeks.slice(first); const named = new Set(TYPE_COLORS.map(([name]) => name)); const folded = data.types.filter((row) => !named.has(row.name) || row.name === "other"); const types = TYPE_COLORS.map(([name, color]) => { const rows = name === "other" ? folded : data.types.filter((row) => row.name === name); return { name, color, members: name === "other" ? folded.map((row) => row.name).filter((n) => n !== "other") : [], total: rows.reduce((sum, row) => sum + row.total, 0), weekly: weeks.map((_, week) => rows.reduce((sum, row) => sum + row.weekly[first + week], 0)), }; }).filter((row) => row.total > 0); return { weeks, types };}
function renderCommitTypes() { const card = document.querySelector(".types-card"); const data = state.data.commit_types; const svg = $("types"); svg.replaceChildren(); if (!data || data.types.length === 0) { card.hidden = true; return; } card.hidden = false; const view = typesView(data); const typed = view.types.reduce((sum, row) => sum + row.total, 0);
const legend = $("types-legend"); legend.replaceChildren(); for (const row of view.types) { const item = el("li"); const swatch = el("span", "swatch"); swatch.style.background = seriesColor(row.color); const label = row.members.length > 0 ? `other (${row.members.join(", ")})` : row.name; item.append(swatch, el("span", "", `${label} · ${pct((row.total / typed) * 100)}`)); legend.append(item); }
const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; }; const W = 1000; const H = 280; const margin = { left: 54, right: 14, top: 14, bottom: 30 }; const plotW = W - margin.left - margin.right; const plotH = H - margin.top - margin.bottom; const count = view.weeks.length; const totals = view.weeks.map((_, week) => view.types.reduce((sum, row) => sum + row.weekly[week], 0)); // Each week's mix, as shares of that week's typed commits; volume is // already on the page elsewhere. const share = (row, week) => (totals[week] > 0 ? (row.weekly[week] / totals[week]) * 100 : 0); const x = (week) => margin.left + (count === 1 ? plotW / 2 : (week / (count - 1)) * plotW); const y = (value) => margin.top + plotH - (value / 100) * plotH;
for (const value of [0, 25, 50, 75, 100]) { svg.append(make("line", { x1: margin.left, x2: W - margin.right, y1: y(value), y2: y(value), class: "chart-grid" })); const tick = make("text", { x: margin.left - 8, y: y(value) + 4, "text-anchor": "end", class: "chart-tick" }); tick.textContent = `${value}%`; svg.append(tick); }
// Bottom-up bands; each is the area between the running total before and // after it, outlined in the surface colour so neighbours keep a gap. let below = view.weeks.map(() => 0); for (const row of view.types) { const above = below.map((value, week) => value + share(row, week)); const top = above.map((value, week) => `${x(week).toFixed(1)} ${y(value).toFixed(1)}`); const bottom = below .map((value, week) => `${x(week).toFixed(1)} ${y(value).toFixed(1)}`) .reverse(); const band = make("path", { d: `M ${top.join(" L ")} L ${bottom.join(" L ")} Z`, class: "type-band" }); band.style.fill = seriesColor(row.color); svg.append(band); below = above; }
for (const week of [0, Math.floor((count - 1) / 2), count - 1]) { const anchor = week === 0 ? "start" : week === count - 1 ? "end" : "middle"; const label = make("text", { x: x(week), y: H - 9, "text-anchor": anchor, class: "chart-tick" }); label.textContent = dayLabel(view.weeks[week]); svg.append(label); } svg.append(make("line", { x1: margin.left, x2: W - margin.right, y1: margin.top + plotH, y2: margin.top + plotH, class: "chart-axis", }));
const cursor = make("line", { y1: margin.top, y2: margin.top + plotH, class: "types-cursor", visibility: "hidden" }); svg.append(cursor); const hit = make("rect", { x: margin.left, y: margin.top, width: plotW, height: plotH, class: "chart-hit" }); const tooltip = $("types-tooltip"); hit.addEventListener("pointermove", (event) => { const box = svg.getBoundingClientRect(); const svgX = ((event.clientX - box.left) / box.width) * W; const week = Math.max(0, Math.min(count - 1, Math.round(((svgX - margin.left) / plotW) * (count - 1)))); cursor.setAttribute("x1", x(week)); cursor.setAttribute("x2", x(week)); cursor.setAttribute("visibility", "visible"); tooltip.replaceChildren(el("div", "tip-date", `week of ${dayLabel(view.weeks[week])}`)); for (const row of [...view.types].reverse()) { if (row.weekly[week] <= 0) continue; const line = el("div", "tip-row"); const name = el("span", "tip-name"); const key = el("span", "tip-key"); key.style.background = seriesColor(row.color); name.append(key, el("span", "", row.name)); line.append(name, el("span", "tip-value", `${pct(share(row, week))} · ${number.format(row.weekly[week])}`)); tooltip.append(line); } const total = el("div", "tip-row"); total.append(el("span", "tip-name", "typed commits"), el("span", "tip-value", number.format(totals[week]))); tooltip.append(total); tooltip.hidden = false; const wrap = tooltip.parentElement.getBoundingClientRect(); const width = tooltip.offsetWidth || 180; let left = event.clientX - wrap.left + 14; if (left + width > wrap.width - 6) left = Math.max(6, left - width - 28); tooltip.style.left = `${left}px`; tooltip.style.top = "12px"; }); hit.addEventListener("pointerleave", () => { tooltip.hidden = true; cursor.setAttribute("visibility", "hidden"); }); svg.append(hit);
const notes = []; if (data.untyped > 0) notes.push(`${fmt(data.untyped)} without a type`); if (data.no_subject > 0) notes.push(`${fmt(data.no_subject)} redacted, no subject`); $("types-note").textContent = notes.join(" · "); renderTypesTable(view);}
function renderTypesTable(data) { const wrap = $("types-table"); const button = $("types-table-toggle"); button.setAttribute("aria-expanded", String(state.typesTable)); button.textContent = state.typesTable ? "Hide table" : "Table"; wrap.replaceChildren(); wrap.hidden = !state.typesTable; if (!state.typesTable) return; const table = document.createElement("table"); const head = document.createElement("thead"); const headRow = document.createElement("tr"); headRow.append(el("th", "", "Week of")); for (const row of data.types) headRow.append(el("th", "", row.name)); head.append(headRow); const body = document.createElement("tbody"); data.weeks.forEach((weekStart, week) => { const tr = document.createElement("tr"); tr.append(el("td", "", weekStart)); for (const row of data.types) tr.append(el("td", "", number.format(row.weekly[week]))); body.append(tr); }); table.append(head, body); wrap.append(table);}
function renderRepos() { const wrap = $("repos"); wrap.replaceChildren(); const repos = state.data.repos || []; if (repos.length === 0) { wrap.append(el("p", "sub", "no commits")); return; } const max = Math.max(...repos.map((repo) => repo.mine), 1); for (const repo of repos) { const row = el("div", "repo-row"); const name = repo.url ? el("a", "repo-name") : el("span", "repo-name"); if (repo.url) name.href = repo.url; name.append( projectIcon(repo), el("span", "repo-label", repo.full_name || repo.name), ); name.title = repo.full_name || repo.name; row.append(name, el("span", "repo-count", fmt(repo.mine))); row.append( el( "span", "repo-meta", repo.knot ? `${fmt(repo.commits)} commits · ${repo.knot}` : `${fmt(repo.commits)} commits`, ), ); const track = el("div", "repo-bar-track"); const bar = el("div", "repo-bar"); bar.style.width = `${Math.max(2, (repo.mine / max) * 100)}%`; track.append(bar); row.append(track); wrap.append(row); }}
function renderRecent() { const list = $("recent"); list.replaceChildren(); const recent = state.data.recent || []; if (recent.length === 0) { list.append(el("li", "", "no commits")); return; } const limit = 18; for (const commit of recent.slice(0, limit)) { const item = el("li"); const dot = el("span", "dot"); dot.style.background = seriesColor(commit.color); const body = el("div"); const message = commit.url ? el("a", "msg", commit.message || "(no message)") : el("p", "msg", commit.message || "(no message)"); if (commit.url) message.href = commit.url; body.append(message); const meta = el("p", "meta"); const sourceLabel = repoSource(commit.repo_key) === "github" ? "github" : "tangled"; meta.textContent = `${sourceLabel} · ${commit.author} · ${commit.repo} · ${commit.short}`; body.append(meta); item.append(dot, body, el("span", "when", shortDate(commit.authored_at))); list.append(item); }}
/* ---------- written to landed ---------- */
function duration(secs) { if (secs < 60) return `${Math.round(secs)}s`; if (secs < 3600) return `${Math.round(secs / 60)}m`; if (secs < 86400) return `${(secs / 3600).toFixed(secs < 36000 ? 1 : 0)}h`; return `${(secs / 86400).toFixed(secs < 864000 ? 1 : 0)}d`;}
function renderLandGap() { const card = document.querySelector(".gap-card"); const data = state.data.land_gap; const svg = $("gap"); svg.replaceChildren(); const gaps = (data && data.gaps) || []; if (gaps.length === 0) { card.hidden = true; return; } card.hidden = false; const ns = "http://www.w3.org/2000/svg"; const make = (tag, attrs = {}) => { const node = document.createElementNS(ns, tag); for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value)); return node; }; const W = 1000; const H = 340; const margin = { left: 52, right: 16, top: 34, bottom: 30 }; const plotW = W - margin.left - margin.right; const plotH = H - margin.top - margin.bottom; const n = gaps.length; // Log time from one second to just past the slowest change; a zero gap // sits at the left edge. const top = Math.log10(Math.max(60, gaps[n - 1]) * 1.15); const x = (secs) => margin.left + (Math.log10(Math.max(1, secs)) / top) * plotW; const secsAt = (px) => 10 ** (((px - margin.left) / plotW) * top); // Height is the day the change was written, newest at the top. Within a // day a fixed scatter (a murmur-style mix of the index) spreads the dots. const days = data.authored_days || gaps.map(() => 0); const start = new Date(`${data.start || "1970-01-01"}T00:00:00Z`); const generated = new Date(state.data.summary.generated_at); const today = Math.floor((generated - start) / 86400000); const firstDay = Math.min(...days); const span = Math.max(1, today + 1 - firstDay); const yDay = (day) => margin.top + ((today + 1 - day) / span) * plotH; const jitter = (index) => { let h = Math.imul(index ^ 0x9e3779b9, 0x85ebca6b); h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35); h ^= h >>> 16; return yDay(days[index] + (h >>> 0) / 4294967296); };
// Month rules down the left. for (let month = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), 1)); ; ) { const day = Math.round((month - start) / 86400000); if (day > today) break; if (day >= firstDay) { const my = yDay(day); svg.append(make("line", { x1: margin.left, x2: W - margin.right, y1: my, y2: my, class: "chart-grid" })); const label = make("text", { x: margin.left - 8, y: my + 4, "text-anchor": "end", class: "chart-tick" }); label.textContent = month.toLocaleDateString(undefined, { month: "short", timeZone: "UTC" }); svg.append(label); } month = new Date(Date.UTC(month.getUTCFullYear(), month.getUTCMonth() + 1, 1)); }
for (const [secs, label] of [ [1, "≤1s"], [60, "1m"], [600, "10m"], [3600, "1h"], [21600, "6h"], [86400, "1d"], [604800, "1w"], [2592000, "30d"], [7776000, "90d"], [31536000, "1y"], ]) { if (Math.log10(secs) > top) continue; const gx = x(secs); svg.append(make("line", { x1: gx, x2: gx, y1: margin.top, y2: margin.top + plotH, class: "chart-grid" })); const tick = make("text", { x: gx, y: H - 9, "text-anchor": "middle", class: "chart-tick" }); tick.textContent = label; svg.append(tick); }
// No change written on a day can have waited longer than the time since: // the empty upper right is that limit, not a trend. const limit = []; for (let day = firstDay; day <= today; day += 1) { const secs = (today + 1 - day) * 86400; if (Math.log10(secs) > top) continue; limit.push(`${limit.length ? "L" : "M"} ${x(secs).toFixed(1)} ${yDay(day + 0.5).toFixed(1)}`); } if (limit.length > 1) { svg.append(make("path", { d: limit.join(" "), class: "gap-limit" })); // In the empty corner past the curve. const note = make("text", { x: W - margin.right, y: margin.top + 14, "text-anchor": "end", class: "chart-tick gap-limit-label", }); note.textContent = "longest possible wait"; svg.append(note); }
const slowCount = (data.slowest || []).length; gaps.forEach((secs, index) => { const slow = index >= n - slowCount; svg.append(make("circle", { cx: x(secs).toFixed(1), cy: jitter(index).toFixed(1), r: slow ? 2.8 : 1.8, class: slow ? "gap-dot slow" : "gap-dot", })); });
for (const [secs, label] of [ [data.median_secs, "median"], [data.p90_secs, "90th"], [data.p99_secs, "99th"], ]) { const qx = x(secs); svg.append(make("line", { x1: qx, x2: qx, y1: margin.top - 6, y2: margin.top + plotH, class: "gap-quantile" })); const text = make("text", { x: qx, y: margin.top - 12, "text-anchor": "middle", class: "chart-tick gap-quantile-label" }); text.textContent = `${label} ${duration(secs)}`; svg.append(text); } svg.append(make("line", { x1: margin.left, x2: W - margin.right, y1: margin.top + plotH + 0.5, y2: margin.top + plotH + 0.5, class: "chart-axis", }));
// Hover reads the share landed within the pointer's gap, or names a // slow change when the pointer is on one. const cursor = make("line", { y1: margin.top, y2: margin.top + plotH, class: "gap-cursor", visibility: "hidden" }); svg.append(cursor); const hit = make("rect", { x: margin.left, y: margin.top - 6, width: plotW, height: plotH + 6, class: "chart-hit" }); const tooltip = $("gap-tooltip"); const within = (secs) => { let lo = 0; let hi = n; while (lo < hi) { const mid = (lo + hi) >> 1; if (gaps[mid] <= secs) lo = mid + 1; else hi = mid; } return lo; }; hit.addEventListener("pointermove", (event) => { const box = svg.getBoundingClientRect(); const scale = W / box.width; const px = (event.clientX - box.left) * scale; const py = (event.clientY - box.top) * scale; tooltip.replaceChildren(); let nearest = null; (data.slowest || []).forEach((change, k) => { const index = n - 1 - k; const d = Math.hypot(x(change.gap_secs) - px, jitter(index) - py); if (d < 10 && (!nearest || d < nearest.d)) nearest = { change, d }; }); if (nearest) { const change = nearest.change; tooltip.append(el("div", "tip-date", `${duration(change.gap_secs)} · ${change.repo}`)); tooltip.append(el("div", "tip-subject", change.subject)); tooltip.append(el("div", "tip-dates", `${shortDate(change.authored_at)} → ${shortDate(change.committed_at)}`)); cursor.setAttribute("visibility", "hidden"); } else { const secs = secsAt(px); const count = within(secs); cursor.setAttribute("x1", px); cursor.setAttribute("x2", px); cursor.setAttribute("visibility", "visible"); tooltip.append(el("div", "tip-date", `within ${duration(secs)}`)); const row = el("div", "tip-row"); row.append(el("span", "tip-name", `${fmt(count)} changes`), el("span", "tip-value", pct((count / n) * 100))); tooltip.append(row); } tooltip.hidden = false; const wrap = tooltip.parentElement.getBoundingClientRect(); const width = tooltip.offsetWidth || 200; let left = event.clientX - wrap.left + 14; if (left + width > wrap.width - 6) left = Math.max(6, left - width - 28); tooltip.style.left = `${left}px`; tooltip.style.top = `${Math.max(6, event.clientY - wrap.top - 60)}px`; }); hit.addEventListener("pointerleave", () => { tooltip.hidden = true; cursor.setAttribute("visibility", "hidden"); }); svg.append(hit);
const slowest = (data.slowest || [])[0]; const stats = $("gap-stats"); stats.replaceChildren(); for (const item of [ { label: "median", value: duration(data.median_secs), meta: `${fmt(n)} changes` }, { label: "90th percentile", value: duration(data.p90_secs), meta: "1 in 10 waits longer" }, { label: "99th percentile", value: duration(data.p99_secs), meta: "1 in 100 waits longer" }, { label: "slowest", value: duration(gaps[n - 1]), meta: slowest ? slowest.repo : "" }, ]) { const node = el("div", "matrix-stat"); node.append(el("p", "k", item.label), el("p", "v", item.value), el("p", "m", item.meta)); stats.append(node); }}
function renderStatus() { const wrap = $("status"); wrap.replaceChildren(); const status = state.data.status; const summary = state.data.summary; const grid = el("div", "status-grid"); const cards = [ { label: "repos", value: `${fmt(status.repos_scanned)}/${fmt(status.repos_total)}` }, { label: "branches", value: `${fmt(status.branches_indexed)}/${fmt(status.branches_total)}` }, { label: "agents", value: fmt(status.bots_known) }, { label: "new", value: fmt(status.commits_new_this_run) }, ]; for (const card of cards) { const node = el("div", "kpi"); node.append(el("p", "label", card.label)); node.append(el("p", "value", card.value)); grid.append(node); } wrap.append(grid);
const bits = []; bits.push(status.scope === "owned" ? "owned · hourly" : "global"); if (status.last_crawl_finished) bits.push(dateTime(status.last_crawl_finished)); if (status.global_summary_at) { bits.push( `${status.global_summary_stale ? "global stale" : summary.global_partial ? "global partial" : "global"} · ${dateTime(status.global_summary_at)}`, ); } if (status.budget_exhausted) bits.push("budget hit"); if (status.github && status.github.configured) { bits.push(`github ${fmt(status.github.commits_new)} new`); } if (status.work_inbox) { bits.push(`work ${fmt(status.work_inbox.commits_new)} new`); } wrap.append(el("p", "sub", bits.join(" · ")));
if (status.errors && status.errors.length > 0) { const details = el("details", "method"); details.append(el("summary", "", `${status.errors.length} repositories could not be read`)); const list = el("ul", "errors"); for (const error of status.errors) { list.append(el("li", "", `${error.repo}: ${error.error}`)); } details.append(list); wrap.append(details); }
$("methodology").textContent = summary.methodology; const prior = $("prior-claim"); prior.replaceChildren(); const link = el("a", "", `${summary.prior_claim.percent}% on ${summary.prior_claim.date}`); link.href = summary.prior_claim.url; prior.append(link, document.createTextNode(`, ${summary.prior_claim.note}.`));}
/* ---------- controls ---------- */
function initControls() { for (const button of document.querySelectorAll("#share-periods button")) { const active = button.dataset.period === state.sharePeriod; button.classList.toggle("active", active); button.setAttribute("aria-pressed", String(active)); button.addEventListener("click", () => { state.sharePeriod = button.dataset.period; for (const peer of document.querySelectorAll("#share-periods button")) { const selected = peer === button; peer.classList.toggle("active", selected); peer.setAttribute("aria-pressed", String(selected)); } renderShare(state.data.summary); }); }
const requested = Number(new URLSearchParams(window.location.search).get("range")); if ([30, 90, 365].includes(requested)) { state.days = requested; } for (const button of document.querySelectorAll("#range button")) { const active = Number(button.dataset.days) === state.days; button.classList.toggle("active", active); button.setAttribute("aria-pressed", String(active)); button.addEventListener("click", () => { state.days = Number(button.dataset.days); for (const peer of document.querySelectorAll("#range button")) { const selected = peer === button; peer.classList.toggle("active", selected); peer.setAttribute("aria-pressed", String(selected)); } renderChart(); renderTable(); }); }
for (const button of document.querySelectorAll("#wheel-range button")) { const active = Number(button.dataset.days) === state.wheelDays; button.classList.toggle("active", active); button.setAttribute("aria-pressed", String(active)); button.addEventListener("click", () => { state.wheelDays = Number(button.dataset.days); for (const peer of document.querySelectorAll("#wheel-range button")) { const selected = peer === button; peer.classList.toggle("active", selected); peer.setAttribute("aria-pressed", String(selected)); } renderWheel(); }); }
$("types-table-toggle").addEventListener("click", () => { state.typesTable = !state.typesTable; renderTypesTable(typesView(state.data.commit_types)); });
$("wheel-table-toggle").addEventListener("click", () => { state.wheelTable = !state.wheelTable; renderWheel(); });
$("table-toggle").addEventListener("click", () => { state.table = !state.table; renderTable(); });
const requestedTheme = new URLSearchParams(window.location.search).get("theme"); const stored = localStorage.getItem("tally-theme"); if (requestedTheme === "light" || requestedTheme === "dark") { document.documentElement.dataset.theme = requestedTheme; } else if (stored === "light" || stored === "dark") { document.documentElement.dataset.theme = stored; } $("theme").addEventListener("click", () => { const effective = document.documentElement.dataset.theme || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); const next = effective === "dark" ? "light" : "dark"; document.documentElement.dataset.theme = next; localStorage.setItem("tally-theme", next); });}
initControls();load();setInterval(load, 5 * 60 * 1000);</script></body></html>