From fb5ce3c70845b9e43ef0b9f14b3fa728dd7780fb Mon Sep 17 00:00:00 2001 From: Senko-san Date: Sat, 11 Jul 2026 16:21:34 +0300 Subject: [PATCH] chore: graphify! --- .claude/settings.json | 24 + CLAUDE.md | 10 + graphify-out/.graphify_labels.json | 1 + graphify-out/.graphify_python | 1 + graphify-out/.graphify_root | 1 + graphify-out/GRAPH_REPORT.md | 505 + ...468f5e88f292fa1176c80c80d69dfc65285ff.json | 1 + ...7117bcbece825b9387ec17017f8d4a38f16a9.json | 1 + ...e0ff7da8659c5644ee6db3277b402063b066f.json | 1 + ...7b3b509676e677557a0ddc49459e002618eb8.json | 1 + ...69be4ea6681dc7ad816e9ac99d7d7905a406c.json | 1 + ...02c4e079a98001a912c47d484586b1bf57c37.json | 1 + ...f84d269327a2bacce54f806758263c5dc613d.json | 1 + ...b79d6c2d1180d2a633aad681c2ecec82a6273.json | 1 + ...e20c43696b4ff5aec49f178e6f082fdadb35e.json | 1 + ...c4b0c59cea730b8bd911dd4515b9a6874a0ec.json | 1 + ...4ce60805c229ba80bf1f04f80bc074c5596ec.json | 1 + ...cf845ce6f085f828ff8616ad89cf3e945394c.json | 1 + ...51132903d443ff1471da1986bab5aea3fb5cb.json | 1 + ...71dd210fd17f121a43bd2b82ea6ca99985934.json | 1 + ...97f5f6133b9b9d812f91f0e55442e6eba228f.json | 1 + ...dd3861dfcbcf28c183bdd8c7a2c8d3eab1115.json | 1 + ...fb2b1c9cde5b28d863c40cc9d67e89722773b.json | 1 + ...68f269fd162208fecaeb7294ab2e5cb2a04b2.json | 1 + ...d27637fce3302b282d4357e305ffe07d049e3.json | 1 + ...40f803f1590a57bb33fb748672650734f6dfe.json | 1 + ...080accf60a7d0a8001968665c11e4943c0e0f.json | 1 + ...8b6bd80a8886568953754ceeb529ff190abaf.json | 1 + ...c9229b70a261e0c1be21a60aad2e6d1ce195f.json | 1 + ...ac226203900172b082d0fdd4ba0b946986c01.json | 1 + ...d383d44f3a5b87e2a9db2d5afd2b8a206abdb.json | 1 + ...4ddd6bdf1ac191ed28bf423c738fc07d25718.json | 1 + ...7879717fe36e7709682b95c46b7321d166a78.json | 1 + ...cdedb6270395b76b3782cf84acc41c9698866.json | 1 + ...47ca9b3c32f674d219c746db87d60597cad6f.json | 1 + ...47902f9927ee140e86128cf9b71875f94d606.json | 1 + ...42ef715f9cdf893ab6a9bbed015cce3e94a3f.json | 1 + ...3dfebf89b537b0fcae251813bd78b0d784dde.json | 1 + ...0c2b9b5bf5428aeac3151ed22f1a738753c36.json | 1 + ...ee62a03d3619961e22f28d680910c076e5dc1.json | 1 + ...141240284771b576e960b0f76d74570a82eb2.json | 1 + ...b97124db16b03ddc7142b9eafb8413bf1cc93.json | 1 + ...a820e48da13daa52f937c80866dd1d97a1b7f.json | 1 + ...3dfcbd148da1e3c175ec06bd00e3bde9b47fa.json | 1 + ...f8fabf814b93b5d3b9e2e8aa228ce84ba9a65.json | 1 + ...e2dd7638c4b6994973fd91a9f13246a88396a.json | 1 + ...bc30a8158e76ecb327849777b4b6f7d779d0d.json | 1 + ...b467aae3a6ef3d62432cc4ab5e0ed4e17076d.json | 1 + ...e69d56d9d5ea79e0332b79979aaa75406918a.json | 1 + ...bb0bec02fb96a977efbf80e8fcb05f0167e65.json | 1 + ...b6af71d60e56453dee06e84475aa44909cb37.json | 1 + ...fe9a0a418374cbf6c6ce41cae3a5bb64b71e0.json | 1 + ...bb503f5a95f76b8f4dd5379d54fe757f89ed8.json | 1 + ...51a3882172699cf0f6059b4e7fcd9247b5d65.json | 1 + ...48b365a9e0b61a58ef7fc068da08d3e14bd17.json | 1 + ...dc2566dad1ed8c689f45242b6ef53173caa45.json | 1 + ...c411bf5ae46a9d1903b8dc280caebce4f5ef6.json | 1 + ...0b3f675eb4fd6614c5d87d102b1307373f4cd.json | 1 + ...b6356efbb8124b689eb2787dec33cd86192ae.json | 1 + ...f6ee27dfbad69a4de55e5ec02fe221390ea45.json | 1 + ...fd91ff09c472d6ea9b9b04d27f8f7cd75f273.json | 1 + ...26e05732208d080ab4a621c971fc65d51df3b.json | 1 + ...e646bc7e47c6d9c63913faba3e4773e09cfa9.json | 1 + ...1e0256b465cbc0bc509331627dad7dd6d9abc.json | 1 + ...b5cf646f147e8df5ed534592530aa9390d14d.json | 1 + ...af03c81112bc337b8ac267aea58beae0829a4.json | 1 + ...5ce454d13d8be97df327a9ffa64d23a74b553.json | 1 + ...552dafd8e3077a0e558ad999be6ebee888d9d.json | 1 + ...8757bdcfc717b4161c38b0ea460c60e0809af.json | 1 + ...1db71e8b32e216efaf16eaaa21c261b76bf4b.json | 1 + ...fabd6a9167483583467a76b40a136272b9ae6.json | 1 + ...293c732eb75f10603a5a7ba0f9ef718c96d80.json | 1 + ...fb4c4d88f1cb4fa8890260c3fdcb30921eba9.json | 1 + ...e407e8e5739546b2591b34c427c68d0e4e061.json | 1 + ...ba7ca5f3f89dbbee63626696c0ec37eb59419.json | 1 + ...237b6cc01958f62237cda727fa79776eb9222.json | 1 + ...7d79d00d3f1a9fb3f6f774fc0a8b7d425971c.json | 1 + ...abe905709310275a9526186c8b4f5cd93f403.json | 1 + ...afbe5c43e337d17fc350b99c7c00d63a8e9a0.json | 1 + ...eb016fbc9013d38bb840b6405896f119c774a.json | 1 + ...dd2a6c1be603210229bb602ef439b209a856f.json | 1 + ...d22399c0e76fad3a2ac6d508ba11085752457.json | 1 + ...5fef9196b7dbd88454335cda90011b4647176.json | 1 + ...58cc25612a9882c35adaa2d63c1cc04c3186f.json | 1 + ...7911e95a1ff5b5398aca95461b0b0d2743ebb.json | 1 + ...9291c1d84acc0e807983a45e95d6c29830587.json | 1 + ...046853b8f950c77b91eea0742b3c4d582ff4b.json | 1 + ...e66ebbab6acd1e0dad6b7db1483d92b77c78c.json | 1 + ...23b5bba248c7e6e31c2c1c044adb9576ffa72.json | 1 + ...bc90282ef1c0f3f7f129da51a31c8fa3edf9e.json | 1 + ...834d8780e5d7dcf5b5eb2241698f868052bd9.json | 1 + ...4289bd343efacd7cf0e64cd07c1d6626f17c7.json | 1 + ...64d5ef1b0c20a14b3d52de5c8332fa87d9409.json | 1 + ...09f8f27d9b8e5720fc053cb5404112b0ce629.json | 1 + ...46bfab2345b0261403eb444d02d3c21af4c5c.json | 1 + ...9786ebf2a7a3e06cc9d46a214d1a8009b7aad.json | 1 + ...6eeaaae9e647e0aa5abf784c55821a9f09a65.json | 1 + ...4d69d8f6264bad7d13e5d3e9dc2cb0bc0d97b.json | 1 + ...d97e1ea7c2ed0a86c6ebfb87c2e8602d4afd0.json | 1 + ...0d9fa90cf489229f90ba909f87f80f875c26c.json | 1 + ...4098a5481c7aabcd3106c9aa4303909ac86ad.json | 1 + ...1cdad0322f5bbbee4c133db3ae9a4b4ad998c.json | 1 + ...3398b56acbaef3f2cd42fca61dbd9f2bd0c62.json | 1 + ...7c39d936d2c1a756a9d755fbde5193800125a.json | 1 + ...8fdc2c9b731f5f35995a6762e09fb684c7631.json | 1 + ...4c1b6411660049a319a2743819fabce634477.json | 1 + ...cd65d301453b7686af08fe06d8a6c301bda5c.json | 1 + ...1ee310dd283e2271ab22a31b7bd74c2b23dcb.json | 1 + ...c8bce2334fe39cd300ba505bc8008f729dc91.json | 1 + ...a9846384469ef24770f4e24aa306942046cc4.json | 1 + ...391199e90af5720c9782a77ca71565aa346b1.json | 1 + ...87528d2bc1e9c560bf8375e3603038be2fafb.json | 1 + ...1b68b7f01bcdbff4e57c421000d0399767f71.json | 1 + ...c2b44da9f58d8ea1591acdc5ff2b0f5de894b.json | 1 + ...b058d76248588fc413448c8a180376990aa12.json | 1 + ...903947d715df959fd1660dd3e66132217f4fd.json | 1 + ...ccc2506adb950b206036ef6ab7e5c15bf82bd.json | 1 + ...4ba01a8e9043fcf822120270360f27625893c.json | 1 + ...985535c8334396c06c3f6823f83e596960f60.json | 1 + ...92298f5d391ab1712e86f56d6cbc05d2417d5.json | 1 + ...523126e0b3d6f15c396e7fe16fa499c21fbd6.json | 1 + ...1b2ec6b87fc669e0a0d859ff6172a4df5bbb0.json | 1 + ...153914cb9fd52bbf0717d4719ed1b7ee76b26.json | 1 + ...d613bb7b0e7cbfe19058508df0a097fb5cbd8.json | 1 + ...0c421633b60d3b4853a1b996cb0828b28b8fb.json | 1 + ...e04f03f854bd162d1c42f30e4382ee7844a14.json | 1 + ...7e06773be468bd791e3087709930cd40176a9.json | 1 + ...1adefb5040db8934f4a58158a51ad751e93d6.json | 1 + ...4bb27ab07dbe949f9bab3d0e0de8fc518db3f.json | 1 + ...f2072b1c69469aa5805adea3bf907adf9fd9f.json | 1 + ...1851a7c1a5d64b0ac7144385d111726b9ce93.json | 1 + ...79a0818dca75e01691ae7decfbda64e086d06.json | 1 + ...0a220cfcc8772a5b71d3ea76685a3f69e0bc6.json | 1 + ...127f64872cab86cd311e1e17f1fd62bcfd22d.json | 1 + ...758b5395dd08937ed998e79b326cd00c20201.json | 1 + ...a42622d73887f79ac73caf6770ecd4f59a542.json | 1 + ...b01c9e4ed7a9bcb012b26608bfe89d1d7c8e2.json | 1 + ...3bfe84e317adfb7ee606b82899f00d01bf330.json | 1 + ...37aed44ae38b3b361f0fe17fb635628bf36f2.json | 1 + ...e023aa8dd0f3cb4d835e75a2be7e39d7ccaca.json | 1 + ...742e11fbb02300ba98201527e5ac71e54928e.json | 1 + ...aac68a93fb90d33b77f14a0dc354f2349386f.json | 1 + ...cd95732709c4ff23fa61ed942ad8769b8b3e4.json | 1 + ...433842681a25154fb04052854714bc0ad38e3.json | 1 + ...30a61200b9998a025c74163c3a0fbb6b37c4e.json | 1 + ...252ae651e6d9f33a0e619262fcaa481662908.json | 1 + ...29cd8f0565d4b9a53d04ad54d67ded3952d55.json | 1 + ...d0235403a3db83f55579893f2f75bd2e98c40.json | 1 + ...3e32960d20427892e8315cb88c6fc1b91b6eb.json | 1 + ...95d0c030f8a1c829c26afa3fec2cd97548df9.json | 1 + ...e446b579a4daee1be5689bde8c0477ef84a3f.json | 1 + ...87c34989a4fe58e5d252b7dcdb578d6310417.json | 1 + ...f0400eda8a75bc2c1c07d0bca85eabcda0404.json | 1 + ...1d35225942138284d7fe665fd24995be0a342.json | 1 + ...a03731432574f7c3333e9e2cae5f345116dc5.json | 1 + ...47739e8b175e9afae1696de901e26e9973734.json | 1 + ...432481ae3aac8965275bdbba366b7343d729a.json | 1 + ...4a15ddb9de4469914cb5508d73588d1544eab.json | 1 + ...cd6560fa8212d29c02cc20ecb111b0a567790.json | 1 + ...90cab33b6549e090fdb5ab35f05c52fd90386.json | 1 + ...11e7f72044522f2488b7e83f5163d1583e74a.json | 1 + ...9b464b9e4f434d6f005d5b455ddb1e2cec722.json | 1 + ...54ef494e7bb7101affdaa2150a982f727cea2.json | 1 + ...9bd8e76db81d6aa17639c06a81c64e4df8b97.json | 1 + ...3d59c32a8eaccd6eed897e435b3526be4228a.json | 1 + ...6e0d864055ea620daabef7fa85453d29037bc.json | 1 + ...204941832651ee98981a850f25504b6b66efb.json | 1 + ...12bfdee5995c9f627049b89420c2bbc244615.json | 1 + ...3750d50e8f715a04cdb8acf2efacad0a3b85d.json | 1 + ...43e6e6075c097fa48311133b81d202c1167a4.json | 1 + ...98f60322e229b785bfabd686e69fe6841263d.json | 1 + ...0cc27c37f7edf7998a905f18487b49ee1d33f.json | 1 + ...8fa7aecfbd47ab4a54098dd03bc54ff04b5be.json | 1 + ...c1159990961c43b3f4081d50114db24b68d60.json | 1 + ...37ef3e839735e8793b48ee35f70b7d816427d.json | 1 + ...c844ea9ab71b68f6056b81091a0169cbc130f.json | 1 + ...b487a42b1366d428bff6bb26afd8bc6a1236e.json | 1 + ...29f84dfbb61c657938a12f5e7fbbb943382ad.json | 1 + ...8142b55e0ee3c1f19ca0ee8ad28971d82f019.json | 1 + ...a94245babe3046c0f5be98d70fb44e8b42c2e.json | 1 + ...692232ff449cc4afb80e38788ec3b1417b93c.json | 1 + ...b27a0d47f397227e115c31533c3036a434b00.json | 1 + ...9f8697b088155d8e7da204a4ac1dec8474268.json | 1 + ...c9bd91579b18311b93727715ed7e6d33cee77.json | 1 + graphify-out/cache/stat-index.json | 1 + graphify-out/cost.json | 12 + graphify-out/graph.html | 307 + graphify-out/graph.json | 79415 ++++++++++++++++ graphify-out/manifest.json | 902 + 189 files changed, 81357 insertions(+) create mode 100644 .claude/settings.json create mode 100644 graphify-out/.graphify_labels.json create mode 100644 graphify-out/.graphify_python create mode 100644 graphify-out/.graphify_root create mode 100644 graphify-out/GRAPH_REPORT.md create mode 100644 graphify-out/cache/ast/v0.9.12/00419db7cb0435ec28854e13d74468f5e88f292fa1176c80c80d69dfc65285ff.json create mode 100644 graphify-out/cache/ast/v0.9.12/00b6b2fb10e6e0a2fd98120c8447117bcbece825b9387ec17017f8d4a38f16a9.json create mode 100644 graphify-out/cache/ast/v0.9.12/00b812b86e65584b39d16928bb5e0ff7da8659c5644ee6db3277b402063b066f.json create mode 100644 graphify-out/cache/ast/v0.9.12/073db7813aacd6455508d6e1a5c7b3b509676e677557a0ddc49459e002618eb8.json create mode 100644 graphify-out/cache/ast/v0.9.12/08d1e3d629b4c709235dfc9d1ae69be4ea6681dc7ad816e9ac99d7d7905a406c.json create mode 100644 graphify-out/cache/ast/v0.9.12/0920f56c95bbc842b13322bb56302c4e079a98001a912c47d484586b1bf57c37.json create mode 100644 graphify-out/cache/ast/v0.9.12/0b591fe5ab7846b5b81036834fbf84d269327a2bacce54f806758263c5dc613d.json create mode 100644 graphify-out/cache/ast/v0.9.12/0b707659388bab82b26ee45035bb79d6c2d1180d2a633aad681c2ecec82a6273.json create mode 100644 graphify-out/cache/ast/v0.9.12/0c5c118199c6c8f827521694a8ee20c43696b4ff5aec49f178e6f082fdadb35e.json create mode 100644 graphify-out/cache/ast/v0.9.12/0d733c2bffdb507f0405e08eca4c4b0c59cea730b8bd911dd4515b9a6874a0ec.json create mode 100644 graphify-out/cache/ast/v0.9.12/0f40ce1f634e46d43dee31c787b4ce60805c229ba80bf1f04f80bc074c5596ec.json create mode 100644 graphify-out/cache/ast/v0.9.12/0f4e9cb1d1e396d0b531fc1f2abcf845ce6f085f828ff8616ad89cf3e945394c.json create mode 100644 graphify-out/cache/ast/v0.9.12/12294f2cc3044dd2ee1089faa9d51132903d443ff1471da1986bab5aea3fb5cb.json create mode 100644 graphify-out/cache/ast/v0.9.12/141d518a65c945efa2f0e1f1e8171dd210fd17f121a43bd2b82ea6ca99985934.json create mode 100644 graphify-out/cache/ast/v0.9.12/176d94c366a368cd969e357204b97f5f6133b9b9d812f91f0e55442e6eba228f.json create mode 100644 graphify-out/cache/ast/v0.9.12/17e1bc083d98b9247c0e491a1d0dd3861dfcbcf28c183bdd8c7a2c8d3eab1115.json create mode 100644 graphify-out/cache/ast/v0.9.12/182957129a31399a81b59f2fe90fb2b1c9cde5b28d863c40cc9d67e89722773b.json create mode 100644 graphify-out/cache/ast/v0.9.12/1b85c13b7569a69b54ec9c90fae68f269fd162208fecaeb7294ab2e5cb2a04b2.json create mode 100644 graphify-out/cache/ast/v0.9.12/1d44b4d9af1f88356367fa39bd2d27637fce3302b282d4357e305ffe07d049e3.json create mode 100644 graphify-out/cache/ast/v0.9.12/1ffe406e2059abdaa38ca7be67d40f803f1590a57bb33fb748672650734f6dfe.json create mode 100644 graphify-out/cache/ast/v0.9.12/230db5fa79cb43f295a03ccdf6d080accf60a7d0a8001968665c11e4943c0e0f.json create mode 100644 graphify-out/cache/ast/v0.9.12/25842d92f0389ff83edac66d66d8b6bd80a8886568953754ceeb529ff190abaf.json create mode 100644 graphify-out/cache/ast/v0.9.12/268542d783c963d045c5c292b81c9229b70a261e0c1be21a60aad2e6d1ce195f.json create mode 100644 graphify-out/cache/ast/v0.9.12/270a513674a2dcff58c36e78a2fac226203900172b082d0fdd4ba0b946986c01.json create mode 100644 graphify-out/cache/ast/v0.9.12/2732bf02c19fbcd7cde5afdac9fd383d44f3a5b87e2a9db2d5afd2b8a206abdb.json create mode 100644 graphify-out/cache/ast/v0.9.12/28d6b3aa98a18a8a554cb4142264ddd6bdf1ac191ed28bf423c738fc07d25718.json create mode 100644 graphify-out/cache/ast/v0.9.12/29076e77eb9ed4d8141d6d7861d7879717fe36e7709682b95c46b7321d166a78.json create mode 100644 graphify-out/cache/ast/v0.9.12/2c40e2f9feba7a50cd9da13e72dcdedb6270395b76b3782cf84acc41c9698866.json create mode 100644 graphify-out/cache/ast/v0.9.12/2c54170d6921f71545e7a57fdbe47ca9b3c32f674d219c746db87d60597cad6f.json create mode 100644 graphify-out/cache/ast/v0.9.12/2e758c1261080091e929a9e0cf147902f9927ee140e86128cf9b71875f94d606.json create mode 100644 graphify-out/cache/ast/v0.9.12/31067d5568b458163ffa04ca1a742ef715f9cdf893ab6a9bbed015cce3e94a3f.json create mode 100644 graphify-out/cache/ast/v0.9.12/32a60fceb1138af3b20f042a7d43dfebf89b537b0fcae251813bd78b0d784dde.json create mode 100644 graphify-out/cache/ast/v0.9.12/35f281cbdaeccceffeefe4bae940c2b9b5bf5428aeac3151ed22f1a738753c36.json create mode 100644 graphify-out/cache/ast/v0.9.12/360482b8bedb1326ec18b965f1bee62a03d3619961e22f28d680910c076e5dc1.json create mode 100644 graphify-out/cache/ast/v0.9.12/362d4a5c041c414d7a982683883141240284771b576e960b0f76d74570a82eb2.json create mode 100644 graphify-out/cache/ast/v0.9.12/36f29c2555a7f0a70827a5771b6b97124db16b03ddc7142b9eafb8413bf1cc93.json create mode 100644 graphify-out/cache/ast/v0.9.12/391ce6810ba8bc46297828549d6a820e48da13daa52f937c80866dd1d97a1b7f.json create mode 100644 graphify-out/cache/ast/v0.9.12/3a357e239f43f20371b83f37a083dfcbd148da1e3c175ec06bd00e3bde9b47fa.json create mode 100644 graphify-out/cache/ast/v0.9.12/3a5ef7b7fe26ea69b371f3801e4f8fabf814b93b5d3b9e2e8aa228ce84ba9a65.json create mode 100644 graphify-out/cache/ast/v0.9.12/3aa3a57a43d8db1c5e15a219597e2dd7638c4b6994973fd91a9f13246a88396a.json create mode 100644 graphify-out/cache/ast/v0.9.12/3be93ddcf1d6cfd2b995b24124fbc30a8158e76ecb327849777b4b6f7d779d0d.json create mode 100644 graphify-out/cache/ast/v0.9.12/3cb997d321b67ce5f09f67f4abfb467aae3a6ef3d62432cc4ab5e0ed4e17076d.json create mode 100644 graphify-out/cache/ast/v0.9.12/3cd0f3de061fbc1c060f3ee0c85e69d56d9d5ea79e0332b79979aaa75406918a.json create mode 100644 graphify-out/cache/ast/v0.9.12/3f1684dbe3c0e1a630374319847bb0bec02fb96a977efbf80e8fcb05f0167e65.json create mode 100644 graphify-out/cache/ast/v0.9.12/3fdf33634215b114d7c78ce9e72b6af71d60e56453dee06e84475aa44909cb37.json create mode 100644 graphify-out/cache/ast/v0.9.12/40142bf5cc2d40d1910b01429aafe9a0a418374cbf6c6ce41cae3a5bb64b71e0.json create mode 100644 graphify-out/cache/ast/v0.9.12/418c7a8d363c4a1895954bdfcf1bb503f5a95f76b8f4dd5379d54fe757f89ed8.json create mode 100644 graphify-out/cache/ast/v0.9.12/42d3da29692a973b8da1bde60ce51a3882172699cf0f6059b4e7fcd9247b5d65.json create mode 100644 graphify-out/cache/ast/v0.9.12/43eafff5015383300a757cbc5a048b365a9e0b61a58ef7fc068da08d3e14bd17.json create mode 100644 graphify-out/cache/ast/v0.9.12/44ef85be6dc329cef95eea08dfddc2566dad1ed8c689f45242b6ef53173caa45.json create mode 100644 graphify-out/cache/ast/v0.9.12/45416ed9a8d07b5081c69a9bca5c411bf5ae46a9d1903b8dc280caebce4f5ef6.json create mode 100644 graphify-out/cache/ast/v0.9.12/477c72842d1f2f466b5339f017a0b3f675eb4fd6614c5d87d102b1307373f4cd.json create mode 100644 graphify-out/cache/ast/v0.9.12/484bd452e4cca8a28a80d971df0b6356efbb8124b689eb2787dec33cd86192ae.json create mode 100644 graphify-out/cache/ast/v0.9.12/485e64bab6b634da3116b1e95aff6ee27dfbad69a4de55e5ec02fe221390ea45.json create mode 100644 graphify-out/cache/ast/v0.9.12/4ab13bd16e526120bd419158910fd91ff09c472d6ea9b9b04d27f8f7cd75f273.json create mode 100644 graphify-out/cache/ast/v0.9.12/4bfe546efa9608757a5a42d3f3a26e05732208d080ab4a621c971fc65d51df3b.json create mode 100644 graphify-out/cache/ast/v0.9.12/4d4be914cc12e8fd0dca4d9f90ae646bc7e47c6d9c63913faba3e4773e09cfa9.json create mode 100644 graphify-out/cache/ast/v0.9.12/4fd8141e0c76ae585cff7146ce01e0256b465cbc0bc509331627dad7dd6d9abc.json create mode 100644 graphify-out/cache/ast/v0.9.12/5437f38427347f041364d1957ffb5cf646f147e8df5ed534592530aa9390d14d.json create mode 100644 graphify-out/cache/ast/v0.9.12/5537f92bfdd5591528717f0ca92af03c81112bc337b8ac267aea58beae0829a4.json create mode 100644 graphify-out/cache/ast/v0.9.12/5571f04428d300c6da0a7316e225ce454d13d8be97df327a9ffa64d23a74b553.json create mode 100644 graphify-out/cache/ast/v0.9.12/564e4d5e112bb965ac46092880f552dafd8e3077a0e558ad999be6ebee888d9d.json create mode 100644 graphify-out/cache/ast/v0.9.12/5a5c94a68382012daec4759b15b8757bdcfc717b4161c38b0ea460c60e0809af.json create mode 100644 graphify-out/cache/ast/v0.9.12/5b3a585929087f1edfbf03d76b11db71e8b32e216efaf16eaaa21c261b76bf4b.json create mode 100644 graphify-out/cache/ast/v0.9.12/5c1aaf54cc4cf0064e4ff6a91c5fabd6a9167483583467a76b40a136272b9ae6.json create mode 100644 graphify-out/cache/ast/v0.9.12/5d5432cc3808ef8280fcc20d3aa293c732eb75f10603a5a7ba0f9ef718c96d80.json create mode 100644 graphify-out/cache/ast/v0.9.12/5f08be78457b05e434a86621d02fb4c4d88f1cb4fa8890260c3fdcb30921eba9.json create mode 100644 graphify-out/cache/ast/v0.9.12/5fab9114aadc819c763094dff4ee407e8e5739546b2591b34c427c68d0e4e061.json create mode 100644 graphify-out/cache/ast/v0.9.12/608966af79ae04571b288ae9393ba7ca5f3f89dbbee63626696c0ec37eb59419.json create mode 100644 graphify-out/cache/ast/v0.9.12/6734732becf87c2b2f4c9577bf6237b6cc01958f62237cda727fa79776eb9222.json create mode 100644 graphify-out/cache/ast/v0.9.12/678855fa1445d19e52893fbf7107d79d00d3f1a9fb3f6f774fc0a8b7d425971c.json create mode 100644 graphify-out/cache/ast/v0.9.12/67a276d8134d714bd6238fb9dababe905709310275a9526186c8b4f5cd93f403.json create mode 100644 graphify-out/cache/ast/v0.9.12/69473124b79c5f46b2cd9210545afbe5c43e337d17fc350b99c7c00d63a8e9a0.json create mode 100644 graphify-out/cache/ast/v0.9.12/69d09c329a0ca6bdde85821f3e3eb016fbc9013d38bb840b6405896f119c774a.json create mode 100644 graphify-out/cache/ast/v0.9.12/6b397c859cf2be4f3b32acd82c5dd2a6c1be603210229bb602ef439b209a856f.json create mode 100644 graphify-out/cache/ast/v0.9.12/6c531305cfb7d7409650ddb658ad22399c0e76fad3a2ac6d508ba11085752457.json create mode 100644 graphify-out/cache/ast/v0.9.12/6ca0c17925ae91c0616a83ba64c5fef9196b7dbd88454335cda90011b4647176.json create mode 100644 graphify-out/cache/ast/v0.9.12/6dd0c98d5b887d33986b80707e158cc25612a9882c35adaa2d63c1cc04c3186f.json create mode 100644 graphify-out/cache/ast/v0.9.12/716807979980bdc2af2981716fd7911e95a1ff5b5398aca95461b0b0d2743ebb.json create mode 100644 graphify-out/cache/ast/v0.9.12/74f884bbd64695d3e056ae390409291c1d84acc0e807983a45e95d6c29830587.json create mode 100644 graphify-out/cache/ast/v0.9.12/76a32156d75c0df635aa37bccc1046853b8f950c77b91eea0742b3c4d582ff4b.json create mode 100644 graphify-out/cache/ast/v0.9.12/7d0805c04e9496c4b68b354364ae66ebbab6acd1e0dad6b7db1483d92b77c78c.json create mode 100644 graphify-out/cache/ast/v0.9.12/7e561e92ff76f50bc1ed996287f23b5bba248c7e6e31c2c1c044adb9576ffa72.json create mode 100644 graphify-out/cache/ast/v0.9.12/7e93aa579fa1bd1476f2aa50692bc90282ef1c0f3f7f129da51a31c8fa3edf9e.json create mode 100644 graphify-out/cache/ast/v0.9.12/7e9ea06bb36eba35fa1281b85ec834d8780e5d7dcf5b5eb2241698f868052bd9.json create mode 100644 graphify-out/cache/ast/v0.9.12/7eb00b83654ea04f52d66d6fc0f4289bd343efacd7cf0e64cd07c1d6626f17c7.json create mode 100644 graphify-out/cache/ast/v0.9.12/80cd2a7d36cf96bcea0f180b21064d5ef1b0c20a14b3d52de5c8332fa87d9409.json create mode 100644 graphify-out/cache/ast/v0.9.12/81b1417df5bd6f3acfefb43aaef09f8f27d9b8e5720fc053cb5404112b0ce629.json create mode 100644 graphify-out/cache/ast/v0.9.12/83e45bef0b5c8bd2a78f7b23ab946bfab2345b0261403eb444d02d3c21af4c5c.json create mode 100644 graphify-out/cache/ast/v0.9.12/84ea1bad3ebc4ceed0969c6a9e99786ebf2a7a3e06cc9d46a214d1a8009b7aad.json create mode 100644 graphify-out/cache/ast/v0.9.12/85471ff54a53b68b879705e90176eeaaae9e647e0aa5abf784c55821a9f09a65.json create mode 100644 graphify-out/cache/ast/v0.9.12/871055d63d20caff714802956004d69d8f6264bad7d13e5d3e9dc2cb0bc0d97b.json create mode 100644 graphify-out/cache/ast/v0.9.12/874790ea7dde48fc74dad8f71fed97e1ea7c2ed0a86c6ebfb87c2e8602d4afd0.json create mode 100644 graphify-out/cache/ast/v0.9.12/8a0b6ec382816762bc93beb99600d9fa90cf489229f90ba909f87f80f875c26c.json create mode 100644 graphify-out/cache/ast/v0.9.12/8c01d6cbdde1d6778c846e5fe824098a5481c7aabcd3106c9aa4303909ac86ad.json create mode 100644 graphify-out/cache/ast/v0.9.12/8c7f9222c93be06aca0c8ea3eba1cdad0322f5bbbee4c133db3ae9a4b4ad998c.json create mode 100644 graphify-out/cache/ast/v0.9.12/8f854e3991b3caff8d453cb03b73398b56acbaef3f2cd42fca61dbd9f2bd0c62.json create mode 100644 graphify-out/cache/ast/v0.9.12/8fbe278f8de00c6c2cd68d0dc1a7c39d936d2c1a756a9d755fbde5193800125a.json create mode 100644 graphify-out/cache/ast/v0.9.12/923a2da3abe1fa3e59ea63e8c908fdc2c9b731f5f35995a6762e09fb684c7631.json create mode 100644 graphify-out/cache/ast/v0.9.12/9289e41d5c530b6d07f12a7b1274c1b6411660049a319a2743819fabce634477.json create mode 100644 graphify-out/cache/ast/v0.9.12/93a32df04b943896091ef86210ccd65d301453b7686af08fe06d8a6c301bda5c.json create mode 100644 graphify-out/cache/ast/v0.9.12/9406f96939c3bc042329025d0c71ee310dd283e2271ab22a31b7bd74c2b23dcb.json create mode 100644 graphify-out/cache/ast/v0.9.12/9424347a2354cae2c603faeb7d3c8bce2334fe39cd300ba505bc8008f729dc91.json create mode 100644 graphify-out/cache/ast/v0.9.12/95bbba1dd266f79a2f2a2165b33a9846384469ef24770f4e24aa306942046cc4.json create mode 100644 graphify-out/cache/ast/v0.9.12/9766508e5a013c3d3cbb2602719391199e90af5720c9782a77ca71565aa346b1.json create mode 100644 graphify-out/cache/ast/v0.9.12/97779a4b9a9043cea71befa01e687528d2bc1e9c560bf8375e3603038be2fafb.json create mode 100644 graphify-out/cache/ast/v0.9.12/980853b0f18d9c77ea3254332b91b68b7f01bcdbff4e57c421000d0399767f71.json create mode 100644 graphify-out/cache/ast/v0.9.12/9abaf69d4ac023ddd3d578178aac2b44da9f58d8ea1591acdc5ff2b0f5de894b.json create mode 100644 graphify-out/cache/ast/v0.9.12/9b2e12c935ce8d24f77168acf4bb058d76248588fc413448c8a180376990aa12.json create mode 100644 graphify-out/cache/ast/v0.9.12/9b3ed7d450f4e6948b37296736f903947d715df959fd1660dd3e66132217f4fd.json create mode 100644 graphify-out/cache/ast/v0.9.12/9d462c92277c7592f8f6f25d497ccc2506adb950b206036ef6ab7e5c15bf82bd.json create mode 100644 graphify-out/cache/ast/v0.9.12/9de1bc3f88ecf5d17ff4dd014f64ba01a8e9043fcf822120270360f27625893c.json create mode 100644 graphify-out/cache/ast/v0.9.12/9e3eeb82cc83cd037731fc124aa985535c8334396c06c3f6823f83e596960f60.json create mode 100644 graphify-out/cache/ast/v0.9.12/a72ddfe03f7176e4d70709225ba92298f5d391ab1712e86f56d6cbc05d2417d5.json create mode 100644 graphify-out/cache/ast/v0.9.12/a7717ff97c56dd84d4ea138ddd2523126e0b3d6f15c396e7fe16fa499c21fbd6.json create mode 100644 graphify-out/cache/ast/v0.9.12/a8334eddf62156babdb539820431b2ec6b87fc669e0a0d859ff6172a4df5bbb0.json create mode 100644 graphify-out/cache/ast/v0.9.12/a9ee6994654da7ca6c7c16be343153914cb9fd52bbf0717d4719ed1b7ee76b26.json create mode 100644 graphify-out/cache/ast/v0.9.12/a9fefb20b7f6d173403fd6bf5e8d613bb7b0e7cbfe19058508df0a097fb5cbd8.json create mode 100644 graphify-out/cache/ast/v0.9.12/ab86305c21e45cd0c98d13ec9b20c421633b60d3b4853a1b996cb0828b28b8fb.json create mode 100644 graphify-out/cache/ast/v0.9.12/ac2a3fc79b0ecbdcabf9cdfb7d2e04f03f854bd162d1c42f30e4382ee7844a14.json create mode 100644 graphify-out/cache/ast/v0.9.12/ace1494d9616d09ccc8c73d3d5d7e06773be468bd791e3087709930cd40176a9.json create mode 100644 graphify-out/cache/ast/v0.9.12/aff16c50f48518ec0e7efe9c8eb1adefb5040db8934f4a58158a51ad751e93d6.json create mode 100644 graphify-out/cache/ast/v0.9.12/b12d02f9dbdcac7767f0154a5f44bb27ab07dbe949f9bab3d0e0de8fc518db3f.json create mode 100644 graphify-out/cache/ast/v0.9.12/b2dca8fb0b417c4116ae540a73df2072b1c69469aa5805adea3bf907adf9fd9f.json create mode 100644 graphify-out/cache/ast/v0.9.12/b5e01d6d5593c4e667484b9b2551851a7c1a5d64b0ac7144385d111726b9ce93.json create mode 100644 graphify-out/cache/ast/v0.9.12/b6c958c747c3ba2246c1c4f648f79a0818dca75e01691ae7decfbda64e086d06.json create mode 100644 graphify-out/cache/ast/v0.9.12/b6f2ae1ad8835fb7addf2769ab10a220cfcc8772a5b71d3ea76685a3f69e0bc6.json create mode 100644 graphify-out/cache/ast/v0.9.12/ba9aa91a6156e86dcabb74838e6127f64872cab86cd311e1e17f1fd62bcfd22d.json create mode 100644 graphify-out/cache/ast/v0.9.12/baa47f61f9662cca3c39652fdda758b5395dd08937ed998e79b326cd00c20201.json create mode 100644 graphify-out/cache/ast/v0.9.12/bade20508151fb1584dc9b7e362a42622d73887f79ac73caf6770ecd4f59a542.json create mode 100644 graphify-out/cache/ast/v0.9.12/bd7a6ea5da38a3a5af82e8fa69cb01c9e4ed7a9bcb012b26608bfe89d1d7c8e2.json create mode 100644 graphify-out/cache/ast/v0.9.12/c025b59d320aea033be3c33b5a53bfe84e317adfb7ee606b82899f00d01bf330.json create mode 100644 graphify-out/cache/ast/v0.9.12/c122129f51fd4204e8f789b000837aed44ae38b3b361f0fe17fb635628bf36f2.json create mode 100644 graphify-out/cache/ast/v0.9.12/c13a52d8f147f15f0fcc485b02fe023aa8dd0f3cb4d835e75a2be7e39d7ccaca.json create mode 100644 graphify-out/cache/ast/v0.9.12/c26b326505f97c163793b93a0fb742e11fbb02300ba98201527e5ac71e54928e.json create mode 100644 graphify-out/cache/ast/v0.9.12/c2b2e130cbb61f2eb2f8ea5f146aac68a93fb90d33b77f14a0dc354f2349386f.json create mode 100644 graphify-out/cache/ast/v0.9.12/c759101fe3b14f9e653dbc2abf1cd95732709c4ff23fa61ed942ad8769b8b3e4.json create mode 100644 graphify-out/cache/ast/v0.9.12/c8ce78d08b1fc8a5bdec7f3074e433842681a25154fb04052854714bc0ad38e3.json create mode 100644 graphify-out/cache/ast/v0.9.12/cb639a61d3900e34341ff22a73e30a61200b9998a025c74163c3a0fbb6b37c4e.json create mode 100644 graphify-out/cache/ast/v0.9.12/cdb3bfc0a2312f3c0968b7b96ba252ae651e6d9f33a0e619262fcaa481662908.json create mode 100644 graphify-out/cache/ast/v0.9.12/d13f3eb3be5f583deae5fe08bcc29cd8f0565d4b9a53d04ad54d67ded3952d55.json create mode 100644 graphify-out/cache/ast/v0.9.12/d69fb6e0648c1b488eeaa9ee09ed0235403a3db83f55579893f2f75bd2e98c40.json create mode 100644 graphify-out/cache/ast/v0.9.12/d6fd9d3a5e2f38ca1748d026cf73e32960d20427892e8315cb88c6fc1b91b6eb.json create mode 100644 graphify-out/cache/ast/v0.9.12/d740957a56bc1d9880d8be2887395d0c030f8a1c829c26afa3fec2cd97548df9.json create mode 100644 graphify-out/cache/ast/v0.9.12/d75ad90ad3748e4df853e480d74e446b579a4daee1be5689bde8c0477ef84a3f.json create mode 100644 graphify-out/cache/ast/v0.9.12/d8402a480a1d225d97647ac023b87c34989a4fe58e5d252b7dcdb578d6310417.json create mode 100644 graphify-out/cache/ast/v0.9.12/da06e1d502f0caa3d3cd6e0589bf0400eda8a75bc2c1c07d0bca85eabcda0404.json create mode 100644 graphify-out/cache/ast/v0.9.12/da4d229908b8f14db03edf313031d35225942138284d7fe665fd24995be0a342.json create mode 100644 graphify-out/cache/ast/v0.9.12/db5f9a3c7a0e8e3289ecd1280c4a03731432574f7c3333e9e2cae5f345116dc5.json create mode 100644 graphify-out/cache/ast/v0.9.12/dc00e1b1945dbd2486de61f686f47739e8b175e9afae1696de901e26e9973734.json create mode 100644 graphify-out/cache/ast/v0.9.12/dd7dbb440174e46dc535629e8bf432481ae3aac8965275bdbba366b7343d729a.json create mode 100644 graphify-out/cache/ast/v0.9.12/de913e244c2548ca3129406ac614a15ddb9de4469914cb5508d73588d1544eab.json create mode 100644 graphify-out/cache/ast/v0.9.12/df7e2e9c3109d837347005e3db6cd6560fa8212d29c02cc20ecb111b0a567790.json create mode 100644 graphify-out/cache/ast/v0.9.12/dfd3666cebb741d0e9dfd23ccff90cab33b6549e090fdb5ab35f05c52fd90386.json create mode 100644 graphify-out/cache/ast/v0.9.12/e08c94349f5926989f379da7c2311e7f72044522f2488b7e83f5163d1583e74a.json create mode 100644 graphify-out/cache/ast/v0.9.12/e2fd8755be2cd735b273a8379f49b464b9e4f434d6f005d5b455ddb1e2cec722.json create mode 100644 graphify-out/cache/ast/v0.9.12/e3a8f53737056967a20fc6d503754ef494e7bb7101affdaa2150a982f727cea2.json create mode 100644 graphify-out/cache/ast/v0.9.12/e5cafeda3749b63fda79ada57399bd8e76db81d6aa17639c06a81c64e4df8b97.json create mode 100644 graphify-out/cache/ast/v0.9.12/e8901d4f8d48295ea63d767d83b3d59c32a8eaccd6eed897e435b3526be4228a.json create mode 100644 graphify-out/cache/ast/v0.9.12/e96236628a0ffae1e2322022e7e6e0d864055ea620daabef7fa85453d29037bc.json create mode 100644 graphify-out/cache/ast/v0.9.12/e978a167902c1ebeb737430dcc8204941832651ee98981a850f25504b6b66efb.json create mode 100644 graphify-out/cache/ast/v0.9.12/e99c8be7a3c408e1f94b22432d712bfdee5995c9f627049b89420c2bbc244615.json create mode 100644 graphify-out/cache/ast/v0.9.12/eb3486359e7d0fcd15323bb61d63750d50e8f715a04cdb8acf2efacad0a3b85d.json create mode 100644 graphify-out/cache/ast/v0.9.12/f014d6a1458d76d533eb460270143e6e6075c097fa48311133b81d202c1167a4.json create mode 100644 graphify-out/cache/ast/v0.9.12/f02576672e41b54139736398dc498f60322e229b785bfabd686e69fe6841263d.json create mode 100644 graphify-out/cache/ast/v0.9.12/f1314e60e46f6c9003266463ac40cc27c37f7edf7998a905f18487b49ee1d33f.json create mode 100644 graphify-out/cache/ast/v0.9.12/f245b9ed2f7a17c90d781fd03828fa7aecfbd47ab4a54098dd03bc54ff04b5be.json create mode 100644 graphify-out/cache/ast/v0.9.12/f6175fa40bdbed3678bee1b56abc1159990961c43b3f4081d50114db24b68d60.json create mode 100644 graphify-out/cache/ast/v0.9.12/f620aee3027b422a20821189ec437ef3e839735e8793b48ee35f70b7d816427d.json create mode 100644 graphify-out/cache/ast/v0.9.12/f82d884e30bac32f1c69658f624c844ea9ab71b68f6056b81091a0169cbc130f.json create mode 100644 graphify-out/cache/ast/v0.9.12/f8859eb067ead31d542379cc874b487a42b1366d428bff6bb26afd8bc6a1236e.json create mode 100644 graphify-out/cache/ast/v0.9.12/fb23ccf3d48b1514deacb18070829f84dfbb61c657938a12f5e7fbbb943382ad.json create mode 100644 graphify-out/cache/ast/v0.9.12/fcc3591a1affb5f874f052a163d8142b55e0ee3c1f19ca0ee8ad28971d82f019.json create mode 100644 graphify-out/cache/ast/v0.9.12/fdae58d6dcde39a6c519109428fa94245babe3046c0f5be98d70fb44e8b42c2e.json create mode 100644 graphify-out/cache/semantic/867573b92c982ee44a22a588865692232ff449cc4afb80e38788ec3b1417b93c.json create mode 100644 graphify-out/cache/semantic/9582465b12d2b851abe6b2446b9b27a0d47f397227e115c31533c3036a434b00.json create mode 100644 graphify-out/cache/semantic/b48fc5945436accd93bc01bfbf09f8697b088155d8e7da204a4ac1dec8474268.json create mode 100644 graphify-out/cache/semantic/bedf5a3979d3445006eaeda003ac9bd91579b18311b93727715ed7e6d33cee77.json create mode 100644 graphify-out/cache/stat-index.json create mode 100644 graphify-out/cost.json create mode 100644 graphify-out/graph.html create mode 100644 graphify-out/graph.json create mode 100644 graphify-out/manifest.json diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..3ab1ce8 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,24 @@ +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "/Users/senko/.local/bin/graphify hook-guard search" + } + ] + }, + { + "matcher": "Read|Glob", + "hooks": [ + { + "type": "command", + "command": "/Users/senko/.local/bin/graphify hook-guard read" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index 7555a32..25093d3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,3 +74,13 @@ These exist for future sync + ML and are easy to violate by accident: ## Python 3.14 note The project targets Python 3.14, which makes annotations lazy by default (PEP 649). `from __future__ import annotations` is therefore intentionally **absent** — do not add it back. All pins (pyproject `requires-python`, ruff `target-version`, mypy `python_version`, Dockerfile, `.python-version`) are on 3.14. + +## graphify + +This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships. + +Rules: +- For codebase questions, first run `graphify query ""` when graphify-out/graph.json exists. Use `graphify path "" ""` for relationships and `graphify explain ""` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output. +- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing. +- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context. +- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost). diff --git a/graphify-out/.graphify_labels.json b/graphify-out/.graphify_labels.json new file mode 100644 index 0000000..809ad11 --- /dev/null +++ b/graphify-out/.graphify_labels.json @@ -0,0 +1 @@ +{"0": "Storage Backend & Disk Usage", "1": "Auth Schemas & Tokens", "2": "Error Mapping & Search Schemas", "3": "Download Service Orchestration", "4": "Playlist Schemas & API", "5": "Album Repository", "6": "ORM Base & Models", "7": "Correlation ID Middleware & Config", "8": "Auth Services (native + Subsonic)", "9": "Audio Tags & Metadata Test Fakes", "10": "YouTube Source Backend", "11": "Dependency Wiring (deps.py)", "12": "Library Stats & Track Availability", "13": "Library Import Service", "14": "Subsonic Response Envelope", "15": "Chromaprint Fingerprinting", "16": "Album/Search Response Schemas", "17": "Pagination & Likes Endpoints", "18": "Metadata Enrichment Service", "19": "Subsonic ID Encoding", "20": "Track & Artist Domain Entities", "21": "Source Port Protocols", "22": "User Management Service", "23": "Metadata Enrichment Value Objects", "24": "DB Session & Health Checks", "25": "Download Service Tests", "26": "Download Job Domain Entity", "27": "Credentials & User Repository", "28": "Streaming Auth Dependencies", "29": "Subsonic Browsing Endpoints", "30": "Remote Library Service Tests", "31": "Worker Session Scope & Download Task", "32": "Metadata Enrichment Pipeline", "33": "Album Domain & Cover Value Object", "34": "Downloads API Tests", "35": "Subsonic Search Encoding", "36": "In-Memory Auth Repository Fakes", "37": "Storage Stats Response Schemas", "38": "Subsonic App-Password Crypto", "39": "Artist Schemas & Endpoints", "40": "Download Request/Response Schemas", "41": "Settings & MusicBrainz User-Agent", "42": "Subsonic API Integration Tests", "43": "Playlist Endpoints", "44": "Play History Domain & Repository", "45": "DB Engine Lifecycle", "46": "Shared Query Param Annotations", "47": "Local Folder Source Backend", "48": "Track Metadata Match Schemas", "49": "Like Domain Entity (event log)", "50": "Auth API Integration Tests", "51": "Cover API Tests", "52": "Upload/Stream API Tests", "53": "Tag Parsing Helpers", "54": "Metadata API Tests", "55": "Subsonic Auth Service Tests", "56": "Cover Art Serving", "57": "Play History Schemas", "58": "Refresh Token Repository", "59": "Radio Endpoints", "60": "Subsonic Legacy Password Decoding", "61": "Management CLI", "62": "Sources API Tests", "63": "Hexagonal Architecture Layers (doc)", "64": "Test DB Fixtures (conftest)", "65": "Upload Response Schemas", "66": "Cover Art Extraction (Vorbis/MP4)", "67": "Storage Stats API Tests", "68": "AcoustID Response Parser Tests", "69": "Like Request/Response Schemas", "70": "Streaming Endpoint", "71": "Auth Token Issue/Refresh Flow", "72": "Generic Job/Result Store Protocol", "73": "Remote Library Materialization", "74": "CI Docker Publish Workflow", "75": "User Scrobbling Settings", "76": "Domain Invariants (dedup, manual overwrite, offline tags)", "77": "Alembic Migration Environment", "78": "Cover Art Archive Client", "79": "Health Endpoint Smoke Tests", "80": "ASGI Middleware Protocol", "81": "File Hashing Utilities", "82": "Migration: auth_users", "83": "Migration: music_schema", "84": "Migration: rename track file_path", "85": "Migration: subsonic_app_password", "86": "Migration: track_enrichment_outcome", "87": "Migration: download_job_track_id", "88": "Migration: remote_placeholders", "89": "Package: app.api", "90": "Package: app.api.schemas", "91": "Package: app.application", "92": "Package: app.core", "93": "Package: app.domain", "94": "Package: app.infrastructure", "95": "Package: metadata-enrichment adapters", "96": "Package: source backends", "97": "Package: storage adapters", "98": "Package: app root (mcma-backend)", "99": "Package: arq worker", "100": "Package: arq tasks", "101": "Config Conventions (doc)", "102": "Subsonic Adapter Convention (doc)", "103": "DB Session Convention (doc)", "104": "Health Convention (doc)", "105": "Invariant: Graceful Degradation", "106": "Invariant: Likes Are Append-Only", "107": "Invariant: Stable Track content_id", "108": "Logging Convention (doc)", "109": "Python 3.14 Lazy Annotations Note", "110": "App-Passwords Mechanism (doc)", "111": "Local Dev Setup (doc)", "112": "Tooling Section (doc)", "113": "Package: workers"} \ No newline at end of file diff --git a/graphify-out/.graphify_python b/graphify-out/.graphify_python new file mode 100644 index 0000000..562f971 --- /dev/null +++ b/graphify-out/.graphify_python @@ -0,0 +1 @@ +/Users/senko/.local/share/uv/tools/graphifyy/bin/python \ No newline at end of file diff --git a/graphify-out/.graphify_root b/graphify-out/.graphify_root new file mode 100644 index 0000000..aa859be --- /dev/null +++ b/graphify-out/.graphify_root @@ -0,0 +1 @@ +/Users/senko/Work/mcma-compose/mcma-backend diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md new file mode 100644 index 0000000..494813b --- /dev/null +++ b/graphify-out/GRAPH_REPORT.md @@ -0,0 +1,505 @@ +# Graph Report - . (2026-07-11) + +## Corpus Check +- 180 files · ~50,815 words +- Verdict: corpus is large enough that graph structure adds value. + +## Summary +- 1953 nodes · 5606 edges · 114 communities (89 shown, 25 thin omitted) +- Extraction: 90% EXTRACTED · 10% INFERRED · 0% AMBIGUOUS · INFERRED: 579 edges (avg confidence: 0.56) +- Token cost: 0 input · 44,973 output + +## Community Hubs (Navigation) +- Storage Backend & Disk Usage +- Auth Schemas & Tokens +- Error Mapping & Search Schemas +- Download Service Orchestration +- Playlist Schemas & API +- Album Repository +- ORM Base & Models +- Correlation ID Middleware & Config +- Auth Services (native + Subsonic) +- Audio Tags & Metadata Test Fakes +- YouTube Source Backend +- Dependency Wiring (deps.py) +- Library Stats & Track Availability +- Library Import Service +- Subsonic Response Envelope +- Chromaprint Fingerprinting +- Album/Search Response Schemas +- Pagination & Likes Endpoints +- Metadata Enrichment Service +- Subsonic ID Encoding +- Track & Artist Domain Entities +- Source Port Protocols +- User Management Service +- Metadata Enrichment Value Objects +- DB Session & Health Checks +- Download Service Tests +- Download Job Domain Entity +- Credentials & User Repository +- Streaming Auth Dependencies +- Subsonic Browsing Endpoints +- Remote Library Service Tests +- Worker Session Scope & Download Task +- Metadata Enrichment Pipeline +- Album Domain & Cover Value Object +- Downloads API Tests +- Subsonic Search Encoding +- In-Memory Auth Repository Fakes +- Storage Stats Response Schemas +- Subsonic App-Password Crypto +- Artist Schemas & Endpoints +- Download Request/Response Schemas +- Settings & MusicBrainz User-Agent +- Subsonic API Integration Tests +- Playlist Endpoints +- Play History Domain & Repository +- DB Engine Lifecycle +- Shared Query Param Annotations +- Local Folder Source Backend +- Track Metadata Match Schemas +- Like Domain Entity (event log) +- Auth API Integration Tests +- Cover API Tests +- Upload/Stream API Tests +- Tag Parsing Helpers +- Metadata API Tests +- Subsonic Auth Service Tests +- Cover Art Serving +- Play History Schemas +- Refresh Token Repository +- Radio Endpoints +- Subsonic Legacy Password Decoding +- Management CLI +- Sources API Tests +- Hexagonal Architecture Layers (doc) +- Test DB Fixtures (conftest) +- Upload Response Schemas +- Cover Art Extraction (Vorbis/MP4) +- Storage Stats API Tests +- AcoustID Response Parser Tests +- Like Request/Response Schemas +- Streaming Endpoint +- Auth Token Issue/Refresh Flow +- Generic Job/Result Store Protocol +- Remote Library Materialization +- CI Docker Publish Workflow +- User Scrobbling Settings +- Domain Invariants (dedup, manual overwrite, offline tags) +- Alembic Migration Environment +- Cover Art Archive Client +- Health Endpoint Smoke Tests +- ASGI Middleware Protocol +- File Hashing Utilities +- Package: app.api +- Package: app.api.schemas +- Package: app.application +- Package: app.core +- Package: app.domain +- Package: app.infrastructure +- Package: metadata-enrichment adapters +- Package: source backends +- Package: storage adapters +- Package: app root (mcma-backend) +- Package: arq worker +- Package: arq tasks +- Config Conventions (doc) +- Subsonic Adapter Convention (doc) +- DB Session Convention (doc) +- Health Convention (doc) +- Invariant: Graceful Degradation +- Invariant: Likes Are Append-Only +- Invariant: Stable Track content_id +- Logging Convention (doc) +- Python 3.14 Lazy Annotations Note +- App-Passwords Mechanism (doc) +- Local Dev Setup (doc) +- Tooling Section (doc) + +## God Nodes (most connected - your core abstractions) +1. `NotFoundError` - 94 edges +2. `UserService` - 55 edges +3. `Track` - 50 edges +4. `AuthenticationError` - 49 edges +5. `TrackRepository` - 49 edges +6. `SourceInfo` - 49 edges +7. `MetadataEnrichmentService` - 47 edges +8. `DownloadResult` - 47 edges +9. `get_settings()` - 45 edges +10. `FileStorage` - 43 edges + +## Surprising Connections (you probably didn't know these) +- `test_id_malformed_rejected()` --indirect_call--> `NotFoundError` [INFERRED] + tests/test_subsonic_security.py → app/domain/errors.py +- `test_id_wrong_prefix_rejected()` --indirect_call--> `NotFoundError` [INFERRED] + tests/test_subsonic_security.py → app/domain/errors.py +- `acoustid_trust_score (trust high-confidence AcoustID over junk tags)` --semantically_similar_to--> `Invariant: never overwrite metadata_status=manual` [INFERRED] [semantically similar] + tests/fixtures/README.md → CLAUDE.md +- `FakeAcoustId` --uses--> `MetadataEnrichmentService` [INFERRED] + tests/test_metadata_service.py → app/application/metadata_service.py +- `FakeAlbumRepo` --uses--> `MetadataEnrichmentService` [INFERRED] + tests/test_metadata_service.py → app/application/metadata_service.py + +## Import Cycles +- None detected. + +## Hyperedges (group relationships) +- **Cross-cutting conventions (errors, config, logging, db sessions, migrations, health)** — claude_error_handling_convention, claude_config_convention, claude_logging_convention, claude_db_sessions_convention, claude_migrations_convention, claude_health_convention [EXTRACTED 1.00] +- **Non-negotiable domain invariants (for future sync + ML)** — claude_invariant_likes_event_log, claude_invariant_track_id_stable, claude_invariant_dedup, claude_invariant_graceful_degradation, claude_invariant_no_manual_overwrite, claude_invariant_no_heavy_work_in_request, claude_invariant_subsonic_compatibility [EXTRACTED 1.00] +- **Hexagonal architecture layers (domain/application/infrastructure/api/core/workers)** — claude_domain_layer, claude_application_layer, claude_infrastructure_layer, claude_api_layer, claude_core_layer, claude_workers_layer [EXTRACTED 1.00] + +## Communities (114 total, 25 thin omitted) + +### Community 0 - "Storage Backend & Disk Usage" +Cohesion: 0.05 +Nodes (53): DiskUsage, ObjectStat, Value objects for file storage., Capacity of the volume backing the media store. ``None`` for backends (e.g., File storage operation failed., StorageError, Capacity of the volume backing the store, or ``None`` when the backend h, LocalFileStorage (+45 more) + +### Community 1 - "Auth Schemas & Tokens" +Cohesion: 0.07 +Nodes (59): LoginRequest, BaseModel, Auth request/response schemas. Tokens are returned in the body (the client store, RefreshRequest, RegisterRequest, TokenResponse, BaseModel, Schemas for Subsonic app-password self-service (native /api/v1 surface). The Su (+51 more) + +### Community 2 - "Error Mapping & Search Schemas" +Cohesion: 0.06 +Nodes (44): _is_subsonic(), FastAPI, Maps domain exceptions to HTTP responses. The only place that knows both. Two s, register_exception_handlers(), ExternalSearchResponse, ExternalSearchResultOut, BaseModel, Schemas for searching external (fetch) sources — the §A4 discover screen. (+36 more) + +### Community 3 - "Download Service Orchestration" +Cohesion: 0.07 +Nodes (24): DownloadRequest, EnrichEnqueuer, DownloadService — request external downloads and import their results. Two role, Outcome of asking for a download. Exactly one of the three states holds: th, EnrichEnqueuer, Path, Protocol, UploadService — handles user file uploads. (+16 more) + +### Community 4 - "Playlist Schemas & API" +Cohesion: 0.11 +Nodes (34): PlaylistAddTrack, PlaylistCreate, PlaylistOut, PlaylistUpdate, BaseModel, Playlist request/response schemas., add_playlist_track(), _build_playlist_out() (+26 more) + +### Community 5 - "Album Repository" +Cohesion: 0.07 +Nodes (10): AlbumRepository, DownloadJobRepository, PlaylistRepository, datetime, UUID, Resolve/create an album bound to a remote ``(source, source_id)`` (lazy, Persistence for download jobs (plan §6.1). Drives the §A5 download manager a, Bump ``retry_count`` and return the new value. (+2 more) + +### Community 6 - "ORM Base & Models" +Cohesion: 0.10 +Nodes (32): Base, Declarative base with a fixed naming convention. The naming convention makes Al, Base for all ORM models. Import models so Alembic sees their metadata., ORM model for albums., ORM model for artists., ORM model for download jobs (plan §6.1). Tracks a queued download through its l, LikeValue, LyricsStatus (+24 more) + +### Community 7 - "Correlation ID Middleware & Config" +Cohesion: 0.09 +Nodes (33): CorrelationIdMiddleware, HTTP middleware: bind a correlation id and log each request., Pure-ASGI middleware: reuse inbound ``X-Correlation-Id`` or mint one, bind i, app_version(), get_settings(), Application settings — single source of truth, sourced from environment. Nothin, Cached settings singleton. Patch the cache in tests via ``get_settings.cache_cle, _add_correlation_id() (+25 more) + +### Community 8 - "Auth Services (native + Subsonic)" +Cohesion: 0.12 +Nodes (21): Authentication use cases: login, token refresh (rotation), logout, and access-to, SubsonicAuthService — app-password lifecycle + Subsonic auth verification. The, User entity. Admin is a single ``is_superuser`` flag — no role system in Phase, HistoryRepository, LikeRepository, PasswordHasher, Protocol, Ports — the contracts the application layer depends on. These are Protocols, no (+13 more) + +### Community 9 - "Audio Tags & Metadata Test Fakes" +Cohesion: 0.15 +Nodes (28): AudioTags, Embedded tags read from the file itself (ID3 / Vorbis / MP4 …). Every field, _cover_service(), FakeAlbumRepo, FakeArtistRepo, FakeCoverExtractor, FakeCoverProvider, FakeTagReader (+20 more) + +### Community 10 - "YouTube Source Backend" +Cohesion: 0.09 +Nodes (30): Which backend imported a track. Drives ``is_replaceable`` (plan §6.6)., TrackSource, _default_download(), _default_search(), _libs_available(), Any, Path, ProgressCallback (+22 more) + +### Community 11 - "Dependency Wiring (deps.py)" +Cohesion: 0.10 +Nodes (35): get_album_repository(), get_artist_repository(), get_auth_service(), get_download_service(), get_history_repository(), get_like_repository(), get_metadata_service(), get_password_hasher() (+27 more) + +### Community 12 - "Library Stats & Track Availability" +Cohesion: 0.12 +Nodes (19): FormatBreakdown, LibraryStats, Per-container-format slice of the library (e.g. ``flac`` → 312 tracks)., Aggregate facts about everything the instance has stored. Computed from the, Track, Whether a track's audio is on local storage or still a remote placeholder (p, TrackAvailability, TrackModel (+11 more) + +### Community 13 - "Library Import Service" +Cohesion: 0.13 +Nodes (18): ImportSummary, LibraryImportService, UUID, LibraryImportService — imports files discovered by an indexable source. Batch s, Source-backend value objects — framework-free. A *source* is a place tracks com, A single importable file discovered by an indexable source. ``source_id`` i, SourceFile, FakeArtistRepo (+10 more) + +### Community 14 - "Subsonic Response Envelope" +Cohesion: 0.12 +Nodes (30): _build_xml(), _is_json(), Any, Element, Response, The Subsonic response envelope — one serializer, two wire formats. Every Subson, A ``status="failed"`` envelope carrying a Subsonic ````., Recursively drop ``None`` values so JSON output matches XML (no empty attrs). (+22 more) + +### Community 15 - "Chromaprint Fingerprinting" +Cohesion: 0.10 +Nodes (21): FpcalcFingerprinter, Path, FpcalcFingerprinter — Chromaprint fingerprint via the ``fpcalc`` binary. ``fpca, Implements :class:`app.domain.ports.AudioFingerprinter`., MutagenTagReader, Implements :class:`app.domain.ports.AudioTagReader`., _acoustid_client(), _FakeAlbumRepo (+13 more) + +### Community 16 - "Album/Search Response Schemas" +Cohesion: 0.12 +Nodes (28): AlbumOut, BaseModel, Album request/response schemas., LibrarySearchResponse, BaseModel, Search response schemas., _build_album_out(), get_album() (+20 more) + +### Community 17 - "Pagination & Likes Endpoints" +Cohesion: 0.17 +Nodes (29): Shared pagination envelope for all paged list responses., TrackOut, get_likes(), AlbumRepoDep, ArtistRepoDep, Like endpoints. Likes are an append-only event-log — never updated in place., _build_track_out(), delete_track() (+21 more) + +### Community 18 - "Metadata Enrichment Service" +Cohesion: 0.11 +Nodes (11): _first_int(), MetadataEnrichmentService, _opt_str(), UUID, Explain a ``failed`` (no-identity) run in terms a user can act on: which, AcoustID candidates for the metadata editor's match picker (§A7). Read-, Fill in an album cover when it has none. Source order mirrors the tag-fi, CoverArt (+3 more) + +### Community 19 - "Subsonic ID Encoding" +Cohesion: 0.14 +Nodes (28): decode_album(), decode_artist(), _decode_as(), decode_playlist(), decode_track(), encode(), encode_playlist(), encode_track() (+20 more) + +### Community 20 - "Track & Artist Domain Entities" +Cohesion: 0.12 +Nodes (12): Artist, Track and Artist domain entities., Resolve/create an artist bound to a remote ``(source, source_id)`` (lazy, ArtistModel, AsyncSession, UUID, Artist repository — adapter over ``AsyncSession``., Resolve an artist by ``(source, source_id)`` first (re-browse/save dedup (+4 more) + +### Community 21 - "Source Port Protocols" +Cohesion: 0.13 +Nodes (16): FetchableSource, IndexableSource, A registered source of tracks (mounted folder, YouTube, …). ``name`` is the, A source that enumerates files already on disk (e.g. the local folder)., A source that can be searched by free text (e.g. YouTube Music). Returns ``, A source that can download a previously-discovered item to local disk. ``fe, SearchableSource, SourceBackend (+8 more) + +### Community 22 - "User Management Service" +Cohesion: 0.19 +Nodes (24): AuthService, User-management use cases: admin CRUD plus self-service password change. Deleti, UserService, AlreadyExistsError, AuthenticationError, Resource conflicts with an existing one (e.g. duplicate)., Caller could not be authenticated., env() (+16 more) + +### Community 23 - "Metadata Enrichment Value Objects" +Cohesion: 0.14 +Nodes (12): Fingerprint, Value objects for the metadata-enrichment pipeline (plan §6.2). Pure data carri, Chromaprint fingerprint plus the decoded duration (both needed by AcoustID)., A single AcoustID result, flattened to the fields enrichment cares about. `, RecordingMatch, AcoustIdHttpClient, _parse_matches(), _parse_one() (+4 more) + +### Community 24 - "DB Session & Health Checks" +Cohesion: 0.10 +Nodes (24): get_session(), AsyncSession, Request-scoped DB session. Commits on success, rolls back on exception., _check_db(), _check_ml(), _check_redis(), health(), HealthResponse (+16 more) + +### Community 25 - "Download Service Tests" +Cohesion: 0.16 +Nodes (14): DownloadService, FakeArtistRepo, FakeJobRepo, FakeStorage, FakeTrackRepo, Path, UUID, Unit tests for DownloadService — DB-free, in-memory fakes. (+6 more) + +### Community 26 - "Download Job Domain Entity" +Cohesion: 0.13 +Nodes (10): DownloadJob, Download job domain entity (plan §6.1). A queued fetch from an external source,, An unfinished (queued/downloading/enriching) job for the same item, if a, DownloadJobModel, DownloadStatus, Lifecycle of a download job (plan §6.1)., datetime, UUID (+2 more) + +### Community 27 - "Credentials & User Repository" +Cohesion: 0.15 +Nodes (10): Credentials, A user paired with their stored password hash. Stays inside the application, A user paired with their *encrypted* Subsonic app-password. ``password_enc`, SubsonicCredentials, UserModel, AsyncSession, UUID, User repository — adapter over ``AsyncSession`` implementing ``app.domain.ports. (+2 more) + +### Community 28 - "Streaming Auth Dependencies" +Cohesion: 0.10 +Nodes (13): get_current_superuser(), get_current_user(), get_streaming_user(), AuthServiceDep, CurrentUser, Authenticate a stream request. The browser ``