lightnovelworld Series identity is read from the chapter page (#80) #92

Merged
sulthan merged 17 commits from feat/lnw-series-identity into main 2026-08-11 18:21:51 +07:00

17 Commits

Author SHA1 Message Date
sulthan c09b7d6c98 chore: refresh graphify map for the lnw identity change 2026-08-11 18:00:29 +07:00
sulthan 27dda60185 Merge origin/main into feat/lnw-series-identity 2026-08-11 18:00:07 +07:00
sulthan 752dd08fe6 Merge ticket/88-lnw-marker-canary (#88) 2026-08-11 13:33:48 +07:00
sulthan 3396c50aac #88: review — drop dead anchor branch, single marker scan in canary helper 2026-08-11 13:32:14 +07:00
sulthan 78ce251b4d #88: live canary for the lnw comment-thread marker 2026-08-11 13:12:39 +07:00
sulthan b012ef02a1 Merge ticket/90-lnw-stale-row-repair (#90) 2026-08-11 13:08:23 +07:00
sulthan e1911554ec #90: address review — await repair sync before refresh, merge colliding queue markers 2026-08-11 13:06:29 +07:00
sulthan 71a2c8e2e4 Merge ticket/87-lnw-scan-unscoped (#87) 2026-08-11 13:04:05 +07:00
sulthan 51b0094430 Tighten lnw comments and log form after review (#87)
Cross-reference lnwChapterRe from the function doc instead of restating
its rationale, drop the redundant '; skipping' from the fail-closed log
to match the package's bare verb:detail form, and reword the truncation
comment so the logged body length is not described as a code-made
distinction.
2026-08-11 13:02:18 +07:00
sulthan ecce453d13 Unscope lnw chapter scan, truncate at comment thread (#87)
The Poll scoped the lightnovelworld scan to the slug derived from the
stored address, so a Series publishing chapters under more than one
Chapter Slug froze its Latest Chapter. The branch now matches any
chapter-shaped address on the host (lnwChapterRe) and scans only the
body before the wpdiscuz thread marker (wpd-threads); a body without
the marker is skipped and logged with its length, never scanned whole.
The size-cap comment now states the measured ~3.5x headroom.
2026-08-11 12:59:21 +07:00
sulthan 8c172e3579 #90: repair stale lnw rows in place on the next chapter visit
A row keyed under the Chapter Slug its address was built from, while the
page pointer names a different Series, is stale. Rewrite its key, identity
and address in the cache, the retry-queue entry (if any) and the per-device
last-checked map together, then sync through the queue-backed path so an
offline repair parks and replays. Pure transform exported for the harness;
wired before render() at both detect() call sites. A row already under the
repaired key merges, keeping the farther-ahead progress, favourite OR'd and
the stronger lifecycle bucket.
2026-08-11 12:56:17 +07:00
sulthan e864770eb8 Merge ticket/89-lnw-identity-discovered (#89) 2026-08-11 11:53:36 +07:00
sulthan 01aed58411 Merge ticket/86-lnw-scan-fixture (#86) 2026-08-11 11:53:36 +07:00
sulthan 8beaa4fd00 Address review findings on the lnw pointer read (#89)
- Share one lnw host regex between matches and the pointer validator so
  the two cannot drift apart.
- Resolve the pointer href against the page address before validating,
  so a relative pointer still yields its Series instead of silently
  resolving to type other.
- Pin pointer/breadcrumb agreement on the divergent page and pin that a
  pointer off-host or not /novel/<slug>/ resolves to other.
2026-08-11 11:52:31 +07:00
sulthan 5bee351d9a #86: drop brief-referencing clause from lnw fixture doc comment
Review follow-up: the parenthetical about the research note's ~1.18 MB
bound is not locatable from code and would rot. Keep the size disclosure,
drop the cross-reference.
2026-08-11 11:52:20 +07:00
sulthan 8d310bbf99 #86: replace lnwSeriesFixture with real split-slug page text
The a-will-eternal fixture carried a hand-written cross-series anchor
(overgeared-chapter-9999) that no real series page produces. Replace it
with text trimmed from a real, wholly-fetched
all-jobs-and-classes-i-just-wanted-one-skill-not-them-all page (2026-08-11,
~307 KB decoded): chapter anchors under both Chapter Slugs (1-99 at
...-not, 100-423 at ...-not-them-all, page order, boundary numbers and max
423), the wpd-threads marker exactly once, and after it a real wpdiscuz
comment block from the-sword-illuminates-the-great-wilderness (the pinned
page serves zero comments; same Site, same theme) carrying the one composed
element - a bare <a href> to a real overgeared chapter (2059, HTTP 200).

Scan expectation moves 1317 -> 423, the no-trailing-slash and challenge
cases move to the new novel, lnwCoverFixture moves to the new novel's real
og:image, and the poller's cover-fill case follows. sites.go and fetch.go
are byte-for-byte unchanged.
2026-08-11 11:49:34 +07:00
sulthan a4da2e2f00 Read lnw Series identity from the chapter page pointer (#89)
The lightnovelworld chapter branch no longer derives the Series address by
string-manipulating the chapter path: on ~7% of novels the Chapter Slug
diverges from the Series slug and the derived address 404s on every Poll.
The identity now comes from the page's own a[aria-label='All Chapter']
pointer (breadcrumb's second crumb as fallback), validated as a
lightnovelworld.net /novel/<slug>/ address; no pointer resolves to
type: other. The Chapter Slug rides on the detected page object only
(chapterSlug; null on a series page) and is written to no store, for the
stale-row repair in #90.

Harness: document.querySelector now answers attribute selectors with an
element exposing getAttribute (attrEls table, cleared by reset()).
AGENTS.md records that the Series address is discovered, not derived.
2026-08-11 11:48:46 +07:00