Skip to content

fix: stop rewriting the wiki every run (hash excludes Last Updated timestamp)#35

Merged
bakerboy448 merged 2 commits into
mainfrom
fix/wiki-hash-skip-timestamp
Jun 24, 2026
Merged

fix: stop rewriting the wiki every run (hash excludes Last Updated timestamp)#35
bakerboy448 merged 2 commits into
mainfrom
fix/wiki-hash-skip-timestamp

Conversation

@bakerboy448

@bakerboy448 bakerboy448 commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

Bug (in prod)

update_wiki_page hashes the full wiki content, which begins with **Last Updated:** <current time> (build_wiki_content). Because the timestamp changes every run, content_hash is always new, cached_hash == content_hash is never true, and the page is rewritten with a fresh revision every ~10 min even when nothing changed. The entire wiki_hash_cache table is dead weight.

Impact: needless Reddit wiki writes + revision-history spam. Not data corruption.

Fix

get_content_hash strips the volatile Last Updated line before hashing, so the change-detection hash reflects only the modlog body. Self-heals after one write post-deploy.

Verification

  • timestamp-only diff → identical hash (skip now works) ✓
  • body change → different hash (still writes) ✓
  • existing test suite passes (no regression)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Wiki updates now skip unchanged content more reliably, reducing unnecessary edits.
    • Continuous and forced refresh flows are more consistent when rebuilding wiki pages.
  • Bug Fixes

    • Improved handling of wiki size limits and API errors for more reliable updates.
    • Better formatting and cleanup of moderation entries, including timestamps and removal reasons.
    • Faster and more dependable data lookup during wiki generation.

build_wiki_content prepends a '**Last Updated:** <now>' header and
update_wiki_page hashed the whole content, so the hash differed every run,
cached_hash == content_hash was never true, and the wiki page was rewritten
with a fresh revision on every cycle even when the modlog was unchanged — the
wiki_hash_cache skip was fully defeated (needless API writes + revision spam).

get_content_hash now strips the volatile Last Updated line before hashing, so
the hash reflects only the modlog body. Self-heals after one write (the first
post-deploy run rehashes the existing page, then subsequent unchanged runs
skip). Verified: timestamp-only diffs now hash equal; body changes still differ.
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@bakerboy448, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 53 minutes and 33 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ee43f01d-3c1a-44c4-87e1-0a6c69798297

📥 Commits

Reviewing files that changed from the base of the PR and between 83404b0 and 73b5901.

📒 Files selected for processing (1)
  • modlog_wiki_publisher.py

Walkthrough

modlog_wiki_publisher.py receives broad improvements across config validation, SQLite schema migration and indexing, content hash stability (excluding the volatile Last Updated header), DB action storage/fetching via a new MockAction inner class, wiki content generation logic, update_wiki_page error handling, and CLI/continuous-mode operational flow.

Changes

modlog_wiki_publisher.py overhaul

Layer / File(s) Summary
Config validation and DB migration/indexing
modlog_wiki_publisher.py
validate_config_value emits multi-line clamping warnings; validate_wiki_actions raises multi-line ValueError with sorted valid actions; migrate_database adds guarded indexes, ALTER TABLE statements for new columns across processed_actions, wiki_hash_cache, and subreddit (plus matching index), and reformats migration logging.
Stable content hashing and DB storage/cleanup
modlog_wiki_publisher.py
get_content_hash replaced with SHA-256 that strips the volatile **Last Updated:** line for stable hash comparison; store_processed_action rewrites addremovalreason extraction, sanitizes removal_reason for markdown, and normalizes created_at to integer epoch seconds; update_missing_subreddits switches to executemany; cleanup_old_entries recalculates retention cutoff; get_target_permalink and is_duplicate_action use explicit parameterized queries.
DB action fetching via MockAction
modlog_wiki_publisher.py
get_recent_actions_from_db refactored with parameterized DISTINCT action-type selection for force-refresh, case-insensitive subreddit filtering, and an inner MockAction class that constructs lightweight action objects from DB rows with explicit column mapping and permalink normalization.
Wiki content generation and formatting
modlog_wiki_publisher.py
format_content_link reorganized with explicit comment-vs-post branching and [deleted] fallback; format_modlog_entry adds multi-line AutoModerator filter conditional; build_wiki_content rewrites timestamp header, approval_context prior-reason inclusion (non-empty/non-"-" checks), combined_reason via details/mod_note branches, footer_parts list, multi-line table row construction, and trimming with content notice insertion.
update_wiki_page validation and error handling
modlog_wiki_publisher.py
Logs detailed over-limit byte counts, raises ValueError with multi-line message, logs percent-used warnings near the threshold, detects Reddit API size/too-long errors with targeted guidance, and adds richer 403 forbidden diagnostics.
Operational flow: processing, config, CLI, continuous mode, main
modlog_wiki_publisher.py
process_modlog_actions revalidates batch_size; load_config reformats env parsing and auto-update logging; CLI ArgumentParser and setup_logging are reformatted; run_continuous_mode uses the refactored DB fetch with structured backoff; main adds an explicit force_modlog branch rebuilding from DB and refactors the normal final wiki refresh to use the updated get_recent_actions_from_db call.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the bug, fix, and verification, but it does not follow the required template sections or checklist items. Rewrite the PR description to match the template: add Summary, Changes, and Checklist sections, and fill in the required checklist items.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately states the main bug fix: avoiding wiki rewrites by excluding the Last Updated timestamp from hashing.
Docstring Coverage ✅ Passed Docstring coverage is 93.10% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/wiki-hash-skip-timestamp

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
modlog_wiki_publisher.py (3)

362-384: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add a real migration for target_author before selecting it.

get_recent_actions_from_db unconditionally selects target_author, but the v5 migration only adds subreddit. Existing databases that have not gone through store_processed_action’s lazy column-add path will hit no such column: target_author, return [], and skip wiki rebuilds. Add an idempotent migration for target_author and bump the schema version so already-migrated DBs get it too.

Also applies to: 867-880

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 362 - 384, The v5 migration in the
database upgrade path only adds subreddit, but get_recent_actions_from_db still
selects target_author unconditionally, so older databases can fail with a
missing-column error and skip wiki rebuilds. Add an idempotent migration in the
same migration block that checks for target_author with PRAGMA
table_info(processed_actions), adds it if missing, and updates the schema
version so existing installs are upgraded as well; keep the logic aligned with
store_processed_action and get_recent_actions_from_db.

1704-1708: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Do not persist environment-provided secrets during config auto-update.

original_config.update(env_config) merges env credentials into the runtime config, and the auto-update path then dumps that merged config back to config_path. If env vars provide Reddit credentials and a default is added, secrets get written to disk. Keep a separate file-only config for auto-update, or strip env-sourced fields before writing.

Also applies to: 1725-1739

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 1704 - 1708, The config auto-update
path is persisting environment-sourced secrets because
`original_config.update(env_config)` merges runtime overrides into the same
object that later gets written back to disk. In `load_env_config`/the
auto-update flow around `config_path`, keep env overrides separate from the
file-backed config or filter out env-provided credential fields before saving.
Make sure the write step only serializes the original on-disk config plus
non-sensitive defaults, not values injected from environment variables.

1887-1894: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Reset error_count only after a successful cycle.

error_count is reset at the start of each retry, so repeated failures never progress beyond attempt 1/max_errors and continuous mode may loop forever. Move the reset to after cleanup_old_entries completes successfully.

Also applies to: 1931-1944

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 1887 - 1894, The retry state in
modlog_wiki_publisher’s processing cycle is being cleared too early, which
prevents repeated failures from advancing correctly. Update the logic around the
main run flow in the processing function that calls process_modlog_actions and
cleanup_old_entries so error_count is only reset after the full cycle completes
successfully, including cleanup_old_entries; keep the retry counter intact
across failures so max_errors and continuous mode behave correctly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@modlog_wiki_publisher.py`:
- Around line 2005-2017: The --force-modlog path in modlog_wiki_publisher.py is
still using the incremental process_modlog_actions flow, so it can miss retained
older entries and skip refreshing cached actions. Update the force branch to use
a dedicated full-rebuild fetch path in the force-modlog handling logic, bounded
by retention instead of batch_size/duplicate filtering, and keep the rebuild
step using get_recent_actions_from_db with the force behavior aligned to that
full refresh.
- Around line 927-933: The permalink handling currently preserves and renders
absolute Reddit URLs as-is, which can create malformed double-prefixed links and
allow legacy profile URLs to slip through. Update the permalink normalization
and rendering path in target_permalink handling and format_content_link so only
Reddit content links containing /comments/ are accepted, reject /u/ and /user/
profile links, and normalize any absolute reddit.com URL before rendering
instead of blindly prefixing https://www.reddit.com. Apply the same guard to the
related target_permalink cached/rendered code paths so all link output is
content-only.
- Around line 1547-1550: The 403 diagnostic in the wiki publishing error path is
logging the placeholder literally because the message in the logger.error call
is missing interpolation. Update the error message in the relevant
publish/diagnostic block so the content_size value is formatted at runtime, and
keep the surrounding “Possible causes” logging in place to preserve the context
of the failure.
- Around line 1477-1494: The wiki-size safeguard is being swallowed by the broad
exception handler, so the `ValueError` raised in the existing-size check never
stops the update. In `modlog_wiki_publisher.py`, update the logic around the
existing wiki size lookup and the `existing_size > warning_threshold` block so
that only the wiki lookup failure is ignored, while the local safety error from
the size limit check is re-raised or allowed to propagate. Keep the handling
focused on the size-check path and use the existing symbols `existing_size`,
`warning_threshold`, and the `except Exception as e` block to separate lookup
errors from update-blocking safety errors.

---

Outside diff comments:
In `@modlog_wiki_publisher.py`:
- Around line 362-384: The v5 migration in the database upgrade path only adds
subreddit, but get_recent_actions_from_db still selects target_author
unconditionally, so older databases can fail with a missing-column error and
skip wiki rebuilds. Add an idempotent migration in the same migration block that
checks for target_author with PRAGMA table_info(processed_actions), adds it if
missing, and updates the schema version so existing installs are upgraded as
well; keep the logic aligned with store_processed_action and
get_recent_actions_from_db.
- Around line 1704-1708: The config auto-update path is persisting
environment-sourced secrets because `original_config.update(env_config)` merges
runtime overrides into the same object that later gets written back to disk. In
`load_env_config`/the auto-update flow around `config_path`, keep env overrides
separate from the file-backed config or filter out env-provided credential
fields before saving. Make sure the write step only serializes the original
on-disk config plus non-sensitive defaults, not values injected from environment
variables.
- Around line 1887-1894: The retry state in modlog_wiki_publisher’s processing
cycle is being cleared too early, which prevents repeated failures from
advancing correctly. Update the logic around the main run flow in the processing
function that calls process_modlog_actions and cleanup_old_entries so
error_count is only reset after the full cycle completes successfully, including
cleanup_old_entries; keep the retry counter intact across failures so max_errors
and continuous mode behave correctly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 885058d5-fc44-4873-a070-3971cd07135e

📥 Commits

Reviewing files that changed from the base of the PR and between aef6a2e and 83404b0.

📒 Files selected for processing (1)
  • modlog_wiki_publisher.py

Comment thread modlog_wiki_publisher.py
Comment thread modlog_wiki_publisher.py
Comment on lines 1477 to 1494
if existing_size > warning_threshold:
logger.warning(f"Existing wiki page already at {existing_size:,} bytes ({(existing_size/REDDIT_WIKI_LIMIT)*100:.1f}% of limit)")
logger.warning(
f"Existing wiki page already at {existing_size:,} bytes ({(existing_size / REDDIT_WIKI_LIMIT) * 100:.1f}% of limit)"
)

# If we're trying to add more content to an already large page
if content_size >= existing_size:
logger.error(f"Cannot increase wiki size from {existing_size:,} to {content_size:,} bytes - too close to limit")
logger.error("Consider reducing retention_days or max_wiki_entries_per_page in config")
raise ValueError(f"Wiki page too large to update safely")
logger.error(
f"Cannot increase wiki size from {existing_size:,} to {content_size:,} bytes - too close to limit"
)
logger.error(
"Consider reducing retention_days or max_wiki_entries_per_page in config"
)
raise ValueError("Wiki page too large to update safely")
except Exception as e:
# Wiki page might not exist yet, that's okay
if "404" not in str(e) and "not found" not in str(e).lower():
logger.debug(f"Could not check existing wiki size: {e}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Do not swallow the wiki-size safeguard.

The ValueError raised when the existing wiki is already near the limit is immediately caught by the broad except Exception, so the edit proceeds anyway. Re-raise local safety errors or narrow the exception handler to the wiki lookup failure.

Proposed fix
-        except Exception as e:
+        except ValueError:
+            raise
+        except Exception as e:
             # Wiki page might not exist yet, that's okay
             if "404" not in str(e) and "not found" not in str(e).lower():
                 logger.debug(f"Could not check existing wiki size: {e}")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if existing_size > warning_threshold:
logger.warning(f"Existing wiki page already at {existing_size:,} bytes ({(existing_size/REDDIT_WIKI_LIMIT)*100:.1f}% of limit)")
logger.warning(
f"Existing wiki page already at {existing_size:,} bytes ({(existing_size / REDDIT_WIKI_LIMIT) * 100:.1f}% of limit)"
)
# If we're trying to add more content to an already large page
if content_size >= existing_size:
logger.error(f"Cannot increase wiki size from {existing_size:,} to {content_size:,} bytes - too close to limit")
logger.error("Consider reducing retention_days or max_wiki_entries_per_page in config")
raise ValueError(f"Wiki page too large to update safely")
logger.error(
f"Cannot increase wiki size from {existing_size:,} to {content_size:,} bytes - too close to limit"
)
logger.error(
"Consider reducing retention_days or max_wiki_entries_per_page in config"
)
raise ValueError("Wiki page too large to update safely")
except Exception as e:
# Wiki page might not exist yet, that's okay
if "404" not in str(e) and "not found" not in str(e).lower():
logger.debug(f"Could not check existing wiki size: {e}")
if existing_size > warning_threshold:
logger.warning(
f"Existing wiki page already at {existing_size:,} bytes ({(existing_size / REDDIT_WIKI_LIMIT) * 100:.1f}% of limit)"
)
# If we're trying to add more content to an already large page
if content_size >= existing_size:
logger.error(
f"Cannot increase wiki size from {existing_size:,} to {content_size:,} bytes - too close to limit"
)
logger.error(
"Consider reducing retention_days or max_wiki_entries_per_page in config"
)
raise ValueError("Wiki page too large to update safely")
except ValueError:
raise
except Exception as e:
# Wiki page might not exist yet, that's okay
if "404" not in str(e) and "not found" not in str(e).lower():
logger.debug(f"Could not check existing wiki size: {e}")
🧰 Tools
🪛 Ruff (0.15.18)

[warning] 1479-1479: Logging statement uses f-string

(G004)


[warning] 1485-1485: Logging statement uses f-string

(G004)


[warning] 1490-1490: Abstract raise to an inner function

(TRY301)


[warning] 1490-1490: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 1491-1491: Do not catch blind exception: Exception

(BLE001)


[warning] 1494-1494: Logging statement uses f-string

(G004)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 1477 - 1494, The wiki-size safeguard
is being swallowed by the broad exception handler, so the `ValueError` raised in
the existing-size check never stops the update. In `modlog_wiki_publisher.py`,
update the logic around the existing wiki size lookup and the `existing_size >
warning_threshold` block so that only the wiki lookup failure is ignored, while
the local safety error from the size limit check is re-raised or allowed to
propagate. Keep the handling focused on the size-check path and use the existing
symbols `existing_size`, `warning_threshold`, and the `except Exception as e`
block to separate lookup errors from update-blocking safety errors.

Comment thread modlog_wiki_publisher.py Outdated
Comment on lines +1547 to +1550
logger.error("Possible causes:")
logger.error(" 1. Wiki page size limit exceeded (current content: {content_size:,} bytes)")
logger.error(
" 1. Wiki page size limit exceeded (current content: {content_size:,} bytes)"
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Interpolate content_size in the 403 diagnostic.

This log message is missing the f prefix, so it emits {content_size:,} literally and loses the key troubleshooting detail.

Proposed fix
-            logger.error(
-                "  1. Wiki page size limit exceeded (current content: {content_size:,} bytes)"
-            )
+            logger.error(
+                f"  1. Wiki page size limit exceeded (current content: {content_size:,} bytes)"
+            )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
logger.error("Possible causes:")
logger.error(" 1. Wiki page size limit exceeded (current content: {content_size:,} bytes)")
logger.error(
" 1. Wiki page size limit exceeded (current content: {content_size:,} bytes)"
)
logger.error("Possible causes:")
logger.error(
f" 1. Wiki page size limit exceeded (current content: {content_size:,} bytes)"
)
🧰 Tools
🪛 Ruff (0.15.18)

[warning] 1547-1547: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


[warning] 1548-1550: Use logging.exception instead of logging.error

Replace with exception

(TRY400)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 1547 - 1550, The 403 diagnostic in the
wiki publishing error path is logging the placeholder literally because the
message in the logger.error call is missing interpolation. Update the error
message in the relevant publish/diagnostic block so the content_size value is
formatted at runtime, and keep the surrounding “Possible causes” logging in
place to preserve the context of the failure.

Source: Path instructions

Comment thread modlog_wiki_publisher.py Outdated
Comment on lines +2005 to +2017
if args.force_modlog:
logger.info("Force modlog requested - fetching ALL modlog actions from Reddit and rebuilding wiki...")
logger.info(
"Force modlog requested - fetching ALL modlog actions from Reddit and rebuilding wiki..."
)
# First, fetch all recent modlog actions to populate database
logger.info("Fetching all modlog actions from Reddit...")
process_modlog_actions(reddit, config)

# Then rebuild wiki from database (showing only removal actions)
logger.info("Rebuilding wiki from database...")
actions = get_recent_actions_from_db(config, force_all_actions=False, show_only_removals=True)
actions = get_recent_actions_from_db(
config, force_all_actions=False, show_only_removals=True
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Make --force-modlog actually rebuild from all recent modlog entries.

This branch logs “fetching ALL modlog actions,” but it calls process_modlog_actions, which is still capped by batch_size and skips duplicate action IDs. A force rebuild can therefore miss older retained actions or fail to refresh existing cached rows. Use a dedicated force-fetch path bounded by retention, not the normal incremental batch path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modlog_wiki_publisher.py` around lines 2005 - 2017, The --force-modlog path
in modlog_wiki_publisher.py is still using the incremental
process_modlog_actions flow, so it can miss retained older entries and skip
refreshing cached actions. Update the force branch to use a dedicated
full-rebuild fetch path in the force-modlog handling logic, bounded by retention
instead of batch_size/duplicate filtering, and keep the rebuild step using
get_recent_actions_from_db with the force behavior aligned to that full refresh.

A session formatter (black --line-length=88) reformatted the entire file on
the prior commit; the repo uses black --line-length=180. This restores the
repo's formatting so the net change is only the get_content_hash fix and
pre-commit passes.
@bakerboy448 bakerboy448 merged commit 08fb4f1 into main Jun 24, 2026
5 checks passed
@bakerboy448 bakerboy448 deleted the fix/wiki-hash-skip-timestamp branch June 24, 2026 12:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant