aboutsummaryrefslogtreecommitdiffstats
path: root/.thicket
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-16 15:36:49 -0800
committerGitHub <noreply@github.com>2026-02-16 15:36:49 -0800
commitc538ccd5cd1d6960c894a2969ee49317009dc9ed (patch)
tree1d1b1295f3d63df85fffadaa1159414c74399c6c /.thicket
parentfeea1a814a212efd9b14b8f05e84104ace3c473a (diff)
parent80d132b1714aaa281a6532ff66892bfdb7d2c5c2 (diff)
downloadneko-c538ccd5cd1d6960c894a2969ee49317009dc9ed.tar.gz
neko-c538ccd5cd1d6960c894a2969ee49317009dc9ed.tar.bz2
neko-c538ccd5cd1d6960c894a2969ee49317009dc9ed.zip
Merge pull request #7 from adammathes/claude/thicket-ready-crank-RmQuI
More crank pulls from claude
Diffstat (limited to '.thicket')
-rw-r--r--.thicket/tickets.jsonl12
1 files changed, 8 insertions, 4 deletions
diff --git a/.thicket/tickets.jsonl b/.thicket/tickets.jsonl
index e7690e5..3e2d7fa 100644
--- a/.thicket/tickets.jsonl
+++ b/.thicket/tickets.jsonl
@@ -36,7 +36,7 @@
{"id":"NK-8rhpp3","title":"v2 frontend: when selected, don't change style of feed items","description":"Just leave them the same when j/k \"selects\" an item. No blue side thing, no change in background, it's distracting. Just scroll it to the right place.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T00:39:50.01934312Z","updated":"2026-02-14T01:02:54.204739756Z"}
{"id":"NK-8s75ec","title":"page size and performance","description":"Do some analysis of page size (css/html/javascript) on the legacy version vs. new version and give me a report. We want it to be small and fast! If the new version is much worse file some tickets to investigate further.","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T20:16:13.898081788Z","updated":"2026-02-13T21:50:12.004391671Z"}
{"id":"NK-8u3uo3","title":"Add configurable username support","description":"Currently login accepts a username field but ignores it. We should allow configuring a username (defaulting to 'neko') and validate it during login.","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-15T05:16:55.257993616Z","updated":"2026-02-15T05:16:55.257993616Z"}
-{"id":"NK-967mx5","title":"Add configurable scroll-to-read delay/debounce","description":"Currently items are marked as read immediately when fully visible. Consider adding a short delay (e.g. 500ms) so fast scrolling doesn't mark items as read. This would be a UX enhancement building on NK-s2g59a.","type":"feature","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-16T19:09:49.041731485Z","updated":"2026-02-16T19:09:49.041731485Z"}
+{"id":"NK-967mx5","title":"Add configurable scroll-to-read delay/debounce","description":"Currently items are marked as read immediately when fully visible. Consider adding a short delay (e.g. 500ms) so fast scrolling doesn't mark items as read. This would be a UX enhancement building on NK-s2g59a.","type":"","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-16T19:09:49.041731485Z","updated":"2026-02-16T23:27:09.944951714Z"}
{"id":"NK-9hx0y7","title":"Implement Frontend Login","description":"Create login page and auth logic in the new React frontend. Port functionality from legacy login.html.","type":"","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:44:01.546395342Z","updated":"2026-02-13T05:50:33.877452063Z"}
{"id":"NK-9pgjph","title":"v2 ui - font size 18px","description":"Compare your font sizes with the legacy version -- I think they're a little too small (16 vs 18 baseline)","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T03:21:48.453217898Z","updated":"2026-02-14T03:24:25.316927886Z"}
{"id":"NK-9vquj9","title":"v3 login","description":"Login still doesn't work right -- i'm assuming the CSRF stuff is still wrong","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-16T16:24:06.315635122Z","updated":"2026-02-16T16:50:26.432014927Z"}
@@ -65,6 +65,7 @@
{"id":"NK-ed1iah","title":"Make feed crawling async in API","description":"Currently, POST /api/feed triggers an immediate crawl which blocks the response (or at least keeps the goroutine alive). Refactor the crawling architecture to be truly async with a job queue or status updates, improving API responsiveness and reliability.","type":"cleanup","status":"icebox","priority":4,"labels":null,"assignee":"","created":"2026-02-13T04:26:55.908243985Z","updated":"2026-02-13T04:26:55.908243985Z"}
{"id":"NK-edahin","title":"v3: cut \"FILTERS\" text","description":"there's no header needed above unread/read/starred, just cut that please","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-16T15:48:13.470233363Z","updated":"2026-02-16T16:21:21.828382936Z"}
{"id":"NK-ek0cox","title":"Implement Item Interactions","description":"Add ability to toggle read/unread and star/unstar status for items. Use PUT /item/:id","type":"","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T14:55:14.825454967Z","updated":"2026-02-13T14:58:18.307521003Z"}
+{"id":"NK-ekxfvv","title":"Seed full_content in benchmarks to measure real payload savings","description":"The stream benchmark seeds items without full_content, so B/op doesn't reflect the real-world improvement from excluding full_content. Add seeded full_content to benchmark items so we can quantify the actual memory/payload savings.","type":"task","status":"open","priority":4,"labels":null,"assignee":"","created":"2026-02-16T23:03:28.808266923Z","updated":"2026-02-16T23:03:28.808266923Z"}
{"id":"NK-eqduq1","title":"run the performance test suite and provide some benchmarks","description":"Create a document in DOCS after running the perf test suite with findings and potential improvements.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-16T19:48:08.40974488Z","updated":"2026-02-16T22:05:48.66181541Z"}
{"id":"NK-exyau3","title":"check coverage again","description":"check test coverage again and see if more tests are needed","type":"task","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-15T00:07:39.320521992Z","updated":"2026-02-15T05:31:22.48357749Z"}
{"id":"NK-f64ocp","title":"Refactor routing logic for consistent settings exit","description":"Instead of checking 'if currentRoute.path == /settings' in every click handler, maybe centralize this logic in the router or a helper function to ensure consistent behavior when navigating away from settings.","type":"cleanup","status":"open","priority":4,"labels":null,"assignee":"","created":"2026-02-16T16:17:36.299928698Z","updated":"2026-02-16T16:17:36.299928698Z"}
@@ -80,7 +81,7 @@
{"id":"NK-gdf99z","title":"TUI is terrible and needs fixing","description":"The TUI doesn't really work and doesn't make sense. Think very hard and look at the v2 HTML UI implementation and make something cool like that. Probably needs tests too.","type":"epic","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T03:51:59.882212859Z","updated":"2026-02-14T04:31:28.290051717Z"}
{"id":"NK-gfh33y","title":"[security] Implement CSRF Protection for API","description":"Add CSRF protection to all state-changing API endpoints. 1. Implement a middleware that generates a CSRF token and sets it in a cookie (readable by JS) or header. 2. Update the AuthWrap middleware to validate the presence of this token in the X-CSRF-Token header for all unsafe methods (POST, PUT, DELETE). 3. Update the React frontend to read the token and include it in all API requests.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T16:35:56.341543505Z","updated":"2026-02-14T17:08:53.079904915Z"}
{"id":"NK-ghpdkr","title":"Add coverage check to 'make check'","description":"Add a code coverage check to the 'make check' workflow, ensuring it doesn't significantly slow down execution. This replaces ad-hoc coverage checks.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T16:27:42.348183236Z","updated":"2026-02-15T17:26:33.764005669Z"}
-{"id":"NK-gjj92c","title":"Add tablet breakpoint CSS for sidebar (1024px)","description":"The sidebar cookie persistence uses 1024px as the tablet/mobile threshold for default-closed behavior, but the CSS media queries still use 768px for mobile sidebar styles. Consider adding a tablet breakpoint at 1024px for intermediate layout behavior.","type":"task","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-16T22:08:13.765775664Z","updated":"2026-02-16T22:08:13.765775664Z"}
+{"id":"NK-gjj92c","title":"Add tablet breakpoint CSS for sidebar (1024px)","description":"The sidebar cookie persistence uses 1024px as the tablet/mobile threshold for default-closed behavior, but the CSS media queries still use 768px for mobile sidebar styles. Consider adding a tablet breakpoint at 1024px for intermediate layout behavior.","type":"","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-16T22:08:13.765775664Z","updated":"2026-02-16T23:28:34.541451654Z"}
{"id":"NK-gjymiw","title":"FEEDS in sidebar needs to be more clearly a collapsible thing","description":"FEEDS in the sidebar needs a caret (\u003e that turns to V) or something similar to make it clear it's a toggle collapsible list thing","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T23:54:20.355824171Z","updated":"2026-02-15T00:06:02.456524674Z"}
{"id":"NK-gnxc6e","title":"Feed list collapsed by default","description":"The list of feeds on the left side should be collapsed by default, with a little control to extend it.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:58:15.661695308Z","updated":"2026-02-14T01:29:12.82081713Z"}
{"id":"NK-gqkh96","title":"Remaining test coverage gaps","description":"Cross-package test coverage is at 81.2%. The remaining untested functions are: GetFullContent (goose HTTP extraction), indexHandler/serveBoxedFile (rice.MustFindBox), Serve (starts HTTP server), main, util.init. To reach 90%, consider: (1) refactoring GetFullContent to accept an interface for HTTP fetching, (2) refactoring Serve to extract route setup into a testable function, (3) mocking rice.MustFindBox, (4) using feeds from https://trenchant.org/feeds.txt as static test fixtures for integration tests.","type":"cleanup","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T03:54:30.298141982Z","updated":"2026-02-14T02:44:05.399097286Z"}
@@ -102,7 +103,7 @@
{"id":"NK-k1p9ij","title":"Evaluate E2E test harness","description":"Evaluate the current E2E test harness (Cleaning up test environment...\nCleanup complete.\nBuilding backend...\nCreating data directory...\nStarting mock feed server on port 9090...\nMock Server PID: 166494\nMock server is up.\nStarting backend on port 4994...\nBackend PID: 166520\nWaiting for backend to start...\nWaiting...\nBackend is up!\nRunning E2E tests...\n\n\u003e frontend@0.0.0 test:e2e\n\u003e playwright test\n\n\nRunning 13 tests using 1 worker\n\n\u001b[1A\u001b[2K[1/13] [chromium] › tests/auth.spec.ts:12:5 › Authentication - No Password Required › should allow direct access to dashboard without login\n\u001b[1A\u001b[2K[2/13] [chromium] › tests/auth.spec.ts:25:5 › Authentication - No Password Required › should allow login with empty password\n\u001b[1A\u001b[2K[3/13] [chromium] › tests/auth.spec.ts:38:5 › Authentication - No Password Required › should report authenticated status via API when no password\n\u001b[1A\u001b[2K[4/13] [chromium] › tests/auth.spec.ts:53:10 › Authentication - Password Required › should redirect to login when accessing protected routes\n\u001b[1A\u001b[2K[5/13] [chromium] › tests/auth.spec.ts:64:10 › Authentication - Password Required › should reject incorrect password\n\u001b[1A\u001b[2K[6/13] [chromium] › tests/auth.spec.ts:79:10 › Authentication - Password Required › should accept correct password and redirect to dashboard\n\u001b[1A\u001b[2K[7/13] [chromium] › tests/auth.spec.ts:93:10 › Authentication - Password Required › should persist authentication across page reloads\n\u001b[1A\u001b[2K[8/13] [chromium] › tests/auth.spec.ts:109:10 › Authentication - Password Required › should logout and redirect to login page\n\u001b[1A\u001b[2K[9/13] [chromium] › tests/auth.spec.ts:128:10 › Authentication - Password Required › should report unauthenticated status via API\n\u001b[1A\u001b[2K[10/13] [chromium] › tests/auth.spec.ts:142:5 › Authentication - Complete Flow › should handle complete user flow without password\n\u001b[1A\u001b[2K[11/13] [chromium] › tests/crawl.spec.ts:4:5 › Crawl Integration › should add a feed and see items after crawl\n\u001b[1A\u001b[2K[12/13] [chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout\n\u001b[1A\u001b[2K[chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout\nStep 5: Navigate to Home\n\n\u001b[1A\u001b[2KStep 6: Logout\n\n\u001b[1A\u001b[2K[13/13] [chromium] › tests/font.spec.ts:4:5 › Font Theme Settings › should change font family when theme starts\n\u001b[1A\u001b[2K 6 skipped\n 7 passed (5.2s)\n\nTo open last HTML report run:\n\u001b[36m\u001b[39m\n\u001b[36m npx playwright show-report\u001b[39m\n\u001b[36m\u001b[39m\nTests passed!\nCleaning up...\nCleaning up test environment...\nCleanup complete.) which is brittle and resource intensive. Consider alternative approaches or refactoring.","type":"task","status":"closed","priority":4,"labels":null,"assignee":"","created":"2026-02-15T16:23:52.252436663Z","updated":"2026-02-15T19:14:31.772890559Z"}
{"id":"NK-k2fh32","title":"scroll mark as read broken in V3 UI","description":"j/k properly select and mark an item as read, but scrolling it off the screen on desktop and mobile don't seem to mark it as read.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-16T15:32:42.579032595Z","updated":"2026-02-16T15:37:20.993241382Z"}
{"id":"NK-k4y597","title":"[feature] light/dark/black toggle","description":"Add in a simple [light | dark | black] theme toggler like in the legacy version.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:45:55.312953906Z","updated":"2026-02-14T01:29:20.073659889Z"}
-{"id":"NK-k9otuy","title":"Exclude full_content from stream list API responses","description":"Benchmarks show ~380KB/op allocation for stream endpoint, largely from serializing full_content field that is not displayed in list views. Excluding this field from list responses would reduce memory allocation and improve API response times. Full content is already available via the /api/item/:id/content scrape endpoint.","type":"task","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-16T22:08:15.014135834Z","updated":"2026-02-16T22:08:15.014135834Z"}
+{"id":"NK-k9otuy","title":"Exclude full_content from stream list API responses","description":"Benchmarks show ~380KB/op allocation for stream endpoint, largely from serializing full_content field that is not displayed in list views. Excluding this field from list responses would reduce memory allocation and improve API response times. Full content is already available via the /api/item/:id/content scrape endpoint.","type":"","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-16T22:08:15.014135834Z","updated":"2026-02-16T23:03:03.193816656Z"}
{"id":"NK-kdn1m2","title":"Optimize observer creation in renderItems","description":"We currently recreate IntersectionObservers every time renderItems is called. We should investigate if this impacts performance and potentially reuse the observer or optimize the logic.","type":"task","status":"open","priority":4,"labels":null,"assignee":"","created":"2026-02-16T15:37:41.915993277Z","updated":"2026-02-16T15:37:41.915993277Z"}
{"id":"NK-kqt9oc","title":"docker support","description":"add support so people can self-host this in docker and (maybe) test it yourself. maybe keep it in a docker directory with separate docs etc.","type":"epic","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T20:19:10.70328135Z","updated":"2026-02-14T01:03:35.363466842Z"}
{"id":"NK-kra45a","title":"enhance github ci/cq","description":"Make sure we have the right CI/CQ things in the github workflow. Can it test our docker compose for us too maybe","type":"feature","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T00:08:25.732991582Z","updated":"2026-02-15T01:04:54.350079542Z"}
@@ -114,7 +115,7 @@
{"id":"NK-mgmn5m","title":"serve \"legacy\" version UI at /v1/ instead of /","description":"Let's \"softly\" start to deprecated the legacy version by moving it to /v1/ -- ideally this won't require any changes but there may be some relative/absolute URLs to adjust in the static files there or in rouoting","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T16:41:04.710679944Z","updated":"2026-02-14T17:38:25.35292336Z"}
{"id":"NK-mpb1e1","title":"Mock RSS feeds in E2E tests","description":"Currently E2E tests fetch real feeds like CNN, which makes them slow (10s+) and potentially flaky depending on network. Use a local mock server or file-based mocks.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T23:43:56.494457169Z","updated":"2026-02-15T02:17:12.5439427Z"}
{"id":"NK-mwf9q2","title":"Implement Tag View","description":"Create frontend view for browsing items by tag/category. Use /tag/:id endpoint.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T15:04:12.441165286Z","updated":"2026-02-13T18:04:38.644796168Z"}
-{"id":"NK-mx8o1b","title":"review recent tickets / CLs and write tests","description":"Given the key behaviors/features/bugs are there any additional tests needed -- don't worry about e2e tests.","type":"epic","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-16T16:01:44.60710814Z","updated":"2026-02-16T16:01:44.60710814Z"}
+{"id":"NK-mx8o1b","title":"review recent tickets / CLs and write tests","description":"Given the key behaviors/features/bugs are there any additional tests needed -- don't worry about e2e tests.","type":"","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-16T16:01:44.60710814Z","updated":"2026-02-16T23:31:41.92974498Z"}
{"id":"NK-n7nuyy","title":"Fix TypeScript Lint Errors in Tests","description":"There are lint errors in test files regarding jest-dom matchers (toBeInTheDocument, etc). Ensure proper types are included.","type":"bug","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T21:50:15.140702806Z","updated":"2026-02-13T21:50:15.140702806Z"}
{"id":"NK-ngokc3","title":"Enhance CSRF protection for login page","description":"The /login/ endpoint is currently excluded from CSRF checks to allow standard form submission. We should explore adding a hidden CSRF token to the form or using Javascript to submit to /api/login for better protection.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-16T15:56:34.617681973Z","updated":"2026-02-16T22:02:51.841992054Z"}
{"id":"NK-nx8dhw","title":"fix github ci","description":"seems to be broken, are the right things still in there given all the refactorings","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T18:02:19.485418738Z","updated":"2026-02-14T18:08:16.790742187Z"}
@@ -159,6 +160,7 @@
{"id":"NK-uy90he","title":"UI Styling: Feed Items (Spacing, Dateline)","description":"","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T18:05:17.289457994Z","updated":"2026-02-13T18:11:46.255816698Z"}
{"id":"NK-uywybr","title":"https://computer.rip/rss.xml fails to importa","description":"running neko -a https://computer.rip/rss.xml gave an error. debug it and add test case to catch.","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T20:12:28.54350403Z","updated":"2026-02-14T01:03:02.755247954Z"}
{"id":"NK-v9e7r3","title":"consistency in sidebar","description":"With the new sidebar styling, SETTINGS and LOGOUT and the light/dark look really different than the rest. Let's make them more consistent from a style perspective.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T23:55:51.554786606Z","updated":"2026-02-15T00:22:33.826814528Z"}
+{"id":"NK-vztuud","title":"Sanitize HTML at ingest time instead of on every read","description":"The Filter function runs bluemonday sanitization on every query result. Moving sanitization to item creation/crawl time would reduce per-request CPU cost, especially for frequently-read items.","type":"task","status":"open","priority":4,"labels":null,"assignee":"","created":"2026-02-16T23:03:28.861761558Z","updated":"2026-02-16T23:03:28.861761558Z"}
{"id":"NK-wibjlg","title":"update README.md","description":"Ensure the build, configuration, etc are up too date.\nNote the git change when we started to vibe-code this in the history (with dates etc.)","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T20:18:08.790048498Z","updated":"2026-02-13T22:36:07.717448961Z"}
{"id":"NK-wj8m4v","title":"Fix pre-existing safehttp test failure","description":"TestSafeClient in internal/safehttp fails: private IP check returns nil error instead of blocking. The test expects an error for 10.0.0.1 but gets nil.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-16T19:09:38.775620083Z","updated":"2026-02-16T22:07:45.904161737Z"}
{"id":"NK-wjats7","title":"v3 ui: takes 3 presses of 'j' to move to next item","description":"Is there some weird timer before it's scrolling it -- after that it's fine. Or a delay to setup the listener or something","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-16T16:20:01.7097349Z","updated":"2026-02-16T18:53:59.531388427Z"}
@@ -204,6 +206,7 @@
{"id":"NK-dk4vq5o","from_ticket_id":"NK-uy90he","to_ticket_id":"NK-mwf9q2","type":"created_from","created":"2026-02-13T18:05:17.305248863Z"}
{"id":"NK-dkhu8ov","from_ticket_id":"NK-mwf9q2","to_ticket_id":"NK-0ppv3f","type":"created_from","created":"2026-02-13T15:04:12.449401674Z"}
{"id":"NK-dl8clj9","from_ticket_id":"NK-0nf7hu","to_ticket_id":"NK-9hx0y7","type":"created_from","created":"2026-02-13T05:50:46.769436228Z"}
+{"id":"NK-dlg1gco","from_ticket_id":"NK-ekxfvv","to_ticket_id":"NK-k9otuy","type":"created_from","created":"2026-02-16T23:03:28.824814398Z"}
{"id":"NK-dlvmiyc","from_ticket_id":"NK-7tzbql","to_ticket_id":"NK-bsdwqz","type":"created_from","created":"2026-02-13T05:02:57.392616851Z"}
{"id":"NK-dm35o6g","from_ticket_id":"NK-d4c8jv","to_ticket_id":"NK-chns2b","type":"created_from","created":"2026-02-14T04:46:32.151239137Z"}
{"id":"NK-dm75oc8","from_ticket_id":"NK-3om7x2","to_ticket_id":"NK-zt4e32","type":"created_from","created":"2026-02-13T05:59:46.169842933Z"}
@@ -215,6 +218,7 @@
{"id":"NK-dnw8qnj","from_ticket_id":"NK-qwef98","to_ticket_id":"NK-mwf9q2","type":"created_from","created":"2026-02-13T18:05:18.469080925Z"}
{"id":"NK-do2cces","from_ticket_id":"NK-ngokc3","to_ticket_id":"NK-oqd24q","type":"created_from","created":"2026-02-16T15:56:34.653005025Z"}
{"id":"NK-dofihuz","from_ticket_id":"NK-0ppv3f","to_ticket_id":"NK-t0nmbj","type":"created_from","created":"2026-02-13T05:44:01.640770816Z"}
+{"id":"NK-drbilma","from_ticket_id":"NK-vztuud","to_ticket_id":"NK-k9otuy","type":"created_from","created":"2026-02-16T23:03:28.877255067Z"}
{"id":"NK-ds03bw7","from_ticket_id":"NK-0oti10","to_ticket_id":"NK-pwogze","type":"created_from","created":"2026-02-14T20:44:37.268882219Z"}
{"id":"NK-dspotwc","from_ticket_id":"NK-kdn1m2","to_ticket_id":"NK-k2fh32","type":"created_from","created":"2026-02-16T15:37:41.946633536Z"}
{"id":"NK-dumpdcp","from_ticket_id":"NK-59kbij","to_ticket_id":"NK-ek0cox","type":"created_from","created":"2026-02-13T14:58:18.351925575Z"}