diff --git a/README.md b/README.md
index e71670a..2c66736 100644
--- a/README.md
+++ b/README.md
@@ -131,3 +131,7 @@ Quartz remotes live in `site/` (`cd site; git pull`). After a Quartz pull, re-co
Current major is **Quartz 5**. Edit `publish/quartz.config.yaml`, not the clone. Canvas uses `@quartz-community/canvas-page`. Drafts use `@quartz-community/remove-draft`.
Engine license: MIT (Quartz). Vault content: Unlicense (`LICENSE`).
+
+## Notice
+
+I'm not a web dev. Look away at the scripts this is just done because it doesn't exist, so it was done badly.
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-0x44_-assembly-isnt-hard-its-just-platform-specific.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-0x44_-assembly-isnt-hard-its-just-platform-specific.md
index 5514a4d..7ab9209 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-0x44_-assembly-isnt-hard-its-just-platform-specific.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-0x44_-assembly-isnt-hard-its-just-platform-specific.md
@@ -7,8 +7,8 @@ author: "0x44"
handle: 0x44_
post_id: "1951048949667619280"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-2Sexy4MyGPU-it-was-never-hard-just-tedious.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-2Sexy4MyGPU-it-was-never-hard-just-tedious.md
index 9606d33..a823fee 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-2Sexy4MyGPU-it-was-never-hard-just-tedious.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-2Sexy4MyGPU-it-was-never-hard-just-tedious.md
@@ -7,8 +7,8 @@ author: "Matthew Rusch"
handle: 2Sexy4MyGPU
post_id: "1950935584714654191"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-CUDAHandbook-i-have-been-writing-assembly-for-almost-40-years.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-CUDAHandbook-i-have-been-writing-assembly-for-almost-40-years.md
index 6b3cd3d..766b0e2 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-CUDAHandbook-i-have-been-writing-assembly-for-almost-40-years.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-CUDAHandbook-i-have-been-writing-assembly-for-almost-40-years.md
@@ -7,8 +7,8 @@ author: "Nicholas Wilt"
handle: CUDAHandbook
post_id: "1951018231856312578"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Karyuutensei-unrelated-but-i-would-also-love-a-look-at-your.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Karyuutensei-unrelated-but-i-would-also-love-a-look-at-your.md
index eef7370..6d24f6b 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Karyuutensei-unrelated-but-i-would-also-love-a-look-at-your.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Karyuutensei-unrelated-but-i-would-also-love-a-look-at-your.md
@@ -7,8 +7,8 @@ author: "Nick Tasios"
handle: Karyuutensei
post_id: "1950905493053923408"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-NickDrisc0ll-im-sure-it-would-be-invaluable.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-NickDrisc0ll-im-sure-it-would-be-invaluable.md
index 7de654e..a624e06 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-NickDrisc0ll-im-sure-it-would-be-invaluable.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-NickDrisc0ll-im-sure-it-would-be-invaluable.md
@@ -7,8 +7,8 @@ author: "vulkan tamer"
handle: NickDrisc0ll
post_id: "1950899486059851961"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-PunteroCrudo-i-would-and-i-think-more-people-would-be.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-PunteroCrudo-i-would-and-i-think-more-people-would-be.md
index 30b4230..098d255 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-PunteroCrudo-i-would-and-i-think-more-people-would-be.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-PunteroCrudo-i-would-and-i-think-more-people-would-be.md
@@ -7,8 +7,8 @@ author: "PunteroCrudo"
handle: PunteroCrudo
post_id: "1950929528131326083"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-SquaredApe-given-ive-only-done-asm-on-amiga-with-devpac-i.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-SquaredApe-given-ive-only-done-asm-on-amiga-with-devpac-i.md
index a831d60..a9a24e6 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-SquaredApe-given-ive-only-done-asm-on-amiga-with-devpac-i.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-SquaredApe-given-ive-only-done-asm-on-amiga-with-devpac-i.md
@@ -7,8 +7,8 @@ author: "Robert William Cummings"
handle: SquaredApe
post_id: "1950915633811534012"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Stererence-ive-been-doing-assembly-a-bit-in-d-with-the.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Stererence-ive-been-doing-assembly-a-bit-in-d-with-the.md
index 9a3d633..41ef612 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Stererence-ive-been-doing-assembly-a-bit-in-d-with-the.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-Stererence-ive-been-doing-assembly-a-bit-in-d-with-the.md
@@ -7,8 +7,8 @@ author: "Sterence"
handle: Stererence
post_id: "1950970860694913461"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-VicThorDev6-a-lot-of-people-who-claim-assembly-is-hard-just.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-VicThorDev6-a-lot-of-people-who-claim-assembly-is-hard-just.md
index 224677c..cb188c0 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-VicThorDev6-a-lot-of-people-who-claim-assembly-is-hard-just.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-VicThorDev6-a-lot-of-people-who-claim-assembly-is-hard-just.md
@@ -7,8 +7,8 @@ author: "VicThor Dev"
handle: VicThorDev6
post_id: "1950927812401004774"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-_naf_90-im-learning-assembly-in-my-spare-time.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-_naf_90-im-learning-assembly-in-my-spare-time.md
index e5cd0b7..bf3b946 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-_naf_90-im-learning-assembly-in-my-spare-time.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-_naf_90-im-learning-assembly-in-my-spare-time.md
@@ -7,8 +7,8 @@ author: "Naf ๐จ๐ฝโ๐ป"
handle: _naf_90
post_id: "1950948334002159684"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-biovf-i-would-definitely-watch-that.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-biovf-i-would-definitely-watch-that.md
index bdaeb9d..543f068 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-biovf-i-would-definitely-watch-that.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-biovf-i-would-definitely-watch-that.md
@@ -7,8 +7,8 @@ author: "David Sena"
handle: biovf
post_id: "1950863824522739861"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-cyberbemon-id-love-to-watch-that.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-cyberbemon-id-love-to-watch-that.md
index 6f1ee4a..8e5dae9 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-cyberbemon-id-love-to-watch-that.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-cyberbemon-id-love-to-watch-that.md
@@ -7,8 +7,8 @@ author: "D J"
handle: cyberbemon
post_id: "1950940978229236154"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-there-are-a-lot-of-watch-me-write-this-app-in.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-there-are-a-lot-of-watch-me-write-this-app-in.md
index f5c8e85..b1ba4a4 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-there-are-a-lot-of-watch-me-write-this-app-in.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-there-are-a-lot-of-watch-me-write-this-app-in.md
@@ -7,8 +7,8 @@ author: "Ian Hanschen"
handle: furan
post_id: "1950955895351083303"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-would-watch-though.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-would-watch-though.md
index d941572..8f3c934 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-would-watch-though.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-furan-would-watch-though.md
@@ -7,8 +7,8 @@ author: "Ian Hanschen"
handle: furan
post_id: "1950956007737463015"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-konigssohne-if-youre-got-a-blank-canvas-go-for-it-interfacing.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-konigssohne-if-youre-got-a-blank-canvas-go-for-it-interfacing.md
index 81bf1e5..1b43185 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-konigssohne-if-youre-got-a-blank-canvas-go-for-it-interfacing.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-konigssohne-if-youre-got-a-blank-canvas-go-for-it-interfacing.md
@@ -7,8 +7,8 @@ author: "NEOAethyr"
handle: konigssohne
post_id: "1950961762419044639"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-leonard_coder-im-still-doing-assembly-as-hobby-68k-assembly-x64.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-leonard_coder-im-still-doing-assembly-as-hobby-68k-assembly-x64.md
index f312111..490cd32 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-leonard_coder-im-still-doing-assembly-as-hobby-68k-assembly-x64.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-leonard_coder-im-still-doing-assembly-as-hobby-68k-assembly-x64.md
@@ -7,8 +7,8 @@ author: "Arnaud Carrรฉ"
handle: leonard_coder
post_id: "1950889332375470135"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-m6502-i-would-enjoy-watching-that.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-m6502-i-would-enjoy-watching-that.md
index 60564b1..9b41f46 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-m6502-i-would-enjoy-watching-that.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-m6502-i-would-enjoy-watching-that.md
@@ -7,8 +7,8 @@ author: "Manuel Montoto"
handle: m6502
post_id: "1950913023851278616"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mmalex-i-agree-if-one-is-ok-with-bottom-up-thinking-99.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mmalex-i-agree-if-one-is-ok-with-bottom-up-thinking-99.md
index d4e29d7..b854f34 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mmalex-i-agree-if-one-is-ok-with-bottom-up-thinking-99.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mmalex-i-agree-if-one-is-ok-with-bottom-up-thinking-99.md
@@ -7,8 +7,8 @@ author: "๐๐๐๐๐๐"
handle: mmalex
post_id: "1950886322341630045"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mu_chrinovic-definitely-interested-in-anything-you-put-out.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mu_chrinovic-definitely-interested-in-anything-you-put-out.md
index 286aa40..c2d66e1 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mu_chrinovic-definitely-interested-in-anything-you-put-out.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-mu_chrinovic-definitely-interested-in-anything-you-put-out.md
@@ -7,8 +7,8 @@ author: "Chrinovic Mukanya"
handle: mu_chrinovic
post_id: "1950864277624979480"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-nullspector-i-would-so-love-that.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-nullspector-i-would-so-love-that.md
index 4f65e37..be5c4a0 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-nullspector-i-would-so-love-that.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-nullspector-i-would-so-love-that.md
@@ -7,8 +7,8 @@ author: "Michael Spector"
handle: nullspector
post_id: "1950865695140364456"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-o__boga-im-staying-maybe-for-vulkan-depending-on-how.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-o__boga-im-staying-maybe-for-vulkan-depending-on-how.md
index d41baa2..224459e 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-o__boga-im-staying-maybe-for-vulkan-depending-on-how.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-o__boga-im-staying-maybe-for-vulkan-depending-on-how.md
@@ -7,8 +7,8 @@ author: "Boga"
handle: o__boga
post_id: "1950939824183001106"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-opdroid1234-i-would.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-opdroid1234-i-would.md
index 6e0ab04..28f3568 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-opdroid1234-i-would.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-opdroid1234-i-would.md
@@ -7,8 +7,8 @@ author: "opdroid1234"
handle: opdroid1234
post_id: "1950902422362046528"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-plasmabitcoin-very-interested.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-plasmabitcoin-very-interested.md
index 423ef4d..5acbe8e 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-plasmabitcoin-very-interested.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-plasmabitcoin-very-interested.md
@@ -7,8 +7,8 @@ author: "PlasmaBitcoin"
handle: plasmabitcoin
post_id: "1950963702569771336"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-pranksterware-thatd-rock.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-pranksterware-thatd-rock.md
index 60d4813..c17b8ce 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-pranksterware-thatd-rock.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-pranksterware-thatd-rock.md
@@ -7,8 +7,8 @@ author: "unevenprankster"
handle: pranksterware
post_id: "1950872517700206902"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-roasted6read-i-am-interested.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-roasted6read-i-am-interested.md
index 6801ad2..30497b7 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-roasted6read-i-am-interested.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-roasted6read-i-am-interested.md
@@ -7,8 +7,8 @@ author: "แ แ แ แ "
handle: roasted6read
post_id: "1950914379412566114"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ruben_cabaco-would-be-very-interested-in-it-also-on-your-forth.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ruben_cabaco-would-be-very-interested-in-it-also-on-your-forth.md
index 99b0dcc..95bd2d9 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ruben_cabaco-would-be-very-interested-in-it-also-on-your-forth.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ruben_cabaco-would-be-very-interested-in-it-also-on-your-forth.md
@@ -7,8 +7,8 @@ author: "Rรบben Cabaรงo"
handle: ruben_cabaco
post_id: "1950894646881611793"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-simplex_fx-is-it-already-aprils-fools-again.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-simplex_fx-is-it-already-aprils-fools-again.md
index e929f65..2c5ff34 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-simplex_fx-is-it-already-aprils-fools-again.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-simplex_fx-is-it-already-aprils-fools-again.md
@@ -7,8 +7,8 @@ author: "Simplex"
handle: simplex_fx
post_id: "1951011391827010009"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ssh4net-please.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ssh4net-please.md
index 9b7ba9b..939aaf6 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ssh4net-please.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-ssh4net-please.md
@@ -7,8 +7,8 @@ author: "Vlad Erium ๐ฏ๐ต"
handle: ssh4net
post_id: "1950870099809681578"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-thecolemanthe-assembly-isnt-hard-its-tedious-no-abstractions.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-thecolemanthe-assembly-isnt-hard-its-tedious-no-abstractions.md
index 5574276..89167a3 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-thecolemanthe-assembly-isnt-hard-its-tedious-no-abstractions.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-thecolemanthe-assembly-isnt-hard-its-tedious-no-abstractions.md
@@ -7,8 +7,8 @@ author: "Mark Coleman"
handle: thecolemanthe
post_id: "1950956186783895852"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-totalwert-thread.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-totalwert-thread.md
index 756cb74..4bd0975 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-totalwert-thread.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-07-31-totalwert-thread.md
@@ -7,8 +7,8 @@ author: "Alonne"
handle: totalwert
post_id: "1950900720770625916"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
@@ -31,6 +31,7 @@ parent_post_id: "1950860870818439202"
@NOTimothyLottes
+
## Related
- Spine: [[archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to]]
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-im-gonna-start-pretending-i-understood-everything.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-im-gonna-start-pretending-i-understood-everything.md
new file mode 100644
index 0000000..33d5637
--- /dev/null
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-im-gonna-start-pretending-i-understood-everything.md
@@ -0,0 +1,35 @@
+---
+title: "@NOTimothyLottes I'm gonna start pretending I understood everything you said"
+type: archive
+source: twitter
+source_url: "https://x.com/AnshumanKhanna5/status/1951095609567617288"
+author: "Anshuman Khanna"
+handle: AnshumanKhanna5
+post_id: "1951095609567617288"
+date: 2025-08-01
+archived: 2026-08-24
+draft: false
+tags:
+ - archive
+ - twitter
+ - NOTimothyLottes
+description: "@NOTimothyLottes I'm gonna start pretending I understood everything you said"
+in_reply_to: ""
+parent_post_id: "1950868863836410096"
+---
+
+## Source
+
+- URL: https://x.com/AnshumanKhanna5/status/1951095609567617288
+- Author: Anshuman Khanna (@AnshumanKhanna5)
+- Posted: 2025-08-01 01:40:17
+
+## Branch
+
+**1/**
+
+@NOTimothyLottes I'm gonna start pretending I understood everything you said
+
+## Related
+
+- Spine: [[archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to]]
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-video-link-now.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-video-link-now.md
index d518315..717fb3c 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-video-link-now.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-video-link-now.md
@@ -7,8 +7,8 @@ author: "Anshuman Khanna"
handle: AnshumanKhanna5
post_id: "1951095292377571395"
date: 2025-08-01
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-John31625320803-it-doesnt-really-matter-what-language-you-call.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-John31625320803-it-doesnt-really-matter-what-language-you-call.md
index 80847fe..202efe1 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-John31625320803-it-doesnt-really-matter-what-language-you-call.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-John31625320803-it-doesnt-really-matter-what-language-you-call.md
@@ -7,8 +7,8 @@ author: "รgis Stranding"
handle: John31625320803
post_id: "1951198394329829393"
date: 2025-08-01
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-_vkaku-i-know-someone-whod-be-excited-opdroid1234.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-_vkaku-i-know-someone-whod-be-excited-opdroid1234.md
index c2f29f2..eda1330 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-_vkaku-i-know-someone-whod-be-excited-opdroid1234.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-_vkaku-i-know-someone-whod-be-excited-opdroid1234.md
@@ -7,8 +7,8 @@ author: "Karthik Kumar Viswanathan"
handle: _vkaku
post_id: "1951170620542296537"
date: 2025-08-01
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-schulzb589-i-would-watch-that-so-count-me-in.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-schulzb589-i-would-watch-that-so-count-me-in.md
index 03e8e1e..c2af98f 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-schulzb589-i-would-watch-that-so-count-me-in.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-schulzb589-i-would-watch-that-so-count-me-in.md
@@ -7,8 +7,8 @@ author: "Ben Schulz"
handle: schulzb589
post_id: "1951093394786361833"
date: 2025-08-01
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
diff --git a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/index.md b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/index.md
index 049cca8..e37e0af 100644
--- a/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/index.md
+++ b/archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/index.md
@@ -7,8 +7,8 @@ author: "NOTimothyLottes"
handle: NOTimothyLottes
post_id: "1950860870818439202"
date: 2025-07-31
-archived: 2026-08-23
-draft: true
+archived: 2026-08-24
+draft: false
tags:
- archive
- twitter
@@ -50,3 +50,5 @@ So Valve standardizing on Proton saves a lot of trouble with porting across ABIs
**6/**
Few probably remember the old Unix before pthreads and ELF. It was better then. Much easier to use fork and shm to do platform audio than today. And that holds for all the vintage workstations (which I did implement back in the day)
+
+Branches: [[archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to/2025-08-01-AnshumanKhanna5-im-gonna-start-pretending-i-understood-everything]]
diff --git a/scripts/twitter/README.md b/scripts/twitter/README.md
index 10808ab..cdc1b49 100644
--- a/scripts/twitter/README.md
+++ b/scripts/twitter/README.md
@@ -9,6 +9,7 @@ python C:\projects\Threadwell\scripts\twitter\tw.py graph --id
python C:\projects\Threadwell\scripts\twitter\tw.py refresh --id --tip
python C:\projects\Threadwell\scripts\twitter\tw.py refresh --id --tip --branch
python C:\projects\Threadwell\scripts\twitter\tw.py add-branch --id --from
+python C:\projects\Threadwell\scripts\twitter\tw.py emit --id --tip --preserve-existing
python C:\projects\Threadwell\scripts\twitter\tw.py audit-media --id
python C:\projects\Threadwell\scripts\twitter\tw.py publish --id
python C:\projects\Threadwell\scripts\twitter\tw.py sync --handle
@@ -23,7 +24,9 @@ python C:\projects\Threadwell\scripts\twitter\tw.py migrate-media --all --apply
`refresh` = refetch (cookies) + ingest + emit `--force` + media_merge. `--tip` treats `--id` as the tip and walks back to the OP regardless of handle. Repeatable `--branch ` captures only those additional explicit tip paths and merges them into the same `thread_data.json`; it does not discover replies automatically. Captures run sequentially with gallery-dl retries disabled and five-second extractor/request pacing. Each thread emits exactly one archive directory owned by the OP (the post with `reply_to_id == None`); cross-author responders do not get a directory. Does not flip `draft`. Does not commit. Frozen ids abort.
-`add-branch` incrementally extends an already emitted thread. `--id` must be the original stored spine tip; repeatable `--from ` values are each captured once. The command locally retains each node's missing attachment path and entire visible descendant subtree, merges only previously absent posts into the existing `thread_data.json`, downloads media for the new posts, and re-emits with the original spine unchanged. It preserves existing origin/local/fallback/derived/OCR media records and adds provider-origin plus local-copy records for new branch media. A visible leaf is only the deepest reply returned by that capture; the command does not query descendants individually or claim provider-wide completeness. Fallback upload remains a separate explicit action after origin unavailability is confirmed.
+`emit --preserve-existing` is the safe completion step after inspecting a fresh scratch capture. Fresh records win for ids the provider returned; posts present only in the existing emitted `thread_data.json` are retained after the command verifies both captures share a conversation root. This prevents an incomplete gallery-dl refresh from deleting archived replies. The merged scratch dataset keeps the requested `--id` as its stored spine tip before normal emission and media-manifest reconciliation.
+
+`add-branch` incrementally extends an already emitted thread. `--id` must be the original stored spine tip; repeatable `--from ` values are each captured once. The command locally retains each node's missing attachment path and entire visible descendant subtree, merges only previously absent posts into the existing `thread_data.json`, downloads media for the new posts, and re-emits with the original spine unchanged. It preserves existing origin/local/fallback/derived/OCR media records and adds provider-origin plus local-copy records for new branch media. A visible leaf is only the deepest reply returned by that capture; the command does not query descendants individually or claim provider-wide completeness. Gallery-dl may return only the ancestor chain when replies are behind nested show-more cursors; then the command adds nothing and known reply/stream-tip ids must be supplied explicitly. Fallback upload remains a separate explicit action after origin unavailability is confirmed.
Usual publish path after you like the note:
diff --git a/scripts/twitter/tests/test_tw_media_commands.py b/scripts/twitter/tests/test_tw_media_commands.py
index bd275c8..7c45877 100644
--- a/scripts/twitter/tests/test_tw_media_commands.py
+++ b/scripts/twitter/tests/test_tw_media_commands.py
@@ -17,11 +17,13 @@ from twitter.tw import (
_copy_selected_media,
_gallery_base_args,
_merge_branch_posts,
+ _merge_existing_capture,
_merge_gallery_files,
_select_branch_capture,
_validate_capture_ids,
build_parser,
cmd_add_branch,
+ cmd_emit,
)
@@ -333,6 +335,107 @@ class TwMediaCommandTests(unittest.TestCase):
with self.assertRaisesRegex(SystemExit, "stored spine tip"):
cmd_add_branch(Namespace(id="200", from_ids=["300"]))
+ def test_merge_existing_capture_keeps_fresh_and_retains_missing(self) -> None:
+ old_100 = make_post("100", None)
+ old_200 = make_post("200", "100")
+ old_300 = make_post("300", "100")
+ existing = ThreadData(
+ root_post_id="100",
+ posts=(old_100, old_200, old_300),
+ source_url="https://x.com/i/status/100",
+ )
+ fresh_100 = replace(old_100, text="fresh root")
+ fresh_200 = replace(old_200, text="fresh tip")
+ fresh_400 = make_post("400", "200")
+ fresh = ThreadData(
+ root_post_id="200",
+ posts=(fresh_100, fresh_200, fresh_400),
+ source_url="https://x.com/i/status/200",
+ )
+ merged, retained = _merge_existing_capture(fresh, existing, "200")
+ self.assertEqual(
+ merged.posts,
+ (fresh_100, fresh_200, fresh_400, old_300),
+ )
+ self.assertEqual(merged.root_post_id, "200")
+ self.assertEqual(merged.source_url, fresh.source_url)
+ self.assertEqual(retained, ("300",))
+
+ def test_merge_existing_capture_rejects_different_conversation(self) -> None:
+ existing = ThreadData(
+ root_post_id="100",
+ posts=(make_post("100", None),),
+ source_url="https://x.com/i/status/100",
+ )
+ fresh = ThreadData(
+ root_post_id="200",
+ posts=(make_post("200", None),),
+ source_url="https://x.com/i/status/200",
+ )
+ with self.assertRaisesRegex(SystemExit, "different conversation"):
+ _merge_existing_capture(fresh, existing, "200")
+
+ def test_emit_and_refresh_accept_preserve_existing(self) -> None:
+ emit_args = build_parser().parse_args([
+ "emit", "--id", "200", "--tip", "--preserve-existing",
+ ])
+ refresh_args = build_parser().parse_args([
+ "refresh", "--id", "200", "--tip", "--preserve-existing",
+ ])
+ self.assertTrue(emit_args.preserve_existing)
+ self.assertTrue(refresh_args.preserve_existing)
+
+ def test_emit_preserve_existing_merges_before_running_emitter(self) -> None:
+ with TemporaryDirectory() as tmp:
+ root = Path(tmp)
+ scratch = root / "refetch_200"
+ assets = root / "assets"
+ notes = root / "notes"
+ notes.mkdir()
+ existing = ThreadData(
+ root_post_id="100",
+ posts=(
+ make_post("100", None),
+ make_post("200", "100"),
+ make_post("300", "100"),
+ ),
+ source_url="https://x.com/i/status/100",
+ )
+ fresh = ThreadData(
+ root_post_id="200",
+ posts=(
+ replace(make_post("100", None), text="fresh"),
+ replace(make_post("200", "100"), text="fresh"),
+ make_post("400", "200"),
+ ),
+ source_url="https://x.com/i/status/200",
+ )
+ write_test_thread(assets / "thread_data.json", existing)
+ write_test_thread(scratch / "thread_data.json", fresh)
+ with (
+ patch.object(tw_module, "scratch_dir", return_value=scratch),
+ patch.object(tw_module, "dump_dir", return_value=root / "dump"),
+ patch.object(tw_module, "locate", return_value=(assets, notes)),
+ patch.object(tw_module, "locate_all", return_value=[]),
+ patch.object(tw_module, "check_frozen"),
+ patch.object(tw_module, "run") as run,
+ redirect_stdout(StringIO()),
+ ):
+ result = cmd_emit(Namespace(
+ id="200",
+ tip=True,
+ slug=None,
+ preserve_existing=True,
+ ))
+ self.assertEqual(result, 0)
+ self.assertTrue(run.called)
+ merged = load_thread(scratch / "thread_data.json")
+ self.assertEqual(
+ tuple(post.post_id for post in merged.posts),
+ ("100", "200", "400", "300"),
+ )
+ self.assertEqual(merged.root_post_id, "200")
+
def test_migrate_defaults_to_dry_run(self) -> None:
args = build_parser().parse_args(["migrate-media", "--id", "100"])
self.assertEqual(args.cmd, "migrate-media")
diff --git a/scripts/twitter/tw.py b/scripts/twitter/tw.py
index 3aa703a..33d4c75 100644
--- a/scripts/twitter/tw.py
+++ b/scripts/twitter/tw.py
@@ -320,6 +320,25 @@ def _merge_branch_posts(
)
+def _merge_existing_capture(
+ fresh: ThreadData,
+ existing: ThreadData,
+ tip_id: str,
+) -> tuple[ThreadData, tuple[str, ...]]:
+ """Keep fresh post data while retaining archived posts it omitted."""
+ if tip_id not in {post.post_id for post in fresh.posts}:
+ raise SystemExit(f"spine tip {tip_id} missing from fresh capture")
+ fresh_roots = {
+ post.post_id for post in fresh.posts if post.reply_to_id is None
+ }
+ existing_roots = {
+ post.post_id for post in existing.posts if post.reply_to_id is None
+ }
+ if not fresh_roots or fresh_roots.isdisjoint(existing_roots):
+ raise SystemExit("fresh and existing captures are a different conversation")
+ return _merge_branch_posts(fresh, [existing.posts])
+
+
def _copy_selected_media(
source: Path,
destination: Path,
@@ -447,7 +466,12 @@ def cmd_add_branch(args: argparse.Namespace) -> int:
}
_copy_selected_media(capture_dir, output_dir, selected_added)
_write_thread(output_dir / "thread_data.json", merged)
- cmd_emit(argparse.Namespace(id=post_id, tip=True, slug=None))
+ cmd_emit(argparse.Namespace(
+ id=post_id,
+ tip=True,
+ slug=None,
+ preserve_existing=False,
+ ))
added_text = ",".join(added_ids) if added_ids else "-"
leaf_text = ";".join(
@@ -469,6 +493,23 @@ def cmd_emit(args: argparse.Namespace) -> int:
src = dump_dir(post_id)
if not (src / "thread_data.json").is_file():
raise SystemExit(f"no thread_data.json for {post_id}")
+ if args.preserve_existing:
+ assets, _notes = locate(post_id)
+ if assets is None:
+ raise SystemExit(f"no existing emitted thread for {post_id}")
+ existing_path = assets / "thread_data.json"
+ if not existing_path.is_file():
+ raise SystemExit(f"missing {existing_path}")
+ fresh = load_thread(src / "thread_data.json")
+ existing = load_thread(existing_path)
+ merged, retained_ids = _merge_existing_capture(
+ fresh,
+ existing,
+ post_id,
+ )
+ _write_thread(src / "thread_data.json", merged)
+ retained = ",".join(retained_ids) if retained_ids else "-"
+ print(f"preserve-existing retained={retained}")
cmd = [
sys.executable,
str(HERE / "emit_archive.py"),
@@ -795,6 +836,11 @@ def build_parser() -> argparse.ArgumentParser:
if name in ("emit", "refresh"):
p.add_argument("--tip", action="store_true", help="use --id as tip")
p.add_argument("--slug", default=None)
+ p.add_argument(
+ "--preserve-existing",
+ action="store_true",
+ help="retain archived posts omitted by the fresh capture",
+ )
if name == "lift":
p.add_argument("--orig", action="store_true")
if name == "ocr":