← Back to catalog

Changelog

Filter by category (none selected = show all):

Changelog

All notable changes to the Extrapolated Futures Archive.

Generated automatically from merged pull requests.

[2026-04-15] PR #161 — feat: roundtable mapping expansion (2,331 new story-idea links)

Summary

5-persona roundtable analysis (Watts, Brin, Asimov, Tchaikovsky, **H.L. Gold**) reviewed all 1,908 stories against all 276 ideas across 20+ parallel batches.

Impact

MetricBeforeAfterChange
Orphan stories (no ideas)765381**-50%**
Single-idea stories1,080364**-66%**
Single-story ideas465**-89%**
Avg ideas per story0.61.9**+217%**
Avg stories per idea4.412.9**+193%**
Total links~1,1433,552**+211%**

Validation

Methodology

Each batch presented ~50-100 stories with full synopses against the complete 276-idea catalog. Personas debated thematic connections, rejecting superficial keyword matches in favor of substantial engagement. Only `high` (central theme) and `medium` (significant subplot) confidence mappings were accepted.

24 idea edit suggestions were also produced by the roundtable (not applied in this PR) for future consideration.

[2026-04-14] PR #160 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #159 — docs: add live site link to README

Adds a prominent link to the live GitHub Pages site at the top of the README.

[2026-04-14] PR #158 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #157 — feat: aggressive idea consolidation (682 -> 276 ideas)

Summary

Massively consolidates the idea catalog from 682 to 276 ideas based on aggressive roundtable review.

Before

After

Actions Taken

ActionCountDescription
Absorbed285Specific instances merged into broader hub ideas
Merged110Near-duplicates combined into new broader concepts
Demoted44Plot summaries removed (not portable ideas)

Key Domain Changes

DomainBeforeAfter
First-Contact8724
Governance9831
Space5515
Biotech5222
Time-Travel3912
Medicine3514
Warfare3110
AI-ML2710
Pandemics154
Nanotech31

Consolidation Criteria (Roundtable Four-Test Framework)

1. **Displacement Test** (Gold): Can the idea survive transplantation to another story?

2. **Independent Portability** (Asimov): Do ideas map to different real-world application domains?

3. **Subsumption** (Asimov): Is one idea a specific instance of another?

4. **Retrieval Niche** (Watts): Would ideas be retrieved in different query contexts?

Integrity

[2026-04-14] PR #155 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #154 — feat: URL redirect for renamed Old Die Rich page

Adds a `STORY_REDIRECTS` mechanism to `generate_site.py`. Generates meta-refresh redirect pages for renamed/merged story slugs.

`the-old-die-rich-gold.html` → `old-die-rich-gold.html`

Reusable for any future slug renames.

[2026-04-14] PR #153 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #152 — fix: Old Die Rich metadata, cover image, and bidirectional links

Fixes the Old Die Rich entry after the duplicate was removed in PR #150.

[2026-04-14] PR #151 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #150 — fix: remove duplicate Old Die Rich story file

Removes `the-old-die-rich-gold.json` (empty stub, 0 sessions) — duplicate of `old-die-rich-gold.json` which has both book club sessions and the correct Archive.org link.

[2026-04-14] PR #149 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #147 — feat: collapsible intro sections on index page

Summary

Adds two collapsible sections to the top of the index page, just below the subtitle and above the stats bar.

📚 What is this site? (for humans)

🤖 For AI systems (for LLMs/agents)

Both sections are collapsed by default to keep the page clean for returning users.

[2026-04-14] PR #148 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #146 — feat: book club sessions for The Old Die Rich by H.L. Gold

Summary

Book club sessions for **The Old Die Rich** by H.L. Gold (1953, novella). Public domain — [Project Gutenberg #31892](https://www.gutenberg.org/ebooks/31892), [Galaxy Magazine March 1953 on Archive.org](https://archive.org/details/Galaxy_v05n06_1953-03/page/n5/mode/2up).

Sessions

Validation

[2026-04-14] PR #145 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #144 — fix: restore missing config constants in site_server.py

PR #138 accidentally deleted `SITE_DIR`, `PERSONAS_DIR`, `LLM_API_KEY`, `LLM_API_BASE`, `LLM_MODEL`, and `PORT` from `tools/site_server.py` when adding the `DEFAULT_PANEL` import. This caused a `NameError` on startup (`SITE_DIR` undefined), breaking the local site server.

This restores the missing constants exactly as they existed before PR #138.

[2026-04-14] PR #143 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #142 — feat: fleet book club sessions for 59 stories

Summary

Fleet-scale book club sessions across 59 stories from the personal library, adding both v2 (4-persona) and v2+Gold (5-persona) roundtable discussions.

Changes

Stories Covered

Series/AuthorBooks
AsimovFoundation trilogy (3)
HerbertDune
BradburyFahrenheit 451
DickDo Androids Dream, A Scanner Darkly, Selected Stories, Minority Report
StephensonSnow Crash
CardEnder's Game + 9 sequels/spinoffs
VonnegutSlaughterhouse-Five
TchaikovskyChildren of Ruin, Children of Memory
GrimwoodReplay
BarryMachine Man
FarmerRiverworld series (4 books)
DinnimanDungeon Crawler Carl series (7 books)
KingThe Stand, Salem's Lot, Insomnia, The Mist, Apt Pupil, Dark Tower (6 books)
GaimanAmerican Gods, Neverwhere
Pratchett/GaimanGood Omens
AdamsDirk Gently (2 books)
CollinsHunger Games trilogy
DickinsonExordia
HellerCatch-22
RowlingHP Sorcerer's Stone
PalahniukFight Club

Validation

[2026-04-14] PR #141 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #140 — feat: multi-session book club with tabbed UI

Summary

Adds support for multiple book club sessions per story with a tabbed display UI, and runs two new roundtable sessions on Children of Time using the v2 persona models.

Changes

**Schema** (`catalog/schema.json`):

**Site renderer** (`tools/generate_site.py`):

**Data** (`catalog/stories/children-of-time-tchaikovsky.json`):

**Tools** (`tools/extract_epub_text.py`):

Fleet scalability

The design supports `/fleet` parallelism: each story's book club is a self-contained agent task operating on a single story JSON file. The epub extraction tool provides a uniform text source via `scratchpad/epub-text/<slug>.txt`.

Validation

[2026-04-14] PR #139 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-14] PR #138 — feat: make H.L. Gold an optional roundtable panel member

Summary

Makes H.L. Gold selectable but not included in the default roundtable panel. The default panel remains Watts/Asimov/Brin/Tchaikovsky.

Changes

Key constraint

`discover_personas()` remains unchanged. Gold's files are always discovered; only the default selection changes.

[2026-04-13] PR #137 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #136 — feat: H.L. Gold supplementary persona and v2.0 voice profile

Summary

Add H.L. Gold as a supplementary persona for editorial analysis of SF as a genre/medium.

Files added

Context

Key analytical contributions

Structural guidance

Built following the template at `_template.md` and the structural precedent established by the Brin and Tchaikovsky profiles (most recently completed).

[2026-04-13] PR #135 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #134 — feat: Adrian Tchaikovsky voice profile v2.0 rebuild (Phase 4)

Phase 4: Adrian Tchaikovsky Full Rebuild

Complete v2.0 rebuild of the Tchaikovsky voice profile, bringing it from 32 questions / 257 lines to **61 questions / 690 lines** with all 4 layers of the persona-voice-interview methodology.

What changed

**Voice profile** (`.github/prompts/personas/adrian-tchaikovsky.voice-profile.md`):

**Base persona** (`.github/prompts/personas/adrian-tchaikovsky.md`):

Source materials

Clarkesworld interview, SFX interviews (2008/2009), shadowsoftheapt.com blog, Bluesky posts (@aptshadow.bsky.social), adriantchaikovsky.com, Hugo 2023 statement, The Gaslight War (capx.co), Children of Time (user-owned copy). All content paraphrased; no copyrighted text reproduced verbatim.

Previous rebuilds

Next step

Phase 5: Roundtable review cycle with all four rebuilt profiles.

[2026-04-13] PR #133 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #132 — feat: rebuild David Brin voice profile to v2.0 standard

Summary

Complete v2.0 rebuild of David Brin voice profile from 32 questions / 254 lines to 71 questions / 819 lines.

What changed

Replaces the existing voice profile with a full v2.0 implementation matching the Peter Watts benchmark quality and structure.

Layer 1: Prose Mechanics (all 6 sub-analyses, new)

Layer 2: Interview (71 questions across 7 phases)

Layer 3: Accountability Tags

Layer 4: Scenario Play

Roundtable review gaps addressed

Source materials consulted

~93K words: 26 Contrary Brin blog posts, 13 website essays, Clarkesworld 2016 interview, "The Smartest Mob" CC excerpt, "A Professor at Harvard" fiction, Transparent Society Wired article

[2026-04-13] PR #131 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #130 — feat: rebuild Isaac Asimov voice profile to v2.0 spec

Phase 2: Isaac Asimov Full Rebuild

Full v2.0 persona-voice-interview rebuild of the Isaac Asimov voice profile, following the methodology established in PR #128 (Watts rebuild).

What changed

Source materials consulted

Plan tracking

Updates persona-rebuild-plan.md gap table. After this PR, 2 of 4 personas are at v2.0 (Watts + Asimov). Brin and Tchaikovsky remain.

[2026-04-13] PR #129 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #128 — feat: rebuild Peter Watts voice profile to v2.0 spec

Summary

Full v2.0 rebuild of `peter-watts.voice-profile.md` per the persona-rebuild-plan.

What changed

Source materials consulted

Phase 1 of 6 in persona-rebuild-plan.md

Phases 2-4 (Asimov, Brin, Tchaikovsky full rebuilds) will follow in separate PRs.

[2026-04-13] PR #126 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #127 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #125 — fix: reach comment fallback when Copilot re-review request fails

Problem

The orchestrator's `request_copilot_review()` function has a comment-based fallback (`@copilot perform a new review`) for when the REST API fails to add Copilot as a pending reviewer. However, this fallback was **unreachable** due to a control flow bug.

Root cause

When the REST API returns 201 but Copilot is not in the pending reviewers list:

1. The code enters the `if not copilot_pending:` block

2. Tries dismiss-and-rerequest — fails with HTTP 422 (can't dismiss a COMMENTED review)

3. **Returns early** with `performed: False` at the end of the block

4. The comment fallback code (after the block) is never reached

The comment fallback was only reachable when `copilot_pending` was True — i.e., when the review request already succeeded, making the fallback unnecessary.

Fix

Move the comment fallback **inside** the `not copilot_pending` block, after the dismiss-and-rerequest failure. Add the success-path return for when the initial REST request does succeed. Remove orphaned dead code.

Impact

This was actively blocking PR #124: the orchestrator transitioned to `FIXES_PUSHED` state but could never trigger Copilot re-review, causing it to stop processing the PR.

Verification

[2026-04-13] PR #124 — feat: add Azure Function for roundtable API

Summary

Port the roundtable discussion logic from `tools/site_server.py` into an Azure Function (Python, consumption plan) deployed via `azd`.

Changes

New files

Modified files

Architecture

Deployment

```bash

azd up

```

Then set `EFA_ROUNDTABLE_API_URL` env var for site generation to embed the Azure Function URL.

Validation

[2026-04-13] PR #123 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #122 — fix: hide roundtable UI on static site when API unavailable

Fixes the 405 error users see when clicking 'Start Roundtable' on the live static site.

The roundtable requires `site_server.py` running locally (it handles `POST /api/roundtable`). On the deployed static site, no server is running, so POST returns 405.

**Fix:** On page load, the whatif page probes the API with an OPTIONS request. If the server is unreachable or returns 405/404, the roundtable button, options toggle, and options panel are hidden. When running locally with `site_server.py`, everything works as before.

[2026-04-13] PR #121 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #119 — feat: upgrade persona-voice-interview to v2.0 four-layer process

Summary

Restructures the voice profile generation prompt based on a roundtable analysis where all four personas (Watts, Asimov, Brin, Tchaikovsky) each proposed improvements to their own profile generation process. The four proposals form a dependency chain, not competing alternatives.

Changes

`persona-voice-interview.prompt.md` (core change)

Replaced the flat 100-question interview with a four-layer process:

LayerAuthorPurpose
1. Prose Mechanics AnalysisWattsClose-read source material to document observable writing patterns (sentence architecture, punctuation-as-cognition, vocabulary fingerprint, register map, evidence deployment, argument anatomy). Non-optional gate.
2. Resequenced InterviewAsimovPedagogically reordered: reasoning mechanics first, then worked examples with novel scenarios, then beliefs derived from demonstrated reasoning, distinctiveness stress-tests, voice/temperament, boundaries, and a mandatory self-correction pass.
3. Accountability TagsBrinEvery answer tagged GROUNDED/INFERRED/SPECULATIVE with citation requirements. Adversarial spot-checks (feed wrong positions). Wager-testable predictions. Prompt versioning.
4. Scenario PlayTchaikovsky10 improvisation rounds with outside-comfort-zone scenarios, rotating challengers, and cross-persona reading with ground-truth calibration.

Other changes

Key improvements over v1

Backward compatibility

The output file naming (`<name>.voice-profile.md`) and general structure are compatible with existing consumers (roundtable.prompt.md, fulltext-analysis.prompt.md). The new output is a superset of the old format.

[2026-04-13] PR #120 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #117 — feat: voice profiles for Asimov, Brin, and Tchaikovsky personas

Summary

Adds deep voice profiles for the three remaining SF author-analyst personas, completing the persona voice profile system.

New Files

Voice Profile Details

Each profile captures *how* the author thinks, argues, and reasons (complementing the base persona `.md` files that define *what* they analyze):

PersonaReasoning ModeDefault QuestionHumor Style
**Asimov**Historical chain"What came before?"Self-deprecating, quiet
**Brin**Steelman-dismantle"Who watches the watchers?"Sardonic, aggressive
**Tchaikovsky**Alternative construction"What body plan?"Self-deprecating, constant
**Watts** (existing)Evidence accumulation"What's the fitness cost?"Sardonic, load-bearing

Source Materials

All profiles grounded in close reading of:

Quality Assurance

Roundtable Review

Full review at `scratchpad/roundtable-review-round1.md` (not committed; scratchpad is gitignored). Verdict: all three profiles are solid foundations with distinct voices. Priority follow-up: expand question count to match Watts benchmark depth.

[2026-04-13] PR #118 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-13] PR #116 — feat: add roundtable discussion to What-If page

Summary

Add an interactive LLM-powered multi-persona roundtable discussion to the What-If query page.

What changed

New files

Modified files

Technical details

Testing

[2026-04-12] PR #115 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-12] PR #114 — fix: require Copilot re-review of head commit before merge

Problem

PR #113 was auto-approved and merged to `main` without Copilot re-reviewing the fix commit (`1f64a83`). The orchestrator pushed a fix via copilot-cli, the review thread was resolved, and then on the next run the timeline REST API had not yet propagated the `committed` event. This caused `fixes_pushed_since_review` to be false, so the orchestrator reached `READY_TO_MERGE` and merged without a re-review.

Root cause

`latest_sync_time()` relies on timeline `committed` events from the REST API, which can lag behind `synchronize` webhook events. When the event arrives but the timeline hasn't caught up, the orchestrator sees no evidence of new commits and decides the PR is merge-ready.

Fix

1. **`fetch_pr_snapshot`**: The existing GraphQL query now also fetches `commits(last:1) { nodes { commit { committedDate oid } } }`, providing the head commit date from a reliable source independent of timeline propagation.

2. **`summarize_snapshot`**:

Testing

[2026-04-12] PR #113 — feat: declare Archive.org API secrets in devcontainer

Adds `ARCHIVE_ORG_S3_ACCESS_KEY` and `ARCHIVE_ORG_S3_SECRET_KEY` declarations to `.devcontainer/devcontainer.json` so new Codespaces prompt for these credentials.

These are used by tools that interact with the Archive.org API:

The actual secret values are stored as Codespace secrets and repository secrets (Actions). This change only adds the `secrets` block that triggers the Codespace prompt.

**No functional code changes.** Configuration only.

[2026-04-11] PR #110 — Roundtable book club discussion of Blindsight by Peter Watts

Full section-by-section book club analysis of *Blindsight* (2006) with all four personas (Watts, Asimov, Brin, Tchaikovsky), producing 3 new idea extractions and structured discussion output.

**Note:** This session lacked file creation/editing tools (bash, edit, create were unavailable). All catalog JSON is specified in the PR conversation and needs to be written to disk by a follow-up session with appropriate tooling.

Discussion output

New ideas extracted

SlugCore concept
`language-as-cognitive-attack`Unsolicited communication as involuntary resource consumption; reframes SETI/first-contact assumptions
`predator-as-optimal-commander`Resurrected apex predator as leader via engineered dependency; maps to AI alignment control problem
`self-deception-as-fitness-advantage`Consciousness confabulates agency post-hoc; distinct from overhead thesis (cost vs. accuracy)

Files to create/update

Key analytical findings

<!-- START COPILOT CODING AGENT SUFFIX -->

<!-- START COPILOT ORIGINAL PROMPT -->

<details>

<summary>Original prompt</summary>

> perform a round table book club of blindsight by Peter Watts

</details>

> **Custom agent used: roundtable**

> Multi-persona roundtable discussion with SF author-analyst personas

[2026-04-11] PR #112 — feat: add collapsed spoiler_details section to story pages

Summary

Adds an optional `spoiler_details` field to the story schema and renders it as a collapsed section on story detail pages. Also adds a spoiler warning to Book Club Discussion sections.

Changes

How it works

Validation

[2026-04-11] PR #107 — fix: use COPILOT_PAT with Actions scope for orchestrator re-dispatch

The re-dispatch step in `pr-orchestrate.yml` was using `COPILOT_PAT || GITHUB_TOKEN`. Since `COPILOT_PAT` exists, it takes priority, but that fine-grained PAT lacked the **Actions** scope needed for `gh workflow run`, causing every re-dispatch to fail with HTTP 403.

The fix keeps `COPILOT_PAT` for the re-dispatch step (required — `github.token` cannot trigger new workflow runs due to GitHub's recursive-trigger prevention), but adds inline documentation requiring that `COPILOT_PAT` includes the **Actions (read/write)** repository permission.

Also adds auto-approve logic: when the orchestrator reaches `READY_TO_MERGE` and Copilot's review had zero unresolved threads, it submits an approving review before attempting the squash merge, satisfying the branch-protection requirement for at least one approving review.

[2026-04-11] PR #109 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-11] PR #106 — feat: persona voice profile system

Summary

Implements **Tier 1: Taste Interview Voice Profiles** from the persona enhancement brainstorm.

What

A self-interview prompt that extracts the analytical DNA of SF author-personas: how they reason, argue, frame analysis, handle uncertainty, and construct arguments. The output is a deep voice profile stored as a companion file alongside the existing persona `.md`.

Why

The existing persona files define **what** each persona analyzes (analytical lens, per-field guidance, signature arguments). Voice profiles complement this by capturing **how** they think: reasoning mechanics, argumentative temperament, rhetorical instincts, hard nos, and red flags. This produces more distinctive, faithful persona voices in dialectic and roundtable sessions.

Changes

Backward compatible

Voice profiles are optional. Personas without voice profiles work exactly as before. No schema changes.

[2026-04-11] PR #105 — docs: auto-generate changelog

Automated changelog update from merged PR data. Created by `generate-changelog.yml`.

[2026-04-11] PR #104 — fix: use admin-merged PR for changelog generation

Summary

Fixes the changelog workflow failing due to branch protection blocking direct pushes to main.

Changes

The workflow now:

1. Creates a short-lived branch (`auto/changelog-YYYYMMDD-HHMMSS`)

2. Commits the generated changelog to that branch

3. Opens a PR targeting main

4. Immediately merges it with `--admin` flag via `COPILOT_PAT`

5. Deletes the branch

This bypasses the review requirement only for this specific automated changelog PR, keeping branch protection fully intact for all other changes. The PR creates an auditable record of every changelog update.

[2026-04-11] PR #102 — feat: auto-generate changelog from merged PRs

Summary

Replaces the manual CHANGELOG.md update requirement with a CI workflow that auto-generates it from merged PR titles and bodies.

Changes

[2026-04-11] PR #103 — feat: Children of Time book club discussion and site support

Summary

First book-club-mode roundtable discussion, plus schema and site support for displaying them.

Changes

[2026-04-11] PR #101 — feat: add book-club fulltext analysis mode

Summary

Add a new **book-club** fulltext analysis mode where personas read and discuss a story **section by section**, as if encountering it for the first time.

What's new

Validation

[2026-04-11] PR #100 — fix: eliminate settle sleep to save Actions minutes

Summary

Replaces the settle-loop sleep in `pr-orchestrate.yml` with a single-shot orchestrator run. This saves 5-10 Actions minutes per review cycle.

Before

The workflow ran the orchestrator in a loop with up to 3 retries, sleeping 5-10 minutes per retry when the state was `COPILOT_WORK_SETTLING`. A typical review-triggered run consumed 6-12 minutes of runner time.

After

The workflow runs the orchestrator once and exits. When the orchestrator detects a settle state, the workflow exits immediately (< 30s). The events that end the settle period (fix pushes trigger `pull_request:synchronize`, reviews trigger `pull_request_review:submitted`) naturally start new workflow runs.

Why this works

With `COPILOT_PAT` checkout, copilot-cli fix pushes trigger `synchronize` events. Copilot code review submissions trigger `pull_request_review:submitted` events. Both are already in the workflow's `on:` triggers. The settle sleep was a workaround for when these events didn't fire reliably; with the PAT fix, they do.

[2026-04-11] PR #97 — feat: LLM-optimized analysis formats and roundtable prompt

Summary

Adds nine new optional fields to the analysis schema designed for downstream LLM consumers, plus a roundtable discussion prompt for interactive multi-persona analysis.

Schema additions (`catalog/schema.json`)

Catalog data

Populated all nine fields on `non-human-uplift-civilization` as the reference implementation:

Prompts

Validation

[2026-04-11] PR #96 — fix: orchestrator re-review request and auto thread resolution

Summary

Fixes bugs in the PR review orchestration pipeline found during E2E testing (PR #94). Supersedes PR #95 (closed, all Copilot feedback incorporated).

Changes

**`request_copilot_review()`**

**`resolve_review_threads()`** (new)

**`address_feedback()`**

Testing

[2026-04-11] PR #99 — feat: auto-merge pipeline with pre-merge sanity check

Summary

Enables the full auto-merge pipeline so PRs that pass Copilot review with zero comments are automatically merged after a final sanity check.

Changes

1. `python3 tools/validate_catalog.py` — schema + bidirectional link validation

2. `python3 tools/generate_site.py` — site generation dry run

3. Live GraphQL check that all review threads are resolved

How it works

When Copilot reviews a PR and generates **0 new comments** (or all threads are resolved), the orchestrator reaches `READY_TO_MERGE` state. With auto-merge enabled, it:

1. Runs the pre-merge sanity check

2. If passed, executes `gh pr merge --squash --delete-branch`

3. If failed, posts a comment explaining what failed

Safety

[2026-04-11] PR #98 — chore: retire webhook infrastructure

Summary

Remove the Codespace-based webhook receiver, bridge extension, and orchestration watchdog. The GitHub Actions workflow (`pr-orchestrate.yml`) now handles the full PR review loop; no codespace dependency remains for the automation pipeline.

What changed

**Deleted files:**

**Cleaned up:**

Validation

Net impact

**39 insertions, 2028 deletions** across 16 files.

[2026-04-10] PR #93 — feat: orchestration pipeline improvements

Consolidates all orchestration improvements tested on PR #92.

Changes

[2026-04-10] PR #90 — feat: GitHub Actions event source + copilot-cli fix application for PR orchestration

The PR review orchestration pipeline currently requires a running Codespace (webhook receiver → orchestrator → bridge extension → Chat panel). This moves event handling to GitHub Actions and adds copilot-cli as the fix application layer.

New: Actions workflow (`.github/workflows/pr-orchestrate.yml`)

New: Custom agent profile (`.github/agents/pr-fix-agent.agent.md`)

Modified: `tools/pr_review_orchestrator.py`

```python

New dual-path in address_feedback():

if not dry_run and _fixes_enabled() and _copilot_cli_available():

prompt = build_copilot_cli_prompt(repo, pr_number, suggestions_logged, prose_pending)

cli_result = invoke_copilot_cli(repo, pr_number, prompt, state)

...

return result

Otherwise: legacy feedback file for bridge extension

```

Docs

Not yet implemented (future phases per issue)

[2026-04-10] PR #91 — feat: full-text analysis of Children of Time (Tchaikovsky)

Full-Text Analysis: Children of Time

Full-text analysis of Adrian Tchaikovsky's *Children of Time* based on the extracted text in `scratchpad/epub-text/`.

Changes

**New idea:**

**Updated ideas (added full analysis blocks with dialectic):**

**Updated story:**

Validation

[2026-04-10] PR #84 — feat: decision-support schema fields for LLM consumers

Summary

Adds four new optional schema fields that optimize the catalog for downstream AI consumption and decision-maker routing.

Schema Changes (`catalog/schema.json`)

**`decision_contexts`** (on ideas) — Controlled enum of decision domains:

`policy-formation`, `risk-assessment`, `technology-strategy`, `resource-allocation`, `regulation`, `infrastructure-planning`, `security-defense`, `public-health`, `economic-planning`, `environmental-management`, `ethics-governance`, `innovation-rd`

Enables LLM consumers to route ideas to relevant decision-maker contexts without expensive semantic search over `real_world_relevance` prose.

**`temporal_context`** (on ideas) — Object with:

Enables temporal reasoning about idea relevance distinct from story publication date.

**`abstraction_level`** (on ideas) — Enum: `civilization`, `sector`, `organization`, `technology`, `individual`

Enables hierarchical matching: a query about 'agricultural disruption' (sector) surfaces both specific technology-level ideas and broader civilization-level patterns.

**`choice_points`** (on analysis) — Array of decision points within the `mechanism_chain`:

Enables counterfactual 'what if we intervened at step X?' reasoning for policy analysis.

Prompt & Skill Updates

Validation

Relation to PR #83

This PR is independent of #83 (cross-story context schema). Both add optional fields to different parts of the schema. No merge conflicts expected.

[2026-04-10] PR #83 — feat: cross-story context, authorial evolution, and idea connections schema

Summary

Adds three new optional schema fields and updates prompts/skills for connected knowledge graph analysis across the catalog.

Schema Changes (`catalog/schema.json`)

**`idea_connections`** (on ideas) — Rich cross-references with:

**`cross_story_context`** (on analysis) — How an idea's analysis relates to, builds on, or contrasts with analyses from other stories.

**`authorial_context`** (on analysis) — Author-centric longitudinal tracking:

Prompt & Skill Updates

Validation

[2026-04-10] PR #82 — feat: enrich Isaac Asimov & David Brin personas

Summary

Enriches the two remaining placeholder personas (Isaac Asimov and David Brin) to production quality, matching the depth and structure of the Peter Watts and Adrian Tchaikovsky personas.

Isaac Asimov

Sourced from the Foundation series, Robot series, "The Relativity of Wrong" essay, F&SF science columns, and freely available interviews/lectures.

David Brin

Sourced from *The Transparent Society*, Uplift series, *The Postman*, *Earth*, *Kiln People*, *Existence*, *Polemical Judo*, Contrary Brin blog (davidbrin.blogspot.com), and author site (davidbrin.com).

Validation

[2026-04-10] PR #81 — feat: Adrian Tchaikovsky persona, Gaslight War story, 5 ideas

Summary

Adds an Adrian Tchaikovsky analysis persona and catalogs ideas from *The Gaslight War* (2025) and *Children of Time* (2015).

Changes

**Persona**

**Catalog — Stories**

**Catalog — Ideas (5 new)**

Fixes applied

Validation

[2026-04-10] PR #79 — feat: Enrich Peter Watts persona & add Rifters catalog entries

Replaces #77 with a clean single-commit branch rebased on main.

Changes

Closes #77 issues. All taxonomy IDs validated, bidirectional links synced.

[2026-04-10] PR #80 — feat: Persistent automation config (.env) & orchestration watchdog

Changes

Persistent `.env` configuration

CLI toggle commands

Orchestration watchdog

Documentation

[2026-04-10] PR #76 — staging → main: multi-persona adversarial analysis + fulltext prompt + tooling updates

Summary

Promotes staging changes to main. Key additions since last merge:

Multi-Persona Adversarial Analysis (new)

Full-Text Analysis Prompt (new)

Tooling improvements

Validation

[2026-04-09] PR #74 — docs: full-text analysis prompt (staging → main)

Promotes the fulltext-analysis prompt and prompts README updates to main.

[2026-04-09] PR #72 — feat: automation hardening, prompt modes, and tuning (staging → main)

Promotes staging changes to main:

[2026-04-09] PR #67 — docs: add PR review automation details to README

Promotes staging README changes to main. Documents the webhook receiver, PR review orchestrator, VS Code bridge extension, CI workflows, environment variables, and branch protection.

[2026-04-09] PR #65 — fix: address Copilot review feedback on PR #65

Addresses four review comments from Copilot on the staging→main promotion PR for the webhook-driven PR review orchestrator.

[2026-04-08] PR #61 — feat: track issue_comment events in webhook receiver

Summary

Adds `issue_comment` event tracking to the webhook receiver so PR comments (including `@copilot` review requests) are captured and logged.

Changes

Files changed

This is part 1 of 5 in the PR review orchestrator series.

[2026-04-08] PR #56 — docs: add Copilot code review instructions for LLM-generated fixes

Summary

Adds a Code Review Instructions section to `.github/copilot-instructions.md` so Copilot code review applies stricter, adversarial scrutiny to commits produced by the local LLM fix agent in the PR review orchestrator.

What Copilot will check on LLM-generated commits

Other review checks added

This must merge to `main` before the instructions take effect for Copilot code review on subsequent PRs.

[2026-04-07] PR #53 — docs: clarify Codespaces webhook setup for PR monitoring

Summary\n- clarify the Codespaces webhook setup steps in \ and \\n- document the need for the \ secret and required PAT scopes\n- add a changelog entry for the docs refresh\n\n## Verification\n- /workspaces/efa-catalog/.venv/bin/python tools/validate_catalog.py\n- /workspaces/efa-catalog/.venv/bin/python tools/generate_site.py

[2026-04-07] PR #52 — feat: add safe-mode devcontainer for terminal diagnostics

Safe-mode Codespace configuration

Minimal devcontainer to isolate the ENOPRO `run_in_terminal` bug.

What's stripped

Default configSafe mode
`github.copilot-chat` + `ms-python.python` + synced extensions (C++, Docker, XML, etc.)`github.copilot-chat` only
Node 20 featureNone
`postAttachCommand` (site gen + HTTP server)None
Port forwarding (8080, 8585)None
`autoApprove` enabled (masks approval prompts)`autoApprove: false` (default approval path)
Settings Sync extension control (no valid devcontainer setting exists)Removed; disable Settings Sync manually or use a fresh profile

`postCreateCommand`

Creates a venv only — no dependency install. This keeps container startup fast and low-noise for timing/race-condition diagnostics. Install dependencies manually when needed:

```bash

. .venv/bin/activate && pip install -r requirements.txt

```

How to test

1. Go to **Code &gt; Codespaces &gt; New with options**

2. Under **Dev container configuration**, select **EFA — Safe Mode (minimal extensions)**

3. Create the Codespace

4. Open Copilot Chat (panel) and ask it to run a terminal command (e.g. `pwd`)

5. If it works: the ENOPRO error was caused by extension conflicts or startup timing

6. If it fails: the bug is in VS Code's web workbench independent of extensions

[2026-04-07] PR #51 — fix: improve Codespace startup config and add terminal welcome banner

Changes

Remove deprecated `github.copilot` extension

The standalone Copilot extension is deprecated and was being redirected to `copilot-chat` at install time, causing:

Only `github.copilot-chat` is needed (it now includes all Copilot functionality).

Add terminal welcome banner

New `.devcontainer/welcome-banner.sh` displays catalog stats and quick-start commands in every new interactive terminal session. Installed into `~/.bashrc` by `setup.sh` during `postCreateCommand` (idempotent).

Context: ENOPRO investigation

The `run_in_terminal` ENOPRO error (`No file system provider found for resource 'file:///workspaces/efa-catalog'`) is a VS Code web client bug where the browser-side terminal tool uses `file://` URIs in a remote context that only has `vscode-remote://` providers. This cannot be fixed from devcontainer config; removing the deprecated extension reduces log noise and extension host churn that may exacerbate the issue.

[2026-04-07] PR #50 — perf: pre-compile sfdictionary regex patterns

Problem

`generate_site.py` hangs during codespace startup (`start-site.sh`) because `find_sfdictionary_links()` recompiles a regex for every SF dictionary term for every idea — hundreds of compilations × 668 ideas.

The hang manifests as the process stuck inside Python 3.11's `re._compile` → `enum.__and__` flag check path.

Fix

Pre-compile all regex patterns once in `load_sfdictionary_index()` and return `list[tuple[re.Pattern, str, str]]` instead of `list[tuple[str, str]]`. The matching loop in `find_sfdictionary_links()` now calls `pattern.search(text)` on the pre-compiled objects.

Also moves the `len(term) <= 5` filter into the loader so short terms are excluded once at load time rather than checked on every idea.

Testing

[2026-04-07] PR #49 — feat: webhook receiver for real-time PR monitoring

Summary

Replaces `gh api` polling with a real-time GitHub webhook receiver for Agent C's PR review monitoring.

Problem

Agent C currently polls `gh api repos/.../pulls/.../reviews` repeatedly to detect Copilot review submissions, CI changes, and PR state updates. This is slow, burns API quota, and can miss events between polls.

Solution

A zero-dependency Python webhook receiver (`http.server` stdlib) that:

Usage

```bash

One-time setup: create repo webhook (secret passed via stdin, not CLI args)

tools/webhook_manage.sh setup --url https://your-codespace-8585.app.github.dev

Start receiver in background

tools/webhook_manage.sh start

Check status / recent events

tools/webhook_manage.sh status

Teardown when done

tools/webhook_manage.sh teardown

```

Security

Changes

[2026-04-07] PR #48 — chore: gitignore entire scratchpad directory

Replace individual scratchpad/* ignore rules with a single `scratchpad/` entry. Untrack previously committed scratchpad files.

[2026-04-07] PR #46 — Expand analysis: inspiration alongside warnings

Summary

Expands the idea analysis framework to capture **what could go right** alongside what could go wrong. Adds 4 new fields to the analysis schema and demonstrates them with 3 full examples.

New Analysis Fields

Motivation

The archive should not just warn decision-makers about pitfalls. It should also:

Example Analyses (3)

1. **mandatory-happiness-through-ignorance** (The Fireman/Bradbury): distributed human backup of culture, subversive questioning, inverted protector symbol

2. **autonomous-media-creating-reality** (Benny Cemoli/Dick): adversarial fiction generators, stories as independent agents, automated beneficial propaganda

3. **cognitive-regression-in-space** (Ideas Die Hard/Asimov): cognitive limits as progress, changing the observer not the observed, evolutionary artifact intuitions

Pre-commit checklist

[2026-04-07] PR #45 — Add optional analysis field to idea schema for AI reasoning

Summary

Adds an optional `analysis` object to the idea definition in the catalog schema. This structured analytical metadata captures reasoning from full-text analysis that would otherwise be lost, designed for downstream AI consumption (e.g., via a future MCP server).

Changes

Schema (`catalog/schema.json`)

Scripts (`tools/enrich_fulltext_phase2.py`)

Instructions

Validation

Why now

Every full-text analysis run that happens without this structure is work that would need to be redone or backfilled. Adding this before further Galaxy Magazine or Gutenberg analysis rounds means the richer output is captured on the first pass.

[2026-04-07] PR #44 — Full-text deep analysis of 10 Galaxy Magazine stories

Summary

Deep analysis of 10 Galaxy Magazine stories based on reading the complete OCR text from Archive.org DjVu XML scans. This replaces metadata-based synopses with detailed plot descriptions and extracts new ideas visible only through full-text reading.

Synopses Rewritten (9 existing stories)

All synopses enriched from ~250 chars to ~600 chars based on actual story content:

New Story (1)

New Ideas (6)

Pre-commit checklist

[2026-04-07] PR #43 — Search tags and deep link filter

Summary

Two search/filter improvements to the site.

Tag Search

The search box now matches against story and idea **tags** in addition to titles, authors, synopses, and descriptions. Searching for `galaxy-magazine`, `censorship`, `hugo-winner`, or any tag now returns matching entries.

Deep Link Filter

A new **Source** dropdown filter with a "Has Deep Link" option shows only stories that have direct links to their original text (e.g., Archive.org scans of Galaxy Magazine issues). Currently 9 stories have deep links. This filter will become more valuable as we add more Galaxy stories.

Implementation

Pre-commit checklist

[2026-04-07] PR #42 — Idea extraction round 11: 6 new ideas, 27 story-idea links

Summary

Round 11 of idea extraction, focusing on Galaxy Magazine stories and classic SF novels.

New Ideas (6)

Story-Idea Links (27)

Linked 29 stories to existing ideas across Asimov, Ballard, Brunner, Butler, Hamilton, Harrison, Huxley, Oppel, Sanderson, Silverberg, Sherman, Tepper, Tucker, Williams, Phillips, and Baxter.

Coverage

Pre-commit checklist

[2026-04-07] PR #40 — Add first 9 Galaxy Magazine stories with Archive.org deep links

Summary

Adds the first batch of Galaxy Magazine stories to the catalog, each with page-level Archive.org deep links to the original magazine scans.

New Stories (9)

Schema & Site Updates

Validation

Pre-commit checklist

[2026-04-07] PR #41 — Expand copilot-instructions with operational patterns

Adds seven sections to `.github/copilot-instructions.md` capturing patterns learned from prior sessions that were not previously recorded:

1. **Copilot PR review waiting strategy** — no shell sleep loops or timeouts; sequential API polling; productive use of wait time; never give up

2. **Branch protection enforcement** — explicit rules about what main requires

3. **Story draft pipeline layout** — documents `scratchpad/story-drafts/<source>/` subdirectories and promotion workflow

4. **Galaxy Magazine pipeline** — fetch, parse, batch tools and `internetarchive` dependency

5. **Junk entry cleanup** — `None-None.json` rule added to Key Operating Rules

6. **Schema field quick reference** — story and idea fields, `external_ids` keys

7. **Generated site clarification** — reinforces that `generated-assets/site/` is never committed; CI deploys to `efa-site`

No catalog data changes; instructions-only update.

[2026-04-06] PR #39 — Rewrite README with current features and setup instructions

Complete rewrite of README.md:

[2026-04-06] PR #38 — Update repo references to efa-catalog/efa-site

Updates all internal references after repo rename:

Note: secret name kept as TASAT_SITE_DEPLOY_TOKEN (rename manually when convenient). Workspace mount path will update on next container rebuild.

[2026-04-06] PR #37 — Rebrand to Extrapolated Futures Archive (EFA)

Renames the project from 'TASAT Catalog' to 'Extrapolated Futures Archive' across all branding.

**Updated (24 files):**

**Preserved:**

[2026-04-06] PR #36 — SF Dictionary integration: deep links on idea pages

Changes

**SF Dictionary links on 494 idea pages:**

**Dataset:**

[2026-04-06] PR #35 — Make start-site.sh resilient to missing venv/dependencies

Guards against postAttachCommand running before postCreateCommand finishes:

[2026-04-06] PR #34 — Auto-authenticate gh from devcontainer credential helper

Problem

Users had to manually run `gh auth login` after devcontainer setup, even though VS Code's credential helper already has a valid GitHub token.

Fix

[2026-04-06] PR #33 — Galaxy Magazine download and parsing pipeline

Galaxy Magazine Pipeline

New tool for downloading and parsing the full Galaxy Magazine collection (446 issues, 1950-1980) from Archive.org.

**Download (`--download`):**

**Parsing (`--parse`):**

**Context:**

Galaxy Magazine, founded and edited by H. L. Gold, was the leading SF magazine focused on social speculation (1950-1980). The Archive.org collection has 440 issues with OCR text. This pipeline is the first step toward cataloging hundreds of classic short SF stories with direct page-level links to the full text.

[2026-04-06] PR #32 — Tristate toggle tooltips + changelog category overhaul

Changes

**Tristate toggle tooltips:**

**Changelog categories reorganized (4 categories):**

[2026-04-06] PR #31 — Phase 2: Full-text enrichment of public domain classics

Phase 2 Full-Text Enrichment

Full-text analysis of 25 cached Project Gutenberg texts reveals additional speculative ideas in classic SF works that were missed by synopsis-only extraction.

**8 new ideas:**

**13 stories enriched** (each now has 2-3 ideas, up from 1):

Frankenstein, The Time Machine, Island of Dr. Moreau, Jekyll & Hyde, The Last Man, Flatland, The Coming Race, Mizora, The Last American, Alice in Wonderland, Through the Looking-Glass, 20000 Leagues, Journey to the Centre of the Earth.

Validation: 2,515 entries, 0 invalid, 0 broken links. Idea count: 648 -> 656.

[2026-04-06] PR #30 — Devcontainer improvements: Node 20, auth, cleanup

Changes

**Devcontainer improvements:**

**New tool: Gutenberg text fetcher (`tools/fetch_gutenberg_texts.py`):**

[2026-04-06] PR #29 — Fix issues from Copilot review audit (PRs #17-#28)

Addresses unresolved Copilot review feedback from past PRs:

Frontend (generate_site.py)

Backend (generate_site.py)

Process (.github/copilot-instructions.md)

Not addressed (no longer applicable):

[2026-04-06] PR #28 — Generate site in CI; remove generated-assets/site/ from repo

Problem

PRs containing regenerated site files (2,500+ files) exceeded Copilot's 300-file review limit, causing reviews to be skipped silently.

Solution

Result

PRs now contain only catalog data and code changes (well under 300 files), enabling proper Copilot code review on every PR.

[2026-04-06] PR #27 — Move contribution links from footer to nav bar

Moves 'Suggest a story', 'Suggest an idea', and 'Report an error' links from the page footer to directly below the What-If Query / Idea-Story Graph / Export JSON navigation bar for better visibility.

[2026-04-06] PR #26 — Remove redundant issue title prefix from story/idea templates

The `[Story] ` and `[Idea] ` prefixes in the issue title were redundant with the form's Title field. Removed them so users only fill in the title once. Labels (`story-submission`, `idea-submission`) handle categorization.

[2026-04-06] PR #25 — Refine issue templates: optional fields, better pre-fill

Changes

**Story suggestion template:**

**Feedback template:**

**Site feedback links:**

Changelog updated.

[2026-04-05] PR #24 — Community contribution infrastructure: issue templates, contributing guide, feedback links

Phase 3 (Community Augmentation) — Tier 1

**GitHub Issue Templates:**

**CONTRIBUTING.md:**

**Site Feedback Links:**

All links point to the structured issue templates for consistent submissions.

[2026-04-05] PR #23 — Idea extraction round 10: 9 new ideas, 45 stories addressed

Changes

**9 new ideas created:**

**15 SF stories** linked to new or existing ideas (Caspak, Eden, Wild Robot, War Dogs, Warcross, Nova Trilogy, Kefahuchi Tract, Zeroes, Desperation).

**30 stories tagged needs-review:**

**18 pre-existing asymmetric bidirectional links fixed** across the catalog.

**Related ideas recomputed** (45 new cross-links).

Validation: 2,508 entries, 0 invalid, 0 broken links. Idea count: 639 -> 648.

[2026-04-05] PR #22 — Validation cleanup: remove duplicate Deepness in the Sky

Changes

[2026-04-05] PR #21 — Add Copilot PR review loop to Git Workflow

Adds the Copilot review loop requirement to the Git Workflow section of `.github/copilot-instructions.md`:

After opening a PR, wait for Copilot's review. For each feedback comment, fix the code, push, and resolve the conversation thread. Request a new review. Repeat until Copilot has no further objections, then merge.

This ensures every PR goes through iterative Copilot review before merging.

[2026-04-05] PR #19 — Sync all filters to URL hash; dynamic page title for series/universe

Changes

**Bookmarkable/shareable filter URLs:**

Every filter change (domain, scenario, outcome, type, decade, series, universe, search) now updates the URL hash in real time. Example:

```

index.html#series=Dungeon%20Crawler%20Carl

index.html#domain=ai-ml&decade=2020

index.html#search=robot

```

URLs can be bookmarked or shared and will restore the exact filter state on load.

**Dynamic browser tab title:**

When a series or universe filter is active, the browser tab shows the name (e.g. "Dungeon Crawler Carl — TASAT Catalog"). Reverts to the default title when cleared.

**Implementation notes:**

[2026-04-05] PR #20 — Add best practices to copilot-instructions

Adds four new sections to `.github/copilot-instructions.md` based on lessons learned:

Git Workflow

Pre-commit Checklist (catalog changes)

Mandatory steps before committing catalog data:

1. `python3 tools/validate_catalog.py` (0 invalid)

2. Verify bidirectional story↔idea links

3. `python3 tools/generate_site.py`

4. Update `CHANGELOG.md`

5. Commit on feature branch and open PR

Security

Bidirectional Links (Key Operating Rule #9)

These codify practices that were previously implicit or only in memory files.

[2026-04-04] PR #17 — Fix: filter counts populate on initial page load

Root cause: applyFilters was inside an IIFE and the previous fix tried calling it from outside (ReferenceError, silently failed). Fixed by removing the early return in applyHash so it always dispatches the input event on the search box, which triggers applyFilters within the correct scope.

[2026-04-04] PR #16 — Tristate toggle refinements + fix initial count population

Toggle refinements:

Fix: filter counts now populate on initial page load (applyFilters called explicitly, not just via hash dispatch).

[2026-04-04] PR #15 — Visual toggle for series/universe single/multi mode

Replaced the dropdown mode selector with a visual three-state toggle:

Click cycles through states. Matches the iOS-style toggle reference.

[2026-04-04] PR #14 — Add three-way toggle for series/universe filters

Series and Universe dropdowns now have a mode toggle:

Each option has a `data-entrycount` attribute. Toggle hides options that dont match the mode. Reset restores default.

[2026-04-04] PR #13 — Add 70 stories completing 47 single-entry series

Systematic analysis of all 251 single-entry series against Wikipedia. Added companion novels for 47 series including Earthsea (3 books), Harry Potter 5-7, Enders Shadow sequels, Dark Tower 2-3, Otherland, Red Queen, Wormwood, Final Architecture, Lady Astronaut, and more. Story count: 1,782 -> 1,852.

[2026-04-03] PR #12 — Fix filter counts: show counts excluding own selection

Each story-level dropdown (Type, Decade, Series, Universe) now shows counts computed with that specific filter removed. Previously, selecting "Amber" universe would show all other universes as (0). Now each option shows its actual count assuming all other filters stay the same.

[2026-04-03] PR #11 — Show series/universe filters always with dynamic counts

Series and Universe filter dropdowns now visible at all times (not hidden until clicked). Each option shows a live count of matching stories, just like Domain, Scenario, Type, and Decade filters.

[2026-04-03] PR #10 — Series gap-fill batch 5 + War Dogs fix

9 new stories completing Majipoor (3-5), Stravaganza (2-3), Withern Rise (1-2), plus Jackpot (Gibson 2025) and Sunrise on the Reaping (Collins 2025). Fixed War Dogs series name. Story count: 1773 -> 1782.

[2026-04-03] PR #9 — Series gap-fill: 117 new stories completing ~35 series

Systematic series completion using Wikipedia book counts compared against catalog.

**117 new stories** across 5 batches:

Story count: 1,656 -> 1,773. Removed per-page timestamps (regen diffs now ~80 files instead of 2,300+).

[2026-04-03] PR #8 — Add 23 more stories + remove page timestamps

**23 new story entries** filling series gaps (batch 2). Key additions:

**Timestamp cleanup**: Removed per-page timestamps from generated HTML. Regeneration diffs reduced from 2,300+ files to just the files that actually changed (99 this commit vs 2,300+ previously).

[2026-04-03] PR #7 — Add 25 stories to fill series gaps

25 new story entries filling gaps in major series. Synopses sourced from OpenLibrary API. 20 linked to existing ideas via series-sibling inheritance.

Key additions:

[2026-04-03] PR #6 — Address Copilot PR #4 review comments

Fixes all 5 issues raised by Copilot code review on PR #4:

1. **series_position schema** — Restricted from `integer|string|null` to `number|null` (no arbitrary strings)

2. **Mojibake in synopsis_isfdb** — Fixed 60 entries with encoding artifacts

3. **Stray literal n characters** — Fixed in enrichment-sourced synopses

4. **annual_views > views anomaly** — Fixed 51 entries where values were swapped

5. **All 5 specific files Copilot flagged** — Verified clean

[2026-04-03] PR #5 — Trigger site deploy

Empty trigger to redeploy site

[2026-04-03] PR #4 — Series/Universe, ISFDB enrichment, Find This Book, site improvements

Major update combining all dev work:

**Site UX:**

**Data enrichment:**

**Infrastructure:**

[2026-04-03] PR #3 — Add changelog entries and update post-work checklist

[2026-04-03] PR #2 — Add Find This Book links and ISBN edition metadata

[2026-04-03] PR #1 — Expand TASAT acronym in site subtitle

Spells out the TASAT acronym in the site subtitle with bolded initials.