github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 00b8f85a98e039eaaf2046ccb2bbc7e1ff07d60e https://github.com/dreamwidth/dreamwidth/commit/00b8f85a98e039eaaf2046ccb2bbc7e1ff07d60e Author: Mark Smith mark@dreamwidth.org Date: 2026-04-19 (Sun, 19 Apr 2026)

Changed paths: M app.psgi M bin/starman A cgi-bin/Plack/Middleware/DW/AccessLog.pm

Log Message:


Add JSON access log middleware for Grafana Loki

Replace Starman's default Apache Combined access log with a DW::AccessLog middleware that emits one JSON object per line to psgi.errors. Fields include method, path, status, bytes, duration_ms, host, remote_ip, and user_agent — all natively parseable by Loki's | json pipeline for dashboards.

Use --no-default-middleware to suppress Plack's built-in AccessLog, and enable ContentLength explicitly in app.psgi to preserve that behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: a19cc8c787fca5419d8469a5977323ed68c450c2 https://github.com/dreamwidth/dreamwidth/commit/a19cc8c787fca5419d8469a5977323ed68c450c2 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M src/dwtool/main.go

Log Message:


Improve esn-trace URL resolution with userid lookup and precise Loki queries

Resolve the journal's userid from their profile page so we can build exact Loki regex queries matching [esn ETYPEID:JOURNALID:JTALKID:ARG2] instead of broad substring matches on ":JTALKID:" which produced false positives.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: b1e684b607034fa480f654db748922660b063d9d https://github.com/dreamwidth/dreamwidth/commit/b1e684b607034fa480f654db748922660b063d9d Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M cgi-bin/DW/Task/ESN/FiredEvent.pm M cgi-bin/LJ/DB.pm

Log Message:


Fix ESN dropping notifications due to replication lag on comment load

FiredEvent reads comment data to determine which users' Reply subscriptions are relevant. LJ::Comment::preload_rows loads via get_cluster_reader, which hits the replica — but the comment was just written to the master and may not have replicated yet. When this race is lost, the comment fails to load, relevantuserids returns empty, Reply subscriptions are excluded, and the notification is silently dropped.

Fix: wrap the subscription lookup in LJ::DB::require_master so all reads go to the cluster master. Also extend get_cluster_reader to respect the existing PRAGMAFORCE_MASTER flag, which previously only affected global (non-cluster) readers.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/eae7aaa21ba6...b1e684b60703

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 439d836de1e77290f029a08afebd37d4b177f74f https://github.com/dreamwidth/dreamwidth/commit/439d836de1e77290f029a08afebd37d4b177f74f Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: A src/dwtool/internal/config/loki.go A src/dwtool/internal/loki/client.go M src/dwtool/main.go

Log Message:


Switch dwtool log-scan and esn-trace from CloudWatch to Loki

Logs now go directly to Grafana Cloud Loki via Fluent Bit, so dwtool needs to query Loki instead of CloudWatch. Adds a Loki HTTP client that queries /loki/api/v1/query_range with LogQL, and rewrites both log-scan and esn-trace to use it.

Credentials are loaded from ~/.config/dwtool/config.json (with DWTOOL_LOKI_HOST/USER/PASSWORD env var overrides). The Loki client strips Fluent Bit key_value wrapper and log4perl timestamp/level prefix from messages so output is clean.

Other fixes: - Renamed logscan → log-scan for consistency with esn-trace - Fixed flag parsing in esn-trace: Go's flag package stops at the first positional arg, so esn-trace URL -since 24h silently ignored -since. Args are now reordered so flags come first. - log-scan uses -service instead of -groups for filtering by Loki service label instead of CloudWatch log group glob - Service column is hidden when -service is specified (redundant)

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: eae7aaa21ba6b5d07a1ed3378505a9a0b156b995 https://github.com/dreamwidth/dreamwidth/commit/eae7aaa21ba6b5d07a1ed3378505a9a0b156b995 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M .github/workflows/tasks/web-canary-service.json M .github/workflows/tasks/web-shop-service.json M .github/workflows/tasks/web-stable-service.json M .github/workflows/tasks/web-unauthenticated-service.json

Log Message:


remove cloudwatch agent sidecar from web task definitions

The CW agent was configured to collect Apache access logs but was pointing at a -DISABLED log path, so it was burning resources for nothing. Removes the sidecar container, log-share volume, and associated mount from all four web service task definitions.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/b046642d6f54...eae7aaa21ba6

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: b046642d6f54f301e4f4a128472cc9edfa8fd80c https://github.com/dreamwidth/dreamwidth/commit/b046642d6f54f301e4f4a128472cc9edfa8fd80c Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M .github/workflows/tasks/worker-birthday-notify-service.json M .github/workflows/tasks/worker-change-poster-id-service.json M .github/workflows/tasks/worker-codebuild-notifier-service.json M .github/workflows/tasks/worker-content-importer-lite-service.json M .github/workflows/tasks/worker-content-importer-service.json M .github/workflows/tasks/worker-content-importer-verify-service.json M .github/workflows/tasks/worker-directory-meta-service.json M .github/workflows/tasks/worker-distribute-invites-service.json M .github/workflows/tasks/worker-dw-change-poster-id-service.json M .github/workflows/tasks/worker-dw-distribute-invites-service.json M .github/workflows/tasks/worker-dw-embeds-service.json M .github/workflows/tasks/worker-dw-esn-cluster-subs-service.json M .github/workflows/tasks/worker-dw-esn-filter-subs-service.json M .github/workflows/tasks/worker-dw-esn-fired-event-service.json M .github/workflows/tasks/worker-dw-esn-process-sub-service.json M .github/workflows/tasks/worker-dw-import-eraser-service.json M .github/workflows/tasks/worker-dw-incoming-email-service.json M .github/workflows/tasks/worker-dw-latest-feed-service.json M .github/workflows/tasks/worker-dw-lazy-cleanup-service.json M .github/workflows/tasks/worker-dw-mass-privacy-service.json M .github/workflows/tasks/worker-dw-send-email-service.json M .github/workflows/tasks/worker-dw-sphinx-copier-service.json M .github/workflows/tasks/worker-dw-support-notify-service.json M .github/workflows/tasks/worker-dw-synsuck-service.json M .github/workflows/tasks/worker-dw-xpost-service.json M .github/workflows/tasks/worker-embeds-service.json M .github/workflows/tasks/worker-expunge-users-service.json M .github/workflows/tasks/worker-import-eraser-service.json M .github/workflows/tasks/worker-import-scheduler-service.json M .github/workflows/tasks/worker-incoming-email-service.json M .github/workflows/tasks/worker-latest-feed-service.json M .github/workflows/tasks/worker-lazy-cleanup-service.json M .github/workflows/tasks/worker-paidstatus-service.json M .github/workflows/tasks/worker-process-privacy-service.json M .github/workflows/tasks/worker-resolve-extacct-service.json M .github/workflows/tasks/worker-schedule-synsuck-service.json M .github/workflows/tasks/worker-ses-incoming-email-service.json M .github/workflows/tasks/worker-shop-creditcard-charge-service.json M .github/workflows/tasks/worker-spellcheck-gm-service.json M .github/workflows/tasks/worker-sphinx-copier-service.json M .github/workflows/tasks/worker-sphinx-search-gm-service.json M .github/workflows/tasks/worker-support-notify-service.json M config/update-workflows.py

Log Message:


Ship worker logs directly to Grafana Cloud Loki via Fluent Bit

Regenerated all 42 worker task definitions to use awsfirelens with a Fluent Bit log_router sidecar instead of the awslogs driver. Worker logs now go directly to Grafana Cloud Loki over HTTPS, bypassing CloudWatch Logs entirely.

Each task definition gains a log_router container (~15MB RSS) running aws-for-fluent-bit:3 (Fluent Bit v4.2.2, the 3.x line based on AL2023 — the 2.x line ships Fluent Bit 1.9 which has no Loki plugin). Loki credentials are injected via SSM secrets at task startup. The worker container's logDriver changes from awslogs to awsfirelens with the native loki output plugin.

Fluent Bit's own logs still go to CloudWatch (/dreamwidth/fluent-bit) so the log router itself can be debugged if needed.

Generated by config/update-workflows.py from config/workers.json.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: ece0b7970913514a534e88d20b8383a4555ebe5a https://github.com/dreamwidth/dreamwidth/commit/ece0b7970913514a534e88d20b8383a4555ebe5a Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M .github/workflows/tasks/worker-birthday-notify-service.json M .github/workflows/tasks/worker-change-poster-id-service.json M .github/workflows/tasks/worker-codebuild-notifier-service.json M .github/workflows/tasks/worker-content-importer-lite-service.json M .github/workflows/tasks/worker-content-importer-service.json M .github/workflows/tasks/worker-content-importer-verify-service.json M .github/workflows/tasks/worker-directory-meta-service.json M .github/workflows/tasks/worker-distribute-invites-service.json M .github/workflows/tasks/worker-dw-change-poster-id-service.json M .github/workflows/tasks/worker-dw-distribute-invites-service.json M .github/workflows/tasks/worker-dw-embeds-service.json M .github/workflows/tasks/worker-dw-esn-cluster-subs-service.json M .github/workflows/tasks/worker-dw-esn-filter-subs-service.json M .github/workflows/tasks/worker-dw-esn-fired-event-service.json M .github/workflows/tasks/worker-dw-esn-process-sub-service.json M .github/workflows/tasks/worker-dw-import-eraser-service.json M .github/workflows/tasks/worker-dw-incoming-email-service.json M .github/workflows/tasks/worker-dw-latest-feed-service.json M .github/workflows/tasks/worker-dw-lazy-cleanup-service.json M .github/workflows/tasks/worker-dw-mass-privacy-service.json M .github/workflows/tasks/worker-dw-send-email-service.json M .github/workflows/tasks/worker-dw-sphinx-copier-service.json M .github/workflows/tasks/worker-dw-support-notify-service.json M .github/workflows/tasks/worker-dw-synsuck-service.json M .github/workflows/tasks/worker-dw-xpost-service.json M .github/workflows/tasks/worker-embeds-service.json M .github/workflows/tasks/worker-expunge-users-service.json M .github/workflows/tasks/worker-import-eraser-service.json M .github/workflows/tasks/worker-import-scheduler-service.json M .github/workflows/tasks/worker-incoming-email-service.json M .github/workflows/tasks/worker-latest-feed-service.json M .github/workflows/tasks/worker-lazy-cleanup-service.json M .github/workflows/tasks/worker-paidstatus-service.json M .github/workflows/tasks/worker-process-privacy-service.json M .github/workflows/tasks/worker-resolve-extacct-service.json M .github/workflows/tasks/worker-schedule-synsuck-service.json M .github/workflows/tasks/worker-ses-incoming-email-service.json M .github/workflows/tasks/worker-shop-creditcard-charge-service.json M .github/workflows/tasks/worker-spellcheck-gm-service.json M .github/workflows/tasks/worker-sphinx-copier-service.json M .github/workflows/tasks/worker-sphinx-search-gm-service.json M .github/workflows/tasks/worker-support-notify-service.json M config/update-workflows.py

Log Message:


Ship worker logs directly to Grafana Cloud Loki via Fluent Bit

Regenerated all 42 worker task definitions to use awsfirelens with a Fluent Bit log_router sidecar instead of the awslogs driver. Worker logs now go directly to Grafana Cloud Loki over HTTPS, bypassing CloudWatch Logs entirely.

Each task definition gains a log_router container (~15MB RSS) running the AWS-maintained Fluent Bit image from private ECR. Loki credentials are injected via SSM secrets at task startup. The worker container's logDriver changes from awslogs to awsfirelens with the grafana-loki output plugin.

Fluent Bit's own logs still go to CloudWatch (/dreamwidth/fluent-bit) so the log router itself can be debugged if needed.

Generated by config/update-workflows.py from config/workers.json.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: 0d49a7588ae0544ef51801c977e8df41c651e3b5 https://github.com/dreamwidth/dreamwidth/commit/0d49a7588ae0544ef51801c977e8df41c651e3b5 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M cgi-bin/DW/Worker/ContentImporter.pm M cgi-bin/DW/Worker/ContentImporter/LiveJournal.pm

Log Message:


tidy

Compare: https://github.com/dreamwidth/dreamwidth/compare/d7d5b8fbd0bb...0d49a7588ae0

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: d7d5b8fbd0bb1063688f06cc820d3e65bae09a45 https://github.com/dreamwidth/dreamwidth/commit/d7d5b8fbd0bb1063688f06cc820d3e65bae09a45 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-12 (Sun, 12 Apr 2026)

Changed paths: M cgi-bin/DW/Task/ESN/ProcessSub.pm M cgi-bin/LJ/ESN.pm M etc/config-local.pl.example

Log Message:


Auto-deactivate ESN subscriptions for idle users

When processing notifications, deactivate subscriptions that belong to users who have been idle for over a year ($LJ::ESN_INACTIVE_DAYS, default 365). This happens in two places:

  • LJ::ESN::unique_matching_subs: if a sub requires a paid capability the user no longer has (e.g. thread tracking after paid expired) AND the user is idle, deactivate the sub before it reaches matches_filter.

  • DW::Task::ESN::ProcessSub: if a user is idle, deactivate the sub after the first skip so it never generates another SQS job.

Deactivated subs set the INACTIVE flag, NOT deleted. The user can still see them on /manage/tracking and reactivate them when they return. LJ::Subscription::create also automatically reactivates matching inactive subs when a user re-subscribes.

The idle threshold is configurable via $LJ::ESN_INACTIVE_DAYS in config-local.pl (documented in the example file). The same variable is used for the existing ProcessSub idle-skip check, replacing a previously hardcoded 365.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 51d098321baa231958385df0c938af13be280ccb https://github.com/dreamwidth/dreamwidth/commit/51d098321baa231958385df0c938af13be280ccb Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M .devcontainer/devcontainer.json M .devcontainer/setup.sh M CLAUDE.md

Log Message:


Support parallel worktree devcontainers for multi-Claude workflows

Three fixes that allow multiple devcontainers to run simultaneously from git worktrees without conflicts:

  • Add workspaceMount to always bind-mount at /workspaces/dreamwidth regardless of host folder name (worktrees have different names)
  • Use dynamic host ports (-p 0:8080) instead of hardcoded 8080:8080 so multiple containers don't fight over the same port
  • Give each workspace its own MySQL volume to prevent DB corruption
  • Symlink extlib from the image when it doesn't exist on disk (worktrees don't have extlib/ since it's gitignored)

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: 3fcdc3a52918fb76bc84761b4428b66cce064066 https://github.com/dreamwidth/dreamwidth/commit/3fcdc3a52918fb76bc84761b4428b66cce064066 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/LJ/Comment.pm

Log Message:


Add per-check diagnostic logging to Comment::visible_to

When called during ESN processing (CURRENT_TRACE is set), visible_to now logs which specific check caused the rejection: entry_not_loaded, entry_not_visible (with security level), screened, or poster_suspended. Previously all four cases produced a generic not_visible_to_watcher in the matches_filter trace with no way to distinguish them after the fact.

Triggered by a real case (trace 3:2296509:6184:0) where all 40 subscribers were rejected with not_visible_to_watcher on a public unscreened comment in a personal journal — couldn't determine root cause without per-check visibility.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/1c54be1b97b9...3fcdc3a52918

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 1c54be1b97b9d64d8833b984f942a9b66d326643 https://github.com/dreamwidth/dreamwidth/commit/1c54be1b97b9d64d8833b984f942a9b66d326643 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Task/ESN/FilterSubs.pm M cgi-bin/DW/Task/ESN/FindSubsByCluster.pm M src/dwtool/main.go

Log Message:


Fix false send failures and add CLI improvements

FilterSubs and FindSubsByCluster were passing the result of tasks_of_unique_matching_subs() directly to DW::TaskQueue->send(), which returns undef on an empty task list. When all subscriptions were legitimately filtered out by matches_filter, this was counted as a "failed send" (~47 false failures/min). Split the calls so empty task lists are a normal completion, not an error.

Also adds top-level help to dwtool listing available subcommands, and teaches esn-trace to accept a comment URL (parses ?thread= param, converts dtalkid to jtalkid, searches fired-event logs for the full trace ID automatically).

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: c3394d8c9d9ca1cbd8e169d3a1e85849e9affbaa https://github.com/dreamwidth/dreamwidth/commit/c3394d8c9d9ca1cbd8e169d3a1e85849e9affbaa Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Worker/ContentImporter.pm

Log Message:


Add DW::Stats metrics to content importer job outcomes

Instrument all four outcome methods (ok, fail, temp_fail, decline) in DW::Worker::ContentImporter with a single metric dw.worker.importer.job_completed, using labels for result, item, and hostname to support Prometheus-style querying.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 034f12e28b75c1c3b3ce7b6ab173616484e33ee5 https://github.com/dreamwidth/dreamwidth/commit/034f12e28b75c1c3b3ce7b6ab173616484e33ee5 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Task/ESN/FilterSubs.pm M cgi-bin/DW/Task/ESN/FindSubsByCluster.pm M cgi-bin/DW/Task/ESN/FiredEvent.pm M cgi-bin/DW/Task/ESN/ProcessSub.pm M cgi-bin/LJ/ESN.pm M cgi-bin/LJ/Event/JournalNewComment.pm M cgi-bin/LJ/NotificationInbox.pm M cgi-bin/LJ/Subscription.pm M src/dwtool/main.go

Log Message:


Add deterministic ESN trace IDs and full pipeline observability

Every ESN log line now carries a deterministic trace prefix [esn ETYPEID:JOURNALID:ARG1:ARG2] derived from the event's raw_params, making end-to-end tracing possible by grepping a single string across all four ESN worker log groups. The trace ID is computable from a comment URL without needing to capture it at event-fire time.

Pipeline changes: - All four ESN task workers (FiredEvent, FindSubsByCluster, FilterSubs, ProcessSub) prefix every log line with the trace string - LJ::ESN::unique_matching_subs replaces the silent grep with a loop that logs each matches_filter rejection at DEBUG with user/sub/etypeid - JournalNewComment::matches_filter logs specific rejection reasons at each of its 9 return-0 paths via a $reject->() closure - Subscription::process logs notification construction failures and not_configured_for_user skips with trace prefix - NotificationInbox::enqueue logs successful delivery confirmation - FindSubsByCluster now checks TaskQueue->send() return values and logs users with >5000 subs that get silently skipped - FilterSubs now checks TaskQueue->send() return value - ProcessSub dead code fixed: subscription-not-found is correctly handled as a skip (COMPLETED) not routed through $failed (FAILED)

Metrics consolidation (Prometheus best practice): - All DW::Stats calls use one metric name per stage with a result tag instead of encoding the result in the metric name - dw.esn.firedevent result:started|completed|failed - dw.esn.findsubsbycluster result:started|completed|failed - dw.esn.filtersubs result:completed|dropped|failed - dw.esn.filter result:rejected - dw.esn.matches_filter result:rejected (with reason tag) - dw.esn.processsub result:processed|skipped|failed - dw.esn.process result:failed|skipped - dw.esn.inbox result:delivered|evicted

CLI tooling: - dwtool esn-trace searches all four ESN log groups in CloudWatch and pretty-prints a cross-stage timeline

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 62c0b8e4ee1d12728c8f737eac0061161522fdaa https://github.com/dreamwidth/dreamwidth/commit/62c0b8e4ee1d12728c8f737eac0061161522fdaa Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M src/dwtool/internal/aws/ecs.go

Log Message:


Remove legacy web image from web-canary and web-unauthenticated deploy targets

Both services are now fully on web22. This removes the old "web" option from the deploy flow so only web22 is offered, matching web-shop.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: 58ffd06e3da3ae4ea7b3122dac7a46685a4c35e4 https://github.com/dreamwidth/dreamwidth/commit/58ffd06e3da3ae4ea7b3122dac7a46685a4c35e4 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M .gitignore

Log Message:


.gitignore updates

Commit: 7cbc4931b3974ac99de9e3657f389ed8125a5566 https://github.com/dreamwidth/dreamwidth/commit/7cbc4931b3974ac99de9e3657f389ed8125a5566 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Worker/ContentImporter/LiveJournal.pm M doc/dependencies-cpanm

Log Message:


Fix content-importer-verify TLS connection failures

The importer's XMLRPC calls to remote LJ-based sites were failing with "SSL wants a read first" due to a TLS 1.3 handshake issue with IO::Socket::SSL 2.098 and OpenSSL 3.0 (see openssl/openssl#7967). Force TLS 1.2 in call_xmlrpc as a workaround.

Also add missing Regexp::IPv6 dependency, which IO::Socket::IP needs for address parsing — its absence caused a secondary "Can't locate Regexp/IPv6.pm" failure.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: 9eff707e837547024e178f5b0b8cbc30c6653350 https://github.com/dreamwidth/dreamwidth/commit/9eff707e837547024e178f5b0b8cbc30c6653350 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: A bin/dev/importer-debug M bin/ecs-shell

Log Message:


Add importer-debug diagnostic script and fix ecs-shell on macOS

Add bin/dev/importer-debug for diagnosing content-importer connectivity issues on ECS containers. Tests DNS, TCP, TLS, HTTP, and XMLRPC layers independently with timing and detailed error output.

Fix ecs-shell exec command failing on macOS due to base64 -w0 flag not being supported (macOS uses base64 -i instead).

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/388d47d72bfa...9eff707e8375

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

The case of the missing notifications

Apr. 11th, 2026 11:58 pm
denise: Image: Me, facing away from camera, on top of the Castel Sant'Angelo in Rome (Default)
[staff profile] denise posting in [site community profile] dw_maintenance

I keep forgetting to post about this: we've been troubleshooting the "missing notifications" problem for the past few days. (Well, I say "we", really I mean Mark and Robby; I'm just the amanuensis.) It's been one of those annoying loops of "find a logical explanation for what could be causing the problem, fix that thing, observe that the problem gets better for some people but doesn't go away completely, go back to step one and start again", sigh.

Mark is hauling out the heavy debugging ordinance to try to find the root cause. Once he's done building all the extra logging tools he needs, he'll comment to this entry. After he does, if you find a comment that should have gone to your inbox and sent an email notification but didn't, leave him a link to the comment that should have sent the notification, as long as the comment itself was made after Mark says he's collecting them. (I'd wait and post this after he gets the debug code in but I need to go to sleep and he's not sure how long it will take!)

We're sorry about the hassle! Irregular/sporadic issues like this are really hard to troubleshoot because it's impossible to know if they're fixed or if they're just not happening while you're looking. With luck, this will give us enough information to figure out the root cause for real this time.

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 388d47d72bfa348ef6378e9f5e638e9fa85da491 https://github.com/dreamwidth/dreamwidth/commit/388d47d72bfa348ef6378e9f5e638e9fa85da491 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Task.pm M cgi-bin/DW/TaskQueue/LocalDisk.pm M cgi-bin/DW/TaskQueue/SQS.pm M etc/config-local.pl.example A t/taskqueue-serialize.t A t/taskqueue.t

Log Message:


Add JSON wire format for task queue with gradual rollout support

Adds serialize/deserialize methods to DW::Task that support a new v2 JSON wire format alongside the legacy Storable format. This enables non-Perl consumers (e.g. Go workers) to read task queue messages.

$LJ::TASK_QUEUE_JSON controls the rollout as a float 0-1 (e.g. 0.01 = 1% of messages serialized as JSON). Default is 0 (all Storable). All consumers can read both formats regardless of this setting. If JSON encoding fails for a task (e.g. blessed objects in args), it falls back to Storable with a warning and stat tag identifying the task class.

Also adds task queue config documentation to config-local.pl.example and comprehensive test coverage for LocalDisk lifecycle, serialization round-trips, and queue_attributes.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 4d50f4a1d495408fb95df32a63239b8bf7ea60b7 https://github.com/dreamwidth/dreamwidth/commit/4d50f4a1d495408fb95df32a63239b8bf7ea60b7 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/DW/Task/ESN/FilterSubs.pm M cgi-bin/DW/Task/ESN/ProcessSub.pm M cgi-bin/LJ/NotificationInbox.pm M cgi-bin/LJ/Subscription.pm

Log Message:


Add ESN drop/skip observability at silent-failure points

The ESN pipeline had several silent-drop paths where notifications could disappear without any log trace, making "notification went missing" bug reports impossible to investigate. This adds structured log lines and DW::Stats counters at four of those paths:

  • FilterSubs: the cluster-filter grep was a silent drop for both legitimate user-moved-cluster cases and (suspected) DB-pressure partial-load cases from LJ::load_userids. Now logs each drop at INFO with user=name(uid) sub=N cluster=expected->got reason=... and increments dw.esn.filtersubs.dropped tagged by reason.

  • ProcessSub: the three existing skip paths (subscription_not_found, user_idle, user_not_visible) kept their DEBUG log level but gained structured fields and dw.esn.processsub.skipped counters. Added a dw.esn.processsub.processed counter on the success path so baseline delivery rate is visible in Datadog.

  • Subscription::process: the configured_for_user and officialpost no-op paths now log at DEBUG with structured fields and increment dw.esn.process.skipped.

  • NotificationInbox::enqueue: inbox overflow eviction now logs at INFO with the user, oldest-kept qid, rows deleted, and max size, and increments dw.esn.inbox.evicted by the number of rows evicted.

Log levels: rare exceptions (filtersubs drop, inbox eviction) at INFO; routine skip paths (user idle, not configured) at DEBUG. Stats counters fire regardless of log level -- Datadog metrics are the primary signal, logs are forensic backup.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 727c496a47ff8257b62e438d302f0ca999c54d36 https://github.com/dreamwidth/dreamwidth/commit/727c496a47ff8257b62e438d302f0ca999c54d36 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M src/dwtool/internal/aws/cloudwatch.go M src/dwtool/main.go A src/dwtool/run.sh

Log Message:


Add logscan CLI subcommand and build helper script to dwtool

Adds dwtool logscan for searching CloudWatch logs across all Dreamwidth services by keyword, with time range and log group glob filtering. Searches in 1-hour chunks (newest first) so results stream incrementally. Also adds run.sh to check dependencies, build, and run dwtool in one step.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

Commit: d81f640239516e9c21e95a6afdc73f4fc4d63156 https://github.com/dreamwidth/dreamwidth/commit/d81f640239516e9c21e95a6afdc73f4fc4d63156 Author: Mark Smith mark@dreamwidth.org Date: 2026-04-11 (Sat, 11 Apr 2026)

Changed paths: M cgi-bin/Plack/Middleware/DW/WriteTimeout.pm M t/plack-write-timeout.t

Log Message:


Tidy fixes

Compare: https://github.com/dreamwidth/dreamwidth/compare/fe8199f3512e...d81f64023951

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/dependabot/go_modules/src/dwtool/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream-1.7.8 Home: https://github.com/dreamwidth/dreamwidth Commit: f3e04318ef316bae959895f96be292c59b8f5a14 https://github.com/dreamwidth/dreamwidth/commit/f3e04318ef316bae959895f96be292c59b8f5a14 Author: dependabot[bot] <49699333+dependabot[bot][github.com profile] users> Date: 2026-04-08 (Wed, 08 Apr 2026)

Changed paths: M src/dwtool/go.mod M src/dwtool/go.sum

Log Message:


Bump github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream

Bumps github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream from 1.7.4 to 1.7.8. - Release notes - Commits

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/dependabot/go_modules/src/dwtool/github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs-1.65.0 Home: https://github.com/dreamwidth/dreamwidth Commit: 0d0dde31d0f1e40afdb75a34408cfff9e453fd6c https://github.com/dreamwidth/dreamwidth/commit/0d0dde31d0f1e40afdb75a34408cfff9e453fd6c Author: dependabot[bot] <49699333+dependabot[bot][github.com profile] users> Date: 2026-04-08 (Wed, 08 Apr 2026)

Changed paths: M src/dwtool/go.mod M src/dwtool/go.sum

Log Message:


Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs in /src/dwtool

Bumps github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.63.1 to 1.65.0. - Release notes - Commits

Profile

denise: Image: Me, facing away from camera, on top of the Castel Sant'Angelo in Rome (Default)
Denise

November 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 20th, 2026 01:32 am
Powered by Dreamwidth Studios