ddbd57070d
Closes #98.
comix.to began answering plain-TLS fetches with a Cloudflare JavaScript
challenge on 2026-08-12, so every poll got a 403 interstitial. Its cover host
`static.comix.to` is gated the same way. comix therefore joins kagane and
novelfull as a browser-backed Site.
## What changed
- **Registry** (`internal/latest/sites.go`): comix gains a `Browser` entry —
`comixRead`, `Done: body != "" && !isInterstitial(body)`, `Fallback: false`.
Skip-when-no-browser falls out of the existing routing; no site-string compare
was added anywhere.
- **Read shape** (`internal/latest/browser.go`): an in-tab `fetch()` of the
Series URL, not a DOM render. comix is an SPA — rendering it costs ~65
requests for the same server-rendered HTML one fetch returns (24.5 KB,
~480 ms measured). `comixSeriesPageURL` pins scheme + host + `/title/<slug>`
and rebuilds the address, so a client-supplied `series_url` cannot aim the
browser anywhere else.
- **Cover bytes**: `comixImageURLRe` pins `https://static.comix.to/<path>.<ext>`;
`BrowserFetcher.Image` now gates on `browserOnlyCoverURL` rather than a
kagane-only regex, so both Sites' image URLs route through the one path.
Bytes come from direct navigation, not a page-context fetch — comix's Series
page sets `cross-origin-embedder-policy: require-corp`, which fails one.
- **Parsers and stored Series identity: untouched.** The in-tab body is the same
server-rendered HTML the existing fixtures were cut from.
## Verification
- `go test ./...` green (needs Docker).
- New seam tests: comix routes to the browser when one is configured, and is
not fetched at all when none is (`TestComixUsesBrowserFetcher`,
`TestComixSkippedWhenNoBrowserFetcher`); URL-pin and cover-gate table tests.
- Live proof against the real browser unit, `TestSmokeComix` (env-gated):
page 24793 bytes in one in-tab fetch, chapter 53, cover accepted by the pin,
26862 bytes of `image/jpg` retrieved.
- Two-axis review run; findings were stale comments on `BrowserFetcher`, `Get`
and the `Fallback` field, fixed in f000cc7.
Docs updated: root `AGENTS.md` (constraint + smoke command, including the note
that this dev machine's ISP DNS-hijacks `comix.to`), `backend/AGENTS.md`
(poller, cover pipeline, `BROWSER_WS_URL`), `REDEPLOY.md` §8 degrade note.
Reviewed-on: #105
Co-authored-by: Sulthan Zaki <sultankiki05@gmail.com>
Co-committed-by: Sulthan Zaki <sultankiki05@gmail.com>
632 lines
23 KiB
JSON
632 lines
23 KiB
JSON
{
|
|
".agents/skills/golang-code-style/evals/evals.json": {
|
|
"mtime": 1784884678.6627614,
|
|
"ast_hash": "bec0e12446e7af3cd05de9b6d42badd8",
|
|
"semantic_hash": "bec0e12446e7af3cd05de9b6d42badd8"
|
|
},
|
|
".agents/skills/golang-error-handling/evals/evals.json": {
|
|
"mtime": 1784884678.6655047,
|
|
"ast_hash": "275d710b774fba1e1d0bc098d3646c6d",
|
|
"semantic_hash": "275d710b774fba1e1d0bc098d3646c6d"
|
|
},
|
|
".agents/skills/golang-performance/evals/evals.json": {
|
|
"mtime": 1784884678.6688662,
|
|
"ast_hash": "4f06df87f90aa0e4f6deaa318b47689f",
|
|
"semantic_hash": "4f06df87f90aa0e4f6deaa318b47689f"
|
|
},
|
|
".agents/skills/golang-testing/evals/evals.json": {
|
|
"mtime": 1784884678.6721346,
|
|
"ast_hash": "60a821bbfd20c6fe8bba996b8b540dd4",
|
|
"semantic_hash": "60a821bbfd20c6fe8bba996b8b540dd4"
|
|
},
|
|
"backend/go.mod": {
|
|
"mtime": 1786216141.668644,
|
|
"ast_hash": "dac242903b0e98c3e4395159d609e08e",
|
|
"semantic_hash": "dac242903b0e98c3e4395159d609e08e"
|
|
},
|
|
"backend/main.go": {
|
|
"mtime": 1786501521.228955,
|
|
"ast_hash": "6e98a3ae91aaa132df251e43c4dfca6d",
|
|
"semantic_hash": "6e98a3ae91aaa132df251e43c4dfca6d"
|
|
},
|
|
"skills-lock.json": {
|
|
"mtime": 1784884678.6842625,
|
|
"ast_hash": "4a94ac85bad6bce330d085bcc0ae3ffd",
|
|
"semantic_hash": "4a94ac85bad6bce330d085bcc0ae3ffd"
|
|
},
|
|
"userscript/manga-bookmark.user.js": {
|
|
"mtime": 1786499529.779988,
|
|
"ast_hash": "1f8bcddd3632d709f058a8401af8f127",
|
|
"semantic_hash": ""
|
|
},
|
|
".agents/skills/find-skills/SKILL.md": {
|
|
"mtime": 1784884338.760326,
|
|
"ast_hash": "62b297abdee9aea84c577ab2e04e1974",
|
|
"semantic_hash": "62b297abdee9aea84c577ab2e04e1974"
|
|
},
|
|
".agents/skills/golang-code-style/SKILL.md": {
|
|
"mtime": 1784884678.6623824,
|
|
"ast_hash": "d6a01e6f64550a5c8d59dac2e948000e",
|
|
"semantic_hash": "d6a01e6f64550a5c8d59dac2e948000e"
|
|
},
|
|
".agents/skills/golang-code-style/references/details.md": {
|
|
"mtime": 1784884678.6627865,
|
|
"ast_hash": "19891e396a986f1b24bf34b7a2854fcb",
|
|
"semantic_hash": "19891e396a986f1b24bf34b7a2854fcb"
|
|
},
|
|
".agents/skills/golang-error-handling/SKILL.md": {
|
|
"mtime": 1784884678.665052,
|
|
"ast_hash": "8b7970f472adb240e5bc4bde863d43a6",
|
|
"semantic_hash": "8b7970f472adb240e5bc4bde863d43a6"
|
|
},
|
|
".agents/skills/golang-error-handling/references/error-creation.md": {
|
|
"mtime": 1784884678.665524,
|
|
"ast_hash": "248dbf75492c68faef2334b8d83bd080",
|
|
"semantic_hash": "248dbf75492c68faef2334b8d83bd080"
|
|
},
|
|
".agents/skills/golang-error-handling/references/error-handling.md": {
|
|
"mtime": 1784884678.6655412,
|
|
"ast_hash": "c2424ee3999b05963b199e0100727aa3",
|
|
"semantic_hash": "c2424ee3999b05963b199e0100727aa3"
|
|
},
|
|
".agents/skills/golang-error-handling/references/error-wrapping.md": {
|
|
"mtime": 1784884678.6655717,
|
|
"ast_hash": "4a15d9266a1ea0c8bb1951e6b9c0f586",
|
|
"semantic_hash": "4a15d9266a1ea0c8bb1951e6b9c0f586"
|
|
},
|
|
".agents/skills/golang-performance/SKILL.md": {
|
|
"mtime": 1784884678.667833,
|
|
"ast_hash": "35a15fd129c5bedaada3fd4df0b6ba8c",
|
|
"semantic_hash": "35a15fd129c5bedaada3fd4df0b6ba8c"
|
|
},
|
|
".agents/skills/golang-performance/assets/prometheus-alerts.yml": {
|
|
"mtime": 1784884678.668527,
|
|
"ast_hash": "fa9357ffa87c4f894fc21afa9707c4db",
|
|
"semantic_hash": "fa9357ffa87c4f894fc21afa9707c4db"
|
|
},
|
|
".agents/skills/golang-performance/references/caching.md": {
|
|
"mtime": 1784884678.6690567,
|
|
"ast_hash": "807c42a82994e5548dbf7eb6e30c71e0",
|
|
"semantic_hash": "807c42a82994e5548dbf7eb6e30c71e0"
|
|
},
|
|
".agents/skills/golang-performance/references/cpu.md": {
|
|
"mtime": 1784884678.669087,
|
|
"ast_hash": "6d52e532ef51a35cc4134694c944517d",
|
|
"semantic_hash": "6d52e532ef51a35cc4134694c944517d"
|
|
},
|
|
".agents/skills/golang-performance/references/io-networking.md": {
|
|
"mtime": 1784884678.6691036,
|
|
"ast_hash": "95c5dd51f728fd69c945a92ff021d766",
|
|
"semantic_hash": "95c5dd51f728fd69c945a92ff021d766"
|
|
},
|
|
".agents/skills/golang-performance/references/memory.md": {
|
|
"mtime": 1784884678.6691158,
|
|
"ast_hash": "3b2108df06b4cfb3980fa80bbd9ebcff",
|
|
"semantic_hash": "3b2108df06b4cfb3980fa80bbd9ebcff"
|
|
},
|
|
".agents/skills/golang-performance/references/observability.md": {
|
|
"mtime": 1784884678.6691446,
|
|
"ast_hash": "0aa8a498e8d55ccdd4990ad187bae828",
|
|
"semantic_hash": "0aa8a498e8d55ccdd4990ad187bae828"
|
|
},
|
|
".agents/skills/golang-performance/references/runtime.md": {
|
|
"mtime": 1784884678.669426,
|
|
"ast_hash": "26386c33b3a3794aaef0556713bf8f3a",
|
|
"semantic_hash": "26386c33b3a3794aaef0556713bf8f3a"
|
|
},
|
|
".agents/skills/golang-testing/SKILL.md": {
|
|
"mtime": 1784884678.6716368,
|
|
"ast_hash": "0a9b9793bba2a239db94e980272a393e",
|
|
"semantic_hash": "0a9b9793bba2a239db94e980272a393e"
|
|
},
|
|
".agents/skills/golang-testing/references/helpers.md": {
|
|
"mtime": 1784884678.6722167,
|
|
"ast_hash": "0aecb7cfbeb9b374bf61c52e324d9d3f",
|
|
"semantic_hash": "0aecb7cfbeb9b374bf61c52e324d9d3f"
|
|
},
|
|
".agents/skills/golang-testing/references/http-testing.md": {
|
|
"mtime": 1784884678.67225,
|
|
"ast_hash": "9111110c28a7fbbffc3537aad786b390",
|
|
"semantic_hash": "9111110c28a7fbbffc3537aad786b390"
|
|
},
|
|
".agents/skills/golang-testing/references/integration-testing.md": {
|
|
"mtime": 1784884678.67225,
|
|
"ast_hash": "fcf9861bc36ae56e3fb7a1c18aa0e77f",
|
|
"semantic_hash": "fcf9861bc36ae56e3fb7a1c18aa0e77f"
|
|
},
|
|
".agents/skills/golang-testing/references/mocking.md": {
|
|
"mtime": 1784884678.6722653,
|
|
"ast_hash": "3a08979e4603aae5c32a58d5b6c39765",
|
|
"semantic_hash": "3a08979e4603aae5c32a58d5b6c39765"
|
|
},
|
|
"CLAUDE.md": {
|
|
"mtime": 1786856633.445473,
|
|
"ast_hash": "fab288c23be960d9c6afbfe3f21ff41c",
|
|
"semantic_hash": ""
|
|
},
|
|
"DEPLOY.md": {
|
|
"mtime": 1786501942.7367291,
|
|
"ast_hash": "3c7b785c44badb6dda6234d2b39a9290",
|
|
"semantic_hash": ""
|
|
},
|
|
"README.md": {
|
|
"mtime": 1786499529.7651505,
|
|
"ast_hash": "9d6be8aa8a2946c23ad48d8f2864b5ca",
|
|
"semantic_hash": ""
|
|
},
|
|
"docker-compose.prod.yml": {
|
|
"mtime": 1786292465.8305523,
|
|
"ast_hash": "0751998a532297b8ac507a01ec48dc31",
|
|
"semantic_hash": "0751998a532297b8ac507a01ec48dc31"
|
|
},
|
|
"docker-compose.yml": {
|
|
"mtime": 1786499529.7725692,
|
|
"ast_hash": "124fd581bf0a662ff15012abfdb40a92",
|
|
"semantic_hash": ""
|
|
},
|
|
".claude/settings.json": {
|
|
"mtime": 1784951973.1869545,
|
|
"ast_hash": "e51077b6a7f1f67afc748f1a32a1557d",
|
|
"semantic_hash": "e51077b6a7f1f67afc748f1a32a1557d"
|
|
},
|
|
"backend/web_test.go": {
|
|
"mtime": 1786216141.700644,
|
|
"ast_hash": "8f1b093b59eb1ed81bc7fc0c22495c50",
|
|
"semantic_hash": "8f1b093b59eb1ed81bc7fc0c22495c50"
|
|
},
|
|
"backend/main_test.go": {
|
|
"mtime": 1786501521.228955,
|
|
"ast_hash": "8a165955cf28ad47481fec5ea7afb3d6",
|
|
"semantic_hash": "8a165955cf28ad47481fec5ea7afb3d6"
|
|
},
|
|
".claude/settings.local.json": {
|
|
"mtime": 1785697645.350201,
|
|
"ast_hash": "9a1ac6369f968e8df4be9dcff0948f70",
|
|
"semantic_hash": "9a1ac6369f968e8df4be9dcff0948f70"
|
|
},
|
|
"PRODUCT.md": {
|
|
"mtime": 1786216141.660644,
|
|
"ast_hash": "c52072d1978286060087fa0686f9c7f9",
|
|
"semantic_hash": "c52072d1978286060087fa0686f9c7f9"
|
|
},
|
|
"backend/.impeccable/critique/2026-07-26T15-50-42Z__backend-templates-app-html.md": {
|
|
"mtime": 1785128576.2412457,
|
|
"ast_hash": "d08627c27f22d453125db6c1ab4b71ec",
|
|
"semantic_hash": "d08627c27f22d453125db6c1ab4b71ec"
|
|
},
|
|
"backend/.impeccable/critique/2026-07-26T17-08-41Z__backend-templates-app-html.md": {
|
|
"mtime": 1785128576.2452524,
|
|
"ast_hash": "e69a8340a371579ca3ea689660f7d7bd",
|
|
"semantic_hash": "e69a8340a371579ca3ea689660f7d7bd"
|
|
},
|
|
"AGENTS.md": {
|
|
"mtime": 1786856633.445473,
|
|
"ast_hash": "fab288c23be960d9c6afbfe3f21ff41c",
|
|
"semantic_hash": ""
|
|
},
|
|
"userscript/test/logic.test.js": {
|
|
"mtime": 1786499529.779988,
|
|
"ast_hash": "80d512bfe6fa8b847f3ba6169c321a74",
|
|
"semantic_hash": ""
|
|
},
|
|
".claude/skills/testing-the-userscript/SKILL.md": {
|
|
"mtime": 1786363889.5489495,
|
|
"ast_hash": "8f3c0132eb4787a2c8736eb99f7689af",
|
|
"semantic_hash": "8f3c0132eb4787a2c8736eb99f7689af"
|
|
},
|
|
"REDEPLOY.md": {
|
|
"mtime": 1786856643.0770833,
|
|
"ast_hash": "e5e910f0244a040e2ccdc669b17eb4db",
|
|
"semantic_hash": ""
|
|
},
|
|
"docs/design-system.md": {
|
|
"mtime": 1786022513.9623306,
|
|
"ast_hash": "421cd7e57f02d4b467f120ca6ddd7b6a",
|
|
"semantic_hash": "421cd7e57f02d4b467f120ca6ddd7b6a"
|
|
},
|
|
"backend/api_test.go": {
|
|
"mtime": 1786499529.7651505,
|
|
"ast_hash": "8e4b9293bc2e45ee3f42027315594fd5",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/cover_test.go": {
|
|
"mtime": 1786363889.552731,
|
|
"ast_hash": "c7e313d6c92eb28e6d370e5e89035984",
|
|
"semantic_hash": "c7e313d6c92eb28e6d370e5e89035984"
|
|
},
|
|
"backend/internal/api/handlers.go": {
|
|
"mtime": 1786363889.552731,
|
|
"ast_hash": "59e6b8767ab19839bb8f82891a7e4616",
|
|
"semantic_hash": "59e6b8767ab19839bb8f82891a7e4616"
|
|
},
|
|
"backend/internal/httpmw/middleware.go": {
|
|
"mtime": 1786216141.672644,
|
|
"ast_hash": "385b36f58488b7e6d93eb6d6034e9ee3",
|
|
"semantic_hash": "385b36f58488b7e6d93eb6d6034e9ee3"
|
|
},
|
|
"backend/internal/latest/browser.go": {
|
|
"mtime": 1786856879.3397639,
|
|
"ast_hash": "fbdba4bb56d8c804087bcb6e141e52ad",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/browser_test.go": {
|
|
"mtime": 1786856254.36163,
|
|
"ast_hash": "800fa6aa471ada054a3c48943ad17ab7",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/fetch.go": {
|
|
"mtime": 1786499529.7688599,
|
|
"ast_hash": "3e20ad86aa46783e9aa95c2b746551ee",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/poller.go": {
|
|
"mtime": 1786856670.129715,
|
|
"ast_hash": "6b7060ff52994729832d9fcc3cc97dad",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/poller_test.go": {
|
|
"mtime": 1786856311.8535168,
|
|
"ast_hash": "b6837fab377c94fa1d2f20a931975a4a",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/sites.go": {
|
|
"mtime": 1786856865.4529688,
|
|
"ast_hash": "2f00456ac9d1d8148ba1bc6cbceb24f6",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/sites_test.go": {
|
|
"mtime": 1786856890.1231265,
|
|
"ast_hash": "0db2028a6073f342fee61ad15c2e5f0f",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/smoke_image_test.go": {
|
|
"mtime": 1786363889.5602942,
|
|
"ast_hash": "db068cb59575f8c82669acbaf84bcaed",
|
|
"semantic_hash": "db068cb59575f8c82669acbaf84bcaed"
|
|
},
|
|
"backend/internal/pgtest/pgtest.go": {
|
|
"mtime": 1786216141.6766438,
|
|
"ast_hash": "f60372d41516e66f7aaeb272da227d6e",
|
|
"semantic_hash": "f60372d41516e66f7aaeb272da227d6e"
|
|
},
|
|
"backend/internal/session/session.go": {
|
|
"mtime": 1786216141.6766438,
|
|
"ast_hash": "9952474ffb22c825d6f075b866ee26f4",
|
|
"semantic_hash": "9952474ffb22c825d6f075b866ee26f4"
|
|
},
|
|
"backend/internal/session/session_test.go": {
|
|
"mtime": 1786216141.680644,
|
|
"ast_hash": "37ffd00964e7a67350c68ed50c6503c5",
|
|
"semantic_hash": "37ffd00964e7a67350c68ed50c6503c5"
|
|
},
|
|
"backend/internal/store/migrations/0001_bookmarks.sql": {
|
|
"mtime": 1786216141.680644,
|
|
"ast_hash": "f87ccfb2c25c43f93021177ced0bfae4",
|
|
"semantic_hash": "f87ccfb2c25c43f93021177ced0bfae4"
|
|
},
|
|
"backend/internal/store/migrations/0002_series.sql": {
|
|
"mtime": 1786216141.6820722,
|
|
"ast_hash": "5dc98771e0c0f6e8416b434c280b0efb",
|
|
"semantic_hash": "5dc98771e0c0f6e8416b434c280b0efb"
|
|
},
|
|
"backend/internal/store/migrations/0003_reader.sql": {
|
|
"mtime": 1786216141.6820722,
|
|
"ast_hash": "444a97799f38f6222f87d4e9fb2d6258",
|
|
"semantic_hash": "444a97799f38f6222f87d4e9fb2d6258"
|
|
},
|
|
"backend/internal/store/migrations/0004_owner_bookmarks.sql": {
|
|
"mtime": 1786216141.684644,
|
|
"ast_hash": "e4fa900cc223865d3ecd4c60c5707a65",
|
|
"semantic_hash": "e4fa900cc223865d3ecd4c60c5707a65"
|
|
},
|
|
"backend/internal/store/migrations/0005_sessions.sql": {
|
|
"mtime": 1786216141.684644,
|
|
"ast_hash": "5158887ebc57cf8c16a7b821b61cd760",
|
|
"semantic_hash": "5158887ebc57cf8c16a7b821b61cd760"
|
|
},
|
|
"backend/internal/store/migrations/0006_reader_token_epoch.sql": {
|
|
"mtime": 1786216141.684644,
|
|
"ast_hash": "3093cc1c3aae0cd9643d04105d045402",
|
|
"semantic_hash": "3093cc1c3aae0cd9643d04105d045402"
|
|
},
|
|
"backend/internal/store/sessions.go": {
|
|
"mtime": 1786216141.684644,
|
|
"ast_hash": "eee3510cc6172ef4b1da820474c26b01",
|
|
"semantic_hash": "eee3510cc6172ef4b1da820474c26b01"
|
|
},
|
|
"backend/internal/store/sessions_test.go": {
|
|
"mtime": 1786216141.684644,
|
|
"ast_hash": "0b6764a0ee20f5cb7748eecd31a1d220",
|
|
"semantic_hash": "0b6764a0ee20f5cb7748eecd31a1d220"
|
|
},
|
|
"backend/internal/store/store.go": {
|
|
"mtime": 1786363889.5602942,
|
|
"ast_hash": "54367a8ab043983e2491b2eb2650961c",
|
|
"semantic_hash": "54367a8ab043983e2491b2eb2650961c"
|
|
},
|
|
"backend/internal/store/store_test.go": {
|
|
"mtime": 1786363889.5602942,
|
|
"ast_hash": "dc823fd77bcce2268114e31d759b20a5",
|
|
"semantic_hash": "dc823fd77bcce2268114e31d759b20a5"
|
|
},
|
|
"backend/internal/userscript/userscript.go": {
|
|
"mtime": 1786216141.692644,
|
|
"ast_hash": "aa13a71b1c9eefe4930fd31f27722328",
|
|
"semantic_hash": "aa13a71b1c9eefe4930fd31f27722328"
|
|
},
|
|
"backend/internal/userscript/userscript_test.go": {
|
|
"mtime": 1786216141.692644,
|
|
"ast_hash": "6c050968d7b8b67956da1a3136d2c3c7",
|
|
"semantic_hash": "6c050968d7b8b67956da1a3136d2c3c7"
|
|
},
|
|
"backend/internal/web/discord.go": {
|
|
"mtime": 1786216141.692644,
|
|
"ast_hash": "69e4959c65fa67d7491aedf6a71bb575",
|
|
"semantic_hash": "69e4959c65fa67d7491aedf6a71bb575"
|
|
},
|
|
"backend/internal/web/oauth_test.go": {
|
|
"mtime": 1786216141.692644,
|
|
"ast_hash": "a3bddeb70dd8d7eb14139da808723ea8",
|
|
"semantic_hash": "a3bddeb70dd8d7eb14139da808723ea8"
|
|
},
|
|
"backend/internal/web/static/filter.js": {
|
|
"mtime": 1786022513.9473197,
|
|
"ast_hash": "b4ee3306201bfd88b148b96801972617",
|
|
"semantic_hash": "b4ee3306201bfd88b148b96801972617"
|
|
},
|
|
"backend/internal/web/static/htmx.min.js": {
|
|
"mtime": 1785873769.5512016,
|
|
"ast_hash": "19a573773be4ca22570ca2f8543120c5",
|
|
"semantic_hash": "19a573773be4ca22570ca2f8543120c5"
|
|
},
|
|
"backend/internal/web/web.go": {
|
|
"mtime": 1786363889.5678573,
|
|
"ast_hash": "8308949c658d3a08ce1c3cdbea6a907c",
|
|
"semantic_hash": "8308949c658d3a08ce1c3cdbea6a907c"
|
|
},
|
|
"backend/reader_credential_test.go": {
|
|
"mtime": 1786216141.700644,
|
|
"ast_hash": "2a751ea6d9c06635aa3179db0aef1b2b",
|
|
"semantic_hash": "2a751ea6d9c06635aa3179db0aef1b2b"
|
|
},
|
|
"chrome/entrypoint.sh": {
|
|
"mtime": 1786363889.5678573,
|
|
"ast_hash": "8008a187690764436540fab47ba0cfcc",
|
|
"semantic_hash": "8008a187690764436540fab47ba0cfcc"
|
|
},
|
|
"userscript/novel-bookmark.user.js": {
|
|
"mtime": 1786499529.779988,
|
|
"ast_hash": "834effb0821f8d6c9f57f6554a5db462",
|
|
"semantic_hash": ""
|
|
},
|
|
"userscript/test/novel-logic.test.js": {
|
|
"mtime": 1786499529.779988,
|
|
"ast_hash": "b25a7377af210dd0aff8284501fd0252",
|
|
"semantic_hash": ""
|
|
},
|
|
".opencode/agent/implementer.md": {
|
|
"mtime": 1785873769.5402634,
|
|
"ast_hash": "000de469c18d68352027e10c8ce8acfb",
|
|
"semantic_hash": "000de469c18d68352027e10c8ce8acfb"
|
|
},
|
|
".opencode/agent/reviewer.md": {
|
|
"mtime": 1785873769.5416775,
|
|
"ast_hash": "e44a2f6f624db044e19508bc5ab05592",
|
|
"semantic_hash": "e44a2f6f624db044e19508bc5ab05592"
|
|
},
|
|
"CONTEXT.md": {
|
|
"mtime": 1786855457.9327722,
|
|
"ast_hash": "24548f60414b4c5ff58538acaada5345",
|
|
"semantic_hash": ""
|
|
},
|
|
"CUTOVER.md": {
|
|
"mtime": 1786216141.660644,
|
|
"ast_hash": "6c6f3e4c4c2f57867894280bce728c50",
|
|
"semantic_hash": "6c6f3e4c4c2f57867894280bce728c50"
|
|
},
|
|
"backend/AGENTS.md": {
|
|
"mtime": 1786856656.6826186,
|
|
"ast_hash": "d5610ba24076b57e17b9d76241acaa65",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/CLAUDE.md": {
|
|
"mtime": 1786856656.6826186,
|
|
"ast_hash": "d5610ba24076b57e17b9d76241acaa65",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/web/templates/app.html": {
|
|
"mtime": 1786216141.692644,
|
|
"ast_hash": "3965e20e204afb71ba2a3aa86cb7c61c",
|
|
"semantic_hash": "3965e20e204afb71ba2a3aa86cb7c61c"
|
|
},
|
|
"backend/internal/web/templates/card.html": {
|
|
"mtime": 1786363889.5678573,
|
|
"ast_hash": "ab83ae0dbb34fd40c146a7cc1263173e",
|
|
"semantic_hash": "ab83ae0dbb34fd40c146a7cc1263173e"
|
|
},
|
|
"backend/internal/web/templates/chrome.html": {
|
|
"mtime": 1786363889.5678573,
|
|
"ast_hash": "d80b27cf3bd9d131075c485dd169dfcc",
|
|
"semantic_hash": "d80b27cf3bd9d131075c485dd169dfcc"
|
|
},
|
|
"backend/internal/web/templates/icons.html": {
|
|
"mtime": 1785873769.553139,
|
|
"ast_hash": "8e10c507c32934a92463b4bca9e34fe6",
|
|
"semantic_hash": "8e10c507c32934a92463b4bca9e34fe6"
|
|
},
|
|
"backend/internal/web/templates/list.html": {
|
|
"mtime": 1786216141.696644,
|
|
"ast_hash": "365548aace8c06559a1f66db0ae47256",
|
|
"semantic_hash": "365548aace8c06559a1f66db0ae47256"
|
|
},
|
|
"backend/internal/web/templates/login.html": {
|
|
"mtime": 1786216141.696644,
|
|
"ast_hash": "bcc3101498a66cf8b79f9d97c6c9cd6b",
|
|
"semantic_hash": "bcc3101498a66cf8b79f9d97c6c9cd6b"
|
|
},
|
|
"backend/internal/web/templates/readers.html": {
|
|
"mtime": 1786216141.696644,
|
|
"ast_hash": "c5034e76bd20a705d2799cb5ecb328f0",
|
|
"semantic_hash": "c5034e76bd20a705d2799cb5ecb328f0"
|
|
},
|
|
"backend/internal/web/templates/setup.html": {
|
|
"mtime": 1786216141.696644,
|
|
"ast_hash": "72e93c0b827414063596f7338987d879",
|
|
"semantic_hash": "72e93c0b827414063596f7338987d879"
|
|
},
|
|
"docs/adr/0001-postgresql-over-sqlite.md": {
|
|
"mtime": 1786216141.704644,
|
|
"ast_hash": "abfb08754cee58be67311377904f8ca4",
|
|
"semantic_hash": "abfb08754cee58be67311377904f8ca4"
|
|
},
|
|
"docs/adr/0002-discord-oauth-no-passwords-no-email.md": {
|
|
"mtime": 1786216141.7071996,
|
|
"ast_hash": "852a04d86659385085da6ffc8b489933",
|
|
"semantic_hash": "852a04d86659385085da6ffc8b489933"
|
|
},
|
|
"docs/adr/0003-series-shared-and-poll-owned.md": {
|
|
"mtime": 1786501942.7367291,
|
|
"ast_hash": "6138b113340693e0cc667d1ecbb75f72",
|
|
"semantic_hash": ""
|
|
},
|
|
"docs/adr/0004-wire-format-does-not-mirror-the-schema.md": {
|
|
"mtime": 1786216141.7071996,
|
|
"ast_hash": "a6ea2770dec2156f78a65b35ba06902a",
|
|
"semantic_hash": "a6ea2770dec2156f78a65b35ba06902a"
|
|
},
|
|
"docs/agents/domain.md": {
|
|
"mtime": 1786216141.7071996,
|
|
"ast_hash": "6f99318ac6cb9825b613bfde55d76091",
|
|
"semantic_hash": "6f99318ac6cb9825b613bfde55d76091"
|
|
},
|
|
"docs/agents/issue-tracker.md": {
|
|
"mtime": 1786216141.7087462,
|
|
"ast_hash": "1342e66ccb84a84fd579fb6dc0b8243a",
|
|
"semantic_hash": "1342e66ccb84a84fd579fb6dc0b8243a"
|
|
},
|
|
"docs/agents/triage-labels.md": {
|
|
"mtime": 1786216141.7087462,
|
|
"ast_hash": "69114d07ed792d6bb1d13758ba5435e1",
|
|
"semantic_hash": "69114d07ed792d6bb1d13758ba5435e1"
|
|
},
|
|
"userscript/AGENTS.md": {
|
|
"mtime": 1786499529.7762787,
|
|
"ast_hash": "e276ffe9a6e7b55fd3235466a1995c22",
|
|
"semantic_hash": ""
|
|
},
|
|
"userscript/CLAUDE.md": {
|
|
"mtime": 1786499529.7762787,
|
|
"ast_hash": "e276ffe9a6e7b55fd3235466a1995c22",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/web/static/login-art.png": {
|
|
"mtime": 1786022513.9585779,
|
|
"ast_hash": "05d7863cba344a946256719a0c9ef959",
|
|
"semantic_hash": "05d7863cba344a946256719a0c9ef959"
|
|
},
|
|
"backend/internal/web/static/logo.svg": {
|
|
"mtime": 1786022513.9585779,
|
|
"ast_hash": "d0d34d0f08a25b53176cc55989b7babe",
|
|
"semantic_hash": "d0d34d0f08a25b53176cc55989b7babe"
|
|
},
|
|
"backend/internal/store/migrations/0007_covers.sql": {
|
|
"mtime": 1786262323.6964688,
|
|
"ast_hash": "6033ce0701be1236ed175362363bd96c",
|
|
"semantic_hash": "6033ce0701be1236ed175362363bd96c"
|
|
},
|
|
"docs/adr/0005-on-demand-browser.md": {
|
|
"mtime": 1786292465.8305523,
|
|
"ast_hash": "8cf2fb8c0a66c2c7d82ae433b99ca42b",
|
|
"semantic_hash": "8cf2fb8c0a66c2c7d82ae433b99ca42b"
|
|
},
|
|
"chrome/docker-compose.yml": {
|
|
"mtime": 1786292465.8305523,
|
|
"ast_hash": "5605599395a3f085904e78a2bfec1e58",
|
|
"semantic_hash": "5605599395a3f085904e78a2bfec1e58"
|
|
},
|
|
"docs/adr/0006-browser-on-the-home-machine.md": {
|
|
"mtime": 1786501942.7367291,
|
|
"ast_hash": "bfcaf39b6c7e96610a7caa00eeb36533",
|
|
"semantic_hash": ""
|
|
},
|
|
"docs/adr/0007-backend-hosts-cover-bytes.md": {
|
|
"mtime": 1786292465.8305523,
|
|
"ast_hash": "b19e38045b3dcda7dd59634ed9227a68",
|
|
"semantic_hash": "b19e38045b3dcda7dd59634ed9227a68"
|
|
},
|
|
"backend/internal/store/migrations/0008_filesystem_covers.sql": {
|
|
"mtime": 1786363889.5602942,
|
|
"ast_hash": "46cf7822d4f667e3cab36b547abe5e97",
|
|
"semantic_hash": "46cf7822d4f667e3cab36b547abe5e97"
|
|
},
|
|
"backend/internal/latest/cover.go": {
|
|
"mtime": 1786856664.2957466,
|
|
"ast_hash": "d5f2248c3d11de74bf5a3977651b17c2",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/cover_fetch_test.go": {
|
|
"mtime": 1786363889.5565126,
|
|
"ast_hash": "60d9eb7c59a3751baf4f31c7655217e7",
|
|
"semantic_hash": "60d9eb7c59a3751baf4f31c7655217e7"
|
|
},
|
|
"backend/internal/latest/acquire.go": {
|
|
"mtime": 1786499529.7688599,
|
|
"ast_hash": "6c1ad34bbe9f5b49d0fd1eae9093f55d",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/acquire_test.go": {
|
|
"mtime": 1786363889.5565126,
|
|
"ast_hash": "7bd9f41814f6bf59d8998dfb81cf990a",
|
|
"semantic_hash": "7bd9f41814f6bf59d8998dfb81cf990a"
|
|
},
|
|
"backend/internal/store/migrations/0009_series_cover_address.sql": {
|
|
"mtime": 1786363889.5602942,
|
|
"ast_hash": "4c1f6328b2e1a95828fad6d88d474c2d",
|
|
"semantic_hash": "4c1f6328b2e1a95828fad6d88d474c2d"
|
|
},
|
|
".claude/skills/implement-tickets/SKILL.md": {
|
|
"mtime": 1786417841.7117643,
|
|
"ast_hash": "3060e32e19cc571d91871a98f18afe53",
|
|
"semantic_hash": "3060e32e19cc571d91871a98f18afe53"
|
|
},
|
|
".omp/agents/ticket-implementer.md": {
|
|
"mtime": 1786417841.7163916,
|
|
"ast_hash": "0150a46c0d21c572b71b3d87d21ac925",
|
|
"semantic_hash": "0150a46c0d21c572b71b3d87d21ac925"
|
|
},
|
|
"docs/adr/0008-series-identity-is-discovered-not-derived.md": {
|
|
"mtime": 1786417841.7163916,
|
|
"ast_hash": "3ce6d64ef6a8a39f27c257b39065389e",
|
|
"semantic_hash": "3ce6d64ef6a8a39f27c257b39065389e"
|
|
},
|
|
"docs/research/lightnovelworld-chapter-vs-series-slug.md": {
|
|
"mtime": 1786417841.7163916,
|
|
"ast_hash": "74a4e538875f0a7e8ca3d5dc48c0bb53",
|
|
"semantic_hash": "74a4e538875f0a7e8ca3d5dc48c0bb53"
|
|
},
|
|
"backend/internal/latest/smoke_lnw_test.go": {
|
|
"mtime": 1786499529.7725692,
|
|
"ast_hash": "2d65da8a081759172918fdf159760f45",
|
|
"semantic_hash": ""
|
|
},
|
|
"docs/adr/0009-a-site-answers-questions-its-own-way.md": {
|
|
"mtime": 1786499529.7725692,
|
|
"ast_hash": "8039012a5b6de2359ff1a47079f51b66",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/read.go": {
|
|
"mtime": 1786499529.7688599,
|
|
"ast_hash": "3cf29046ddaef39fafb1df70b9f9ae8c",
|
|
"semantic_hash": ""
|
|
},
|
|
"docs/research/cloudflare-bot-scoring-and-poll-cadence.md": {
|
|
"mtime": 1786501942.7367291,
|
|
"ast_hash": "1aa17575ab20f2f36583602999a6a60f",
|
|
"semantic_hash": ""
|
|
},
|
|
"backend/internal/latest/smoke_comix_test.go": {
|
|
"mtime": 1786856356.3432186,
|
|
"ast_hash": "111fdbb75fc68ac2ab1013bc916063cf",
|
|
"semantic_hash": ""
|
|
}
|
|
} |