4-post thread, 7 images. SPC CRT shader on Steam Deck; not doing
subpix render this time but RGB vs BGR order still matters. Comparing
grille / bad-convergence-scan / subpix-scan. Non-subpix: 1-pixel RGB
separation (intentional bad convergence) to help hide scaling.
Subpix: 1/3-pixel separation (less visible misaligned convergence).
Subpix wins: 'almost 3x doubling of scanline width detail, just
perceptually feels a lot cleaner and easier to reconstruct in the
mind.'
13-post thread with @bmcnett. Canonical statement of the mmap log
design: 'printf-debugging is a horrible term; if you're debugger-
free might as well be libc-free.' .log file mapped, first half =
lines of fixed 64-char size (cacheline), second half = single 32-bit
atomic counter for write position. Writing = increment atomic +
dump line. No contention, no file IO, lock-free, captures temporal
ordering across threads. Fixed format:
r|sc.milmic|line_|hex_____|0000000000-|string...
(r=reload, sc.milmic=time since launch, line=source line, hex, dec,
msg). Tlk(__LINE__, n, 'msg') API, no printf needed. Examples show
startup timing (cart mapping 0.005-0.008s) + Vulkan instance 2.4s
with PSO hits at 3K us each. Multi-run log for comparison, Notepad2
F5 to reload. Discussion of fixed line widths in modern era. The
cleanest documentation of the mmap log pattern - 8 months before
the Aug 2025 CART file announcement.
7-post thread. NOTimothyLottes: 'Buffer zoo' is the silly season of
Vulkan shader-side stuff to get what you actually want = instruction
intrinsics; just layout + SSBO aliasing hints at brutal API design.
Dream API: 'Read<32,64,128>(uint64_t base, uint32_t offset, uint32_t
immediate, uint32_t cacheControl, uint32_t format); And be done with
this stupid mess.' Rough edges of TEXEL_BUFFER: 9-bit shared 5-bit E
is read-only on NV, no AMD; sRGB yes NV, no AMD; NV limits to 128M
elements = {512MiB, 1GiB, 2GiB} for {32,64,128}-bit. Third sibling of
the Dec 2024 buffer-zoo cluster.
2-post thread. The real 'buffer zoo' problem with Vulkan: need HW
instruction emulation macros with overcomplete both {offset, index}
inputs so emulation can choose the right path based on whatever
{SSBO, TEXEL_BUFFER, future pointer}. TEXEL_BUFFER for formats one
can't load from SSBOs, both need 'indexes', and whenever IHVs actually
correctly optimize the pointer extension, one needs byte offsets.
'Deadcode removal nightmare land wins today.' Sibling to the
1870351985855119449 STORAGE_TEXEL_BUFFER aliasing thread.
5-post thread with @GustavSterbrant + @AgileJebrim. NOTimothyLottes:
most problems can't be fixed by bypassing GLSL and doing SPIR-V
directly; not yet tempted to write a new shader language. At-home
stuff targets VK Windows mostly (unfortunately) - no interface in AMD's
Windows driver to load binary shaders into VK. 'If SteamOS ever
fully took over PC gaming, then certainly I'd just go direct to the
AMD kernel driver and bypass user-mode VK.' Would write an assembler
specific for GCN/RDNA/whateversNext, not just modify an existing
compiler. Precursor to the Aug 2025 SPIR-V-from-data work.
33-post thread, 13 PNGs, the canonical 'shader dev' walkthrough. Reads
FXAA 3.11 / FSR1 / Unity STP, names the permutations pattern (32-bit /
packed 16-bit / implicit mediump / MIN-MAX sampling). DXIL no bitfield
ops vs SPIR-V (HLSL pre-processing on non-Xbox = fail). 16-bit
perf: don't permute from 32-bit float constants (instant PC perf
death), alias FP16 as UINT32 binary blobs. Designing shaders like
GPU assembly, AMD RDNA2 as the design target. Defines map logic to
associated instruction (fma, bitfieldExtract), all-ints-unsigned
convention with SI1_I1()-style bitcast macros, 3-letter type macros.
Compiler pattern-match bugs: tried always-UINT4 bitcast, didn't
work; native types except waveops. Argument passing SSA state
explosion: inout uint4[16] (all VGPRs) didn't end well - shader langs
support globals, use them. Next level: mostly globals with type-
bitcast aliasing; x86-64 union-of-structs-on-globals as the GPU
calling ABI. Foundation for the SPIR-V-from-data + cart-file work
(Aug 2025).
8-post thread on NV-specific 1-deep swap with IMMEDIATE presentation,
after previous AMD-tuned impl stopped working. One descriptor set
always bound (resources static after init). Dropped
VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT
('god awful naming length') to avoid NV indirection perf hit.
2700 lines of engine, embedded headers, one-file compile. 0.25 sec
hot-load on NV dGPU: 4 MiB 'cart' file from pagecache, 512 MiB GPU
buffer, all PSOs, image alloc, command buffer copy+clear. Load-time
parallelism: {instance create, cart map, TLB warming by walking pages,
window bringup} = 0.08 sec. After VK device, signal background SPIR-V
load while building descriptor set layout, then PSO compile
parallel. Earliest documented use of 'cart file' term - 9 months
before the Aug 2025 public announcement.
7-post debate with @SebAaltonen + @Nerfoxingaround. NOTimothyLottes:
back in the day wrote DOS extender (32-bit mode), Sound Blaster drivers,
VGA interface, UI + audio synth + sequencer/editor, all in assembly,
dead easy - a lot easier than bringing up a triangle in Vulkan.
Nothing complex about ASM with a good macro preprocessor; easier than
HLLs because you know exactly what you get; interrupts and syscalls
are easy. The mess came later when systems forced C ABI library
interfaces with their stacks and junk - then C++ made it worse.
'Pure ASM is easy, its interfacing with the bloat world that got
hard.' Philosophical backbone of his single-file-C / no-debugger
lifestyle.
18-post single-author technical walkthrough, 6 PNGs. Defines streaming
qualifier alphabet (W=writeonly coherent, R=readonly, A=atomics,
E=streaming readonly/exclusive, F=streaming writeonly/final) for
future-compat code even though Vulkan is missing them. Only 32/64/128-
bit type descriptors kept; type aliasing for fast path, explicit
type only when buffer compression might help someday. No 16-bit
<U,S>NORM, no 9E5/sRGB buffer access. AMD buffer atomics get signage
from opcode so UINT32 TEXEL buffer can alias r32ui/r32i. Few hundred
macros for STB access. Continuation of the bind-everything-once
engine cleanup.
10-post thread. 9 of 10 posts are duplicates of posts 2-10 in the
existing merged 1917646466417381426 corpus (same conversation, gallery-
dl anchored to this leaf URL). The unique value here is post 10
(2025-04-30 19:04:57): 'I laugh when people say C is like assembly,
they are missing what we actually did in assembly back then, which
was all registers and globals and gotos, no stacks. It's radically
different than good assembly.' Same content also captured in bootslop
references/X.com - Onat & Lottes Interaction 1.png.ocr.md.
13-post thread with @Karyuuntei. Single-source C includes only __FILE__;
WIN32 + VK headers inlined with structural-type rewrites (64-bit ints
not pointers) to get 'toward C--'. GLSL and C mixed in same file,
sharing defines. One external include for compiled SPIR-V; spirv-opt
as pre-processor (else IHV compilers 10x slower). Dev setup: 2
terminals each with own shell script, one loops regenerating SPIR-V,
other loops recompiling+running. MINGW64 not VS. Mmap log format:
{[restart]|[ms]|[line]|[hex]|[dec]|[comment]}, fixed-size lines,
lock-free (one atomic add), wraps, clear = rm. 0.3ms startup.
55-post thread, HIGHEST engagement NOTimothyLottes thread in corpus
(312 likes, 15 reposts, 20147 views), 1 MP4 video. The canonical
project-announcement thread: 'people claim assembly is hard; a good
counter would be showing how to build a x86-64 WIN32 Vulkan engine
from scratch in ASM.' Posts 2-3 lay out the rationale (game logic
on GPU = no point avoiding asm; re-arch argument-gather for cold-
cache via store multicast + linear prefetch). Post 7+ defend the
WIN32-as-Linux-strategy (Valve/Proton + Wine). Post 22 reveals CRT
setup (low-res, bitmap fonts). Post 50 the punchline: no triangles,
PS-free, CS-only, all gfx generated vintage-PC-style on compute GPUs.
Post 51: VK wins for compute because VkEvents pipelinable vs DX12's
serializing barriers vs GL's lack of pipelining. Post 55: live
systems as 'the IDE' with function keys as save/restore pallet,
snapshot the entire project as one file.
5-post thread. Announcement of next at-home project: build-from-assembly
video series + public-domain 'engine' = live-edit toy for GPU-side
PC game dev. Won't run on Intel iGPUs (binding limits). Memory model is
CART-style (RAM CART buffer = snapshotted + dynamic GPU = not). GPU-
side editing tools for shader source + bind tables, build-the-editors-
in-it, load/store to CART. Sized for what a single person could pull
off, not TBs of team-gen content.
6-post thread. Prefers framebuffer-console boot over graphical
login; converting LottesCode6x12 font to PSF2 for framebuffer terminal
source-editing; wants Vulkan swap bringup without X/Wayland.
@darrellprograms suggests SDL KMSDRM option. NOTimothyLottes:
'zero development effort' is the wrong goal for him - the goal is
to push the state of the art, use SDL source as reference. Tangent:
VT switching + VRAM page-out + exclusive GPU ownership.
6-post thread, 6 images, HIGHEST engagement NOTimothyLottes thread in
corpus (98 likes, 18 reposts, 12960 views). CRT emulation on LCDs can
trigger LCD hardware bugs - Steam Deck example: 2x1 {G,RB} checker
inside a window affects the scan outside the window (Deck scan is
90deg rotated). Theory: 90deg scan gives {(bottom)R, G, B (top)}
sub-pixel components; alternate {G,RB} per pixel for new sub-pixel
pattern at different virtual resolution. Linear-energy-conserving in
theory, breaks down in practice. Tangent post 6 from
@realtimekeith on voltage-inversion crosstalk varying across TN/IPS/VA.
3-post tangent. Same root post as 2061124942968545433 (no-debugger
debug / mmap log file evolving toward CART). @retrotink2 (RetroTink
hardware-modder) replies 'here I am still debugging by looking at
if a single LED turns on'; NOTimothyLottes: 'that plus an
oscilloscope, this is the way'.
3-post thread, 1 image. Links a YouTube video on exploring the
permutation space of color-forth-like systems. @VPCOMPRESSB asks if
the program should optimize its own code at/after init for every
subsequent exec to be hyper-specialized. NOTimothyLottes: yes can do
that, but those systems are already faster than human response time
(without external Linux kernel deps); will be able to recompile all
binary code (including GPU-side) in a tiny fraction of frame time.
3-post thread. Replaces the mmap fixed-size log file with a CART file
mmapped on CPU with mapped GPU access (no file IO) + background page
walker to prevent paging out. Beginning of CART is a grid of 32-bit
unsigned values, hex-dumped as the 'log file' to either term or GPU
render. Same framework for CPU and GPU debug ('write and it just
appears'). Visualized as 4-bit/char hex terminal with hex font.
7-post multi-person thread (NOTimothyLottes / @onatt0 / @EskilSteenberg
/ @olson_dan). On-the-fly SPIR-V generation instead of GLSL: cart file
= 'code+data' restartable package, macro-assembly-style language
where defines are played back interleaved for ILP/loop-unroll, SPIR-V
out direct (no GLSL step). Inspired by C64 SID tracker pattern +
instrument. CPU does the SPIR-V generation from data the GPU can
read/write.
5-post thread. vkGetShaderInfoAMD available on RADV (will be filing
optimization bugs). DEVICE_UNCACHED_BIT_AMD works on RADV for
low-latency CPU/GPU. Header-free Vulkan: VkPhysicalDeviceLimits
replaced with 63 64-bit values (504 bytes) for direct byte offset.
Next: another beam-racing effort on Linux, separate queue for
present-only to fully decouple {dispatch, swap}.
4-post thread, highest-engagement NOTimothyLottes thread in the corpus
(42 likes, 5063 views, 2 reposts). Don't search for the ideal
{presentation,graphics,compute} queue - just use queue 0. AMD: render
via compute on queue 0, present on queue 1, decouple for front-buffer
racing. NVIDIA: queue 1 is DMA, queue 2 is compute; queue 0 = gfx +
present, dispatch on queue 2 by default. Tangent: someone complaining
about the bitmap font in Post 1 looking like a captcha.
6-post thread. Root: commits fully to {if,goto} control flow via
better macros (J_(label) -> goto label; JNzI1_(label,v) ->
if(v!=0) goto label;). Customizes nanorc syntax-highlight to color
them. Tangent: someone suggesting Perl DSL, not invited to the
'better software' conference.
11-post thread. Root: 4-byte overhead interpreter with 64KiB aligned
window of directly-jumpable words (write to ax doesn't change other
48 bits), cuts source size in half. Tangent with @noop_dev covering
cold-cache misses, runtime-macroassembler idea, 4K Atari 2600 emu
precedent. End: GPU code generation for AMD where 8+ bitfields in
an opcode means the simple interpreter won't work.
4-post x86-64 interpreter work: all 0-6 arg syscalls in 32 bytes,
embed interpreter inside words with 3-byte overhead (AD lodsd + FF E0
jmp rax), force lower 32-bit but keep 64-bit, pack interpreted forth
words in aligned 8-bytes. Tangent post 4 from @NOTimothyLottes
self-replying about custom bytecode + on-load decompression.
4 posts, 1 image. Post 1 = the actual content (nasm, ELF64, 4 KiB binary
target, radical Forth, no C baggage). Posts 2-4 = tangent with @furan
about the bitmap font in Post 1's screenshot. gallery-dl pulled the
whole conversation tree.
5-post design walkthrough of a branch-free 8-bit/word color-forth variant
for code generation: ~62 dict entries/page with paging, call/return
inlined by the compiler, branch-free compile + branch-free execution,
lookup-table pre-compile writes unaligned 8-bytes. Intended for tiny
self-contained chunks that include their own codegen. Whitney-esk in
single-char vars, non-Whitney in no higher-order arrays.
3-post companion to 2063733456144597200 + 2076893128515112995: defines
X_ = return, G_ = goto. Moves from C-style {if,while,do,switch,for} to
assembly-style {if,goto} so static branch prediction (backward=taken,
forward=not_taken) is explicit. Plus exit-with-error now properly
drains the background console render thread.
3-post sibling to the 1736161886079533186 VK retrospective: same public-
domain release context, Dec 2023. Covers the mmap-ring-buffer error
logger and the multi-session rationale (crash auto-reload + log
preservation, no debugger).
10-post single-author walkthrough of his old Vulkan pipeline: warm-all-pages
startup, auto-relaunch on crash, single-SPIR-V plus spec-constants, Bind-
Everything-Once, SSBO-as-4-types aliasing, GPU-side game logic, hardware-
style fixed resources. High engagement (36 likes, 3778 views). Closes
with the ruthless-anti-complexity thesis.
6-post single-author walkthrough of the fast-path error-check pattern:
volatile store __LINE__ + error code, TEST, conditional forward branch
to a distant Err() call. Companion to the 2063733456144597200 thread
which established the macro system via the conversation with
@winning_tactic.
Path objects with trailing separators (e.g. './media/') intermittently
failed to glob on Windows after download_media.py had just finished
writing the directory. Normalize via rstrip('/\\\\') before Path()
re-wrapping so the CLI is forgiving regardless of OS path quirks.
Repro: gallery-dl ran + immediate render with trailing slash on the
just-created media/ dir -> glob returned nothing -> markdown emitted
no ![Media N] lines. Removing the trailing slash fixed it; this makes
both work.
Track closed per user direction with PARTIAL completion (17 of 31
tasks done; 13 deferred to followup tracks).
TRACK_COMPLETION_test_suite_cleanup_gemini_cli_removal_20260705.md
records the 12-VC status (7 PASS, 5 NOT DONE / NOT VERIFIED), the
phase-by-phase breakdown, branch state, risks, and hand-off notes.
conductor/chronology.md: Active row updated to 'Partially Completed'
with the commit range + summary of completed/deferred work.
state.toml: status = 'superseded'; current_phase kept at 1 (mid-Phase 1)
to reflect actual stopping point; new [followup_tracks] section
records the two upcoming tracks:
- vendor_ai_client_track (Front C metadata work)
- test_de_crufting_track (Front B cruft work)
These are generated by scripts/generate_type_registry.py based on the
current @dataclass / NamedTuple / TypeAlias declarations in src/. The
regeneration reflects the gemini_cli removal and to_legacy_dict deletion
across ai_client, api_hooks, history, etc.
Per user direction: use real minimax/M2.7 instead of fabricating a
mock provider. 10 sim test files rewritten (3b55bdff).
t1.9 also marked completed (includes the sim test rewrites).
t1.11 (Phase 1 batch checkpoint) still pending until full test suite
is run with API access.
Total Front A tasks: t1.1-t1.6, t1.8, t1.9, t1.10 = 9 of 11 done.
t1.7 cancelled. t1.11 pending.
Per user direction: use a real provider instead of mocks. The 10 sim
tests that previously set current_provider='gemini_cli' + gcli_path to
tests/mock_gemini_cli.py now set:
current_provider='minimax'
current_model='MiniMax-M2.7'
Removed the gcli_path setters (no longer needed). Updated comments
that mentioned 'Use gemini_cli with the mock script'. Updated
test_sim_ai_settings.py provider mock to minimax.
tests/mock_gemini_cli.py + mock_gcli.bat retained as a backstop (no
longer used by any current test). tests/test_cli_tool_bridge*.py
GEMINI_CLI_HOOK_CONTEXT references retained (meta-tooling, separate).
4 phases, 11 tasks: (1) full grok->xai rename across 5 layers, (2) per-vendor
registry sync for 7 vendors against models.dev, (3) cost_tracker verification +
full suite batch, (4) docs sync. TDD red-first per task. Per-vendor commits
in Phase 2 for safe rollback.
to_legacy_dict on NormalizedResponse had zero callers in src/*.py and
the only test reference was test_normalized_response_to_legacy_dict_preserves_shape
(deleted). All 18 other tests in test_openai_schemas.py pass.
Verified: 'grep to_legacy_dict src/' returns nothing.
Spec for renaming the grok vendor to xai (xAI is the vendor; Grok is a
model brand) across all 5 layers, plus a full model registry sync for
all 7 models.dev-mapped vendors against canonical model lists. Hard
cutover on credentials key. gemini_cli untouched.
- test_phase_3_final_verify.py: 6-line tautology that imports
verify_phase_3 from a now-deleted verification module.
- test_mma_skeleton.py: imports generate_skeleton from the deprecated
scripts.mma_exec module (replaced by OpenCode Task tool per workflow.md).
- test_arch_boundary_phase1.py: tests hardcoded-path detection on
deprecated scripts/mma_exec.py + scripts/claude_mma_exec.py.
These were either no-ops or testing now-deprecated infrastructure.
Kept test_arch_boundary_phase2.py + test_arch_boundary_phase3.py
(more recent phase verifications not tied to deprecated modules).
The 2 tests/test_*chronology* files imported from scripts.audit.* modules
that were deleted 2026-07-05 (Tier 1 manual-chronology maintenance); both
were ImportError on collection.
The 7 test_scavenge_*.py files were one-shot verifications of the
2026-07-02/03 directive-lift (specific names exist) — permanently green
tautologies with zero ongoing value.
test_directive_structure.py enforces the general invariant every
directive in conductor/directives has v1.md + meta.md + matching
heading.
ui_gemini_cli_path was removed from AppController.__init__ in t1.3;
this stray setter survived in the test fixture scaffold (no behavioral
test value).
Drop the remaining _update_gcli_adapter monkeypatches from
test_ai_loop_regressions_20260614 (3 sites), test_live_gui_integration_v2
(2 sites), and the gemini_cli_adapter comment references in
tests/test_ai_client_tool_loop_send_func.py, test_lazymodule_filedialog_fallback.py,
and mock_concurrent_mma.py.
Drop stale gemini_cli expectations: PROVIDERS expectations in
test_providers_source_of_truth + test_provider_curation, the
test_list_models_gemini_cli function (deleted the whole file since it
was the only test), the test_discussion_compression_gemini_cli function,
the test_gcli_path_updates_adapter function (its setter was removed),
the ui_gemini_cli_path references in test_mma_tier_usage_reset_fix and
test_rag_integration. These are the t1.9 minor edits.
phase_1.status = in_progress_partial_6_of_11; tasks 1.1-1.6 marked completed with SHAs. Tasks 1.7 (mock provider) through 1.11 (batch run) remain pending. Phases 2 and 3 entirely untouched. current_phase advanced from 0 to 1 to reflect Front A mid-execution.
Tasks 1.1-1.6 cover the bulk of Front A: the gemini_cli adapter module
plus all importer edits (ai_client, app_controller, gui_2,
project_manager, api_hooks) and the 7 dedicated gemini_cli test files.
Remaining Front A tasks (1.7-1.11) cover the mock provider, the 11 sim
test rewrites, the minor test edits, the doc updates, and the batch
checkpoint.
Drop the 11 gemini_cli sites: the ui_gemini_cli_path state field, the
gcli_path settable map entry, the _update_gcli_adapter method, the
project load/save gemini_cli binary_path entries, and the per-provider
gemini_cli guard at startup.
Drop the standalone Gemini CLI adapter from the AI client surface: delete
the import, the PROVIDERS entry, the module state, the 3 functions
(_list_gemini_cli_models, _send_cli_round_result, _send_gemini_cli), and
the 8 dispatch branches. PROVIDERS now has 7 entries; _gemini_sdk
remainder is unaffected.
3 fronts, 3 phases, 31 tasks, 12 verification criteria. Based on 3
parallel explore-agent audits of the live codebase.
Front A — Gemini CLI Adapter Removal: delete src/gemini_cli_adapter.py
+ 7 test files; edit ai_client.py (3 functions + 8 dispatch branches +
PROVIDERS 8->7); edit app_controller.py (~11 sites) + gui_2.py (2 blocks)
+ project_manager.py + api_hooks.py; introduce a mock provider that
routes to tests/mock_gemini_cli.py so the 9 live_gui sim tests switch
from gemini_cli to mock without losing their mock-LLM mechanism; update
7 docs + 5 conductor docs.
Front B — Test Suite Cleanup (410 files, 2,133 tests, ~45-60 files
downsizable): delete 2 guaranteed-broken chronology tests (import from
deleted scripts.audit.*); consolidate 7 test_scavenge_*.py tautologies
into 1 test_directive_structure.py; review deprecated-module tests;
consolidate ~15 test_*_phase*.py one-offs; migrate 27 src.models shim
importers to direct subsystem imports; extract shared mock_controller
fixture from ~8 boilerplate-patch files; fix 3 fix-not-skip candidates
(Gemini 503 in summarize.summarise_file); audit the 120KB
test_gui_2_result.py (9.4% of suite line count in one file).
Front C — Metadata-Type Reduction: flip the 38-site MCP dispatch
inversion (dispatch()+22 consumers still call str wrappers, not the
_result variants); migrate app_controller.py's ~40 in-memory Metadata
state sites to typed per-aggregate dataclasses; fix aggregate.py
file_items: list[Metadata] -> list[FileItem]; delete dead code
(openai_schemas.to_legacy_dict, app_controller._push_mma_state_update).
Out of scope: GEMINI_CLI_HOOK_CONTEXT env var + cli_tool_bridge.py +
mma_exec.py (meta-tooling, not the provider — separate follow-up if
user wants to purge naming).
download_media now shells out to gallery-dl (handles X.com auth/403/video->mp4) instead of urllib, returns the downloaded files, + media_files_for_post glob helper + --cookies CLI. render_markdown embeds images with  and videos with an HTML <video controls> tag (were plain links). extract_corpus uses the package download_media (one download path). Tests rewritten for the gallery-dl API. Corpus: 4 threads, 33 media (32 img embeds + 1 video), 0 missing.
Replaced convert_cookies.py + run_corpus.py + dedupe_corpus.py (+ the scratch merge_corpus.py) with a single extract_corpus.py that: converts cookies, fetches each URL's full conversation, MERGES overlapping conversations into one thread (union of posts, no duplicate threads/media), downloads ALL media (images + video/mp4) via gallery-dl itself (plain urllib 403'd on pbs.twimg.com and never fetched videos), and renders. Result: 4 merged threads, 33 media files (incl mp4), 0 missing links. cookies_netscape.txt gitignored.
fetch_thread_from_url now passes -o conversations=true (full threads, not single tweets), sorts posts chronologically, and sets root_post_id to the URL's target tweet. render_markdown builds front-matter from the target (root_post_id) post, not the earliest conversation tweet (fixes wrong @handle). Added dedupe_corpus.py: keeps deepest thread per conversation, deletes duplicates, keeps+marks unique branches (branch_of) + writes threads_index.json. 33 tests pass.
Script used calendar-day duration (end_date - init_date), which
inflated tracks that sat dormant between work and archive-move.
Example: external_editor_integration_20260308 reported 60 days
(init 2026-03-08, last archive-move 2026-05-07) when actual work
was 2 active days.
Corrected metric: active days = distinct calendar days with at
least one commit touching the track folder. All 30 top tracks
now show 2-7 active days, matching the user's expectation that
no track lasts more than a week.
Also fixed commit_count + files_touched for all 30 tracks (the
script's work-prefix-only count was always 0-1 for these).
Top 3 examples:
- external_editor_integration_20260308: 60d/1c/4f -> 2d/4c/8f
- code_path_audit_20260607: 18d/1c/7f -> 7d/23c/14f
- nagent_review_20260608: 12d/0c/20f -> 3d/53c/20f
Still stale (need recompute, not hand-fix):
- 3.1 per-era aggregates
- 8 use-case predictions
- 218 other tracks not in top-30
The script's commit_count and files_touched columns only counted
work-prefix commits (feat|fix|refactor|perf|test) with pathspecs
matching the track folder. Track folders contain only metadata
commits (conductor(*), chore(conductor), docs(track)), so the
script reported 0 commits for any track that did real work.
Corrected rows (now using total commits + total unique files
touching the track folder, any prefix):
- code_path_audit_20260607: 1->23 commits, 7->14 files
- qwen_llama_grok_integration_20260606: 0->25 commits, 4->8 files
- nagent_review_20260608: 0->53 commits, 4->20 files
- data_oriented_error_handling_20260606: 0->21 commits, 4->8 files
- superpowers_review_20260619: 0->63 commits, 8->16 files
Added 9.1 caveat explaining the manual corrections and the
methodology error that caused them.
thread_from_dict (JSON wire boundary) round-trips thread_data.json; download_media/render_markdown gain argparse main() + __main__ so the plan Task 5.3 pipeline runs via -m; dual-import added so all modules run standalone or via -m (G5). Pipeline integration test (html->names->render) + CLI tests cover the glue without network. TDD: red -> green (4 pipeline + 29 regression = 33 passed).
- Move conductor/tracks/meta_tooling_duration_analysis_20260705/ to
conductor/archive/meta_tooling_duration_analysis_20260705/ (preserves
history as a directory rename since the spec/plan/metadata files were
uncommitted; they're added to the archive in this commit).
- Prepend the track's row to conductor/chronology.md (newest-first).
- Note: spec.md, plan.md, metadata.json, state.toml are being committed
for the first time in this archive commit. Per project convention,
spec + plan are committed at archive time per workflow.md chronology
maintenance rules.
Added standalone Result[T] (frozen+slots, ok/err classmethods, is_ok) to error_types.py per canonical AND-over-OR error_handling.md (not the video_analysis _Ok|_Err sum type). render_markdown renders YAML front-matter from root post, per-post ## sections with reply markers, quote blockquotes, and ./media/<name> links; media_names mapping keeps render decoupled from download_media. TDD: red (no Result) -> green (7 render + 9 types passed).
The original build_track_index spawned 5+ git subprocesses per track
folder (244 tracks * 5 calls = 1200+ subprocesses). That exceeded the
120s NFR1 budget. Replaced with a single 'git log --all --name-only'
pass + a mutable _TrackAccumulator; reduces git subprocess count from
1200+ to 1.
Also adds 3 smoke tests for build_subagent_task_index,
build_session_index, build_track_index (covering previously untested
pure-function indexers). 23 tests pass; coverage up from 39% to 61%.
Scripts + workflow for extracting Twitter/X posts and threads into
Markdown with associated media. Mirrors the scripts/video_analysis/
pattern. Standalone requirement: zero imports from src/, conductor/,
or scripts.video_analysis — copy-pasteable to another repo with only
gallery-dl as the external dep.
5 modules: __init__.py, error_types.py (Result[T, ErrorInfo] +
ThreadData/PostData typed dataclasses), fetch_thread.py (gallery-dl
subprocess for URLs + html.parser fallback for local HTML),
download_media.py (stdlib urllib, idempotent), render_markdown.py
(YAML front-matter + per-post sections + ./media/ links).
Reference project: C:\projects\forth\bootslop — the corpus feeds
bootslop's scripts and reference-generation pipeline. Acceptance
corpus: 8 threads (@NOTimothyLottes x6 + @VPCOMPRESSB x2) extracted
to tests/artifacts/twitter_threads_corpus/. The ?s=20 quote-share
suffix on the @VPCOMPRESSB URLs must be stripped by fetch_thread.py
before acquisition (added to FR2 as URL normalization).
5 phases / 23 tasks. 8 verification criteria (VC1-VC8). TDD red-first
on the pure-function modules (render_markdown, types, media naming).
Deleted scripts/audit/generate_chronology.py + chronology_quality_gate.py
after repeated corruption incidents (auto-classifier drifted from
user intent, silently rewrote rows). chronology.md is now maintained
by hand: add a row at the top when a track ships/abandons/is archived.
Updated conductor/workflow.md §Chronology Maintenance and
conductor/tracks.md §Archiving a track to reflect manual maintenance.
Added 40 rows to conductor/chronology.md for the 2026-07-05 archive
batch, with archive-folder paths and deferral notes where applicable.
Removed 12 archived-track rows from conductor/tracks.md Active Tracks
table (rows 2, 3, 7c, 16, 17, 23b, 23c, 23d, 25, 26, 29, 29c) and
their track-detail anchors.
Wrote docs/reports/ARCHIVE_REVIEW_20260705.md: a categorized index
of unfinished work items from the archived tracks' state.toml files
that remain relevant to the codebase, with a ranked follow-up list.
Per agent_directives_consolidation_20260705 §3.4.
The 14-line §Data Structure Conventions section (the 'names for shapes'
pattern intro + the 16-alias list + canonical reference) is replaced
with a 1-line pointer to conductor/code_styleguides/type_aliases.md,
the canonical home for the 10 TypeAlias definitions + 11 per-aggregate
dataclasses + 5-pattern decision tree.
Net: 14 lines reduced to 1 line of pointer. The type-registry
auto-generation note (docs/type_registry/) is preserved as unique
project information.
Phase 3.2, 3.3, 3.4 all complete in this single commit batch.
Per agent_directives_consolidation_20260705 §3.4.
The 30-line §Data-Oriented Error Handling section (key principles +
incremental rollout plan + audit-script enforcement) is replaced with
a 1-line pointer to conductor/code_styleguides/error_handling.md, the
canonical home for the Result[T] + NIL_T convention.
Net: 30 lines reduced to 1 line. Duplicate content removed; the
canonical styleguide remains the source of truth.
Per agent_directives_consolidation_20260705 §3.4.
The 2 duplicate bullets (Indentation, Newlines) are replaced with a
1-line pointer to conductor/code_styleguides/python.md §1, the
canonical home for Python style. The 4 project-specific bullets
(Vertical Compaction, Region Blocks, Type Hinting, SDM) are
preserved — they are unique to this project.
Net: 6 lines reduced to 1 line of pointer + 4 preserved bullets.