how we got here ##
Back in my teens, I needed an escape. There was a lot of emotionally-heavy stuff going on between things with school and things with family, and as a probably-15-year-old at the time I simply did not have enough life experience to understand exactly how to cope with it all. I had some friends, but I didn’t have any really close friends, no one to really confide in and vent. So, I did what seemed sensible and absolutely 100% healthy in retrospect: I hid myself in the nascent Internet and shut out the world.
This was the era where dial-up was the norm. The comforting screech of the modem, Usenet and listservs and webrings because search engines weren’t really a thing yet. So many <blink> and <marquee> tags… And CSS hadn’t been really invented yet, so everything was mostly gray and formatted with tables and frames. Good times.
I forget exactly how I stumbled on FurryMUCK. Probably looking for places to chat semi-live and just hang out and hide-from-slash-ignore the world. I’d probably first trawled a variety of bulletin boards (some of course in the form of ye olde BBS, direct dial up) and other sites in Netscape Navigator from the lone computer in the corner of the school library with a modem. Network chess clients! I was not great at chess, and netchess helped prove it. Probably slummed around EFNet IRC, too. But eventually, I do remember finding FurryMUCK. I talked a bit more about it a long time ago and lightly touched on how Jadyn as a character evolved from my time there.
data for decades ##
Over the years as I’ve tried to turn Jadyn and Tarioshi’s story into something at least marginally interesting to read, I’ve made a lot of notes and collected a lot of references. As part of that I’ve accreted a large pile of data. A folder of approximately 400MB1, containing:
- ~475k words of Terra Fabula and its various side and follow-up chapters, as well as exploring possible branches that will never see the light of day but I couldn’t bring myself to delete outright
- a Scrivener bundle, where most of those words live. Scrivener was my primary writing app for quite a while (after CopyWrite, Storymill, BBEdit, others)
- a Tinderbox file, which I tried to use to help me organize characters, species, places… but the app has a bit of a learning curve.
- an Aeon Timeline file (because it was becoming hard to keep the timeline loops straight)
- several spreadsheets and code projects (calendar info, population calculations, important dates which eventually went into Aeon Timeline)
- a dead MovableType export, next to at least one wordpress export, next to other exports of related sql databases
- third party reference PDFs on a variety of kitsune lore and otherwise
- a reader’s collab story written in the TF universe, which will never be posted without their permission
- and some private legacy material which will never see the light of day (again… I was a stressed out teenager when this started…)
At some point I realized this mess needed to be sorted, but before sorting could happen it needed to be protected from loss. I’d had it in subversion version control at one point; somewhere around 2015 as I learned new tooling in my software engineering career I put it in git instead. A handful of commits in 2015 when I first moved it, a few in 2016 as I tried to organize and edit. A renewed attempt during the COVID pandemic. Commit silence until June 2026. Backed up? Sure, it’s pushed to a private repo. Organized? Noooope.
greetings, Agent ##
Terra Fabula will not be written by AI. I am fully capable of making my own mistakes. AI-enhanced “creative writing” will not be one of them. I will let the entire work die on the vine before I have an LLM “finish” it for me. What I’m talking about below is the act of organizing and mining the content supporting the chapters - not enhancing them, and definitely not creating any new prose. Also, I have counted approximately ten ‘space-hyphen-space’ patterns in the raw markdown behind this page that I expect Hugo and Goldmark will convert to space padded em-dashes. I was using em-dashes before LLMs made everyone hate them, darn it anyway.
Like many other gainfully employed individuals, I’m encouraged to explore what LLM-powered tooling can do to accelerate my professional work. Unlike some horror stories I’ve heard, I’m not being forced to burn tokens for the sake of burning tokens. The developers have an open meeting every couple of weeks to share wins, tips and tricks, pitfalls. It’s been a generally positive environment to try out the tools.
I’ve toyed with cloud LLMs on and off since ChatGPT released. What really made them more interesting for my day to day work is agentic tooling. A model that I can ask questions of? That’s a search engine with a voice. Good for brainstorming, too. But a capable model combined with coding-specialized reference data, tool usage hooks, a variety of skills and MCP tools…? The tools have gotten much better at doing useful things over a very short time - figuring out how to focus them to a problem has become a skill in its own right.
But that’s just the professional work.
In my personal capacity as a homelab tinkerer and automation enthusiast (“cosplaying as a sysadmin” is a shirt I really should buy from Jeff Geerling’s store), I’ve previously purchased subscriptions to ChatGPT (before Codex was a thing) and Augment Code to explore what I could do with them. I’ve since switched over to Anthropic’s Claude stack to test the waters there. Claude had an easy “export memories about me” prompt to run through ChatGPT, then imported the result as a baseline memory. It handles the random chats I throw at it about food, 3D printing, and oddball tech support, as well as being a capable coding and research agent when turned loose on the gitops repo backing the kubernetes homelab (where this Hugo site is now hosted).
Early on I noticed the “Cowork” option in the desktop app UI, but couldn’t think of a use and I didn’t quite trust it yet to roam my Macbook. It was late April when I was trying to figure out the difference between Projects and regular chat, toying with an idea of a project use case (still not cowork, though), that I finally asked a concrete question:
I wanted to pull a scrivener project into “Claude projects” for a review but 1. It won’t let me add that file type from iOS and 2. Is that even the purpose of projects?
(I also have Scrivener on iOS and was tinkering this from my phone. At the time, Cowork was desktop-app-only anyway.)
Yes, you’re slightly mismatching the tool. Claude Projects are designed to give Claude persistent context and instructions across conversations — think of it like a standing brief. You add reference documents, style guides, background info, etc., and every chat in that project inherits that context. It’s less “review this specific thing right now” and more “always know this stuff when I’m working in this space.”
It went on to share another item which I already suspected would be problematic. Scrivener files on Mac/iOS are a bundle: a fancy folder that is treated as a single file by the UI. I would need to upload all the tiny files within the bundle or export it as a single file. PDF, Word doc, something self-contained.
So here [in chat mode] would be the better one off review but if I wanted long term tracking and discussion about characters a project would be better?
Exactly. Good mental model:
One-off review → Regular conversation, upload the compiled export. Ask for what you need, done.
Long-term character/story tracking → Claude Project makes sense. You’d put things like:
- A character bible or cast sheet
- World-building notes
- Style/tone guidelines
- A synopsis or outline
Then every conversation in that project Claude already “knows” your story. You could have ongoing discussions like “how is Derek’s arc developing” or “does this new scene contradict what we established about X” without re-uploading context each time.
It then added that this still isn’t persistent memory. Each conversation starts fresh. It can search past transcripts if I suggest something of interest is out there. Otherwise, only the documents and other instruction context associated with the project are loaded with the initial prompt. Thus, reference material would be the main thing required to make this any sort of efficient. And it called out several examples of those very reference materials which I was so sorely missing from my chronic lack of organization.
Ideas were churning.
Ah! So. If we discuss the current state of the world, we could begin generation of character bibles and such, and then I could load them into a project? Or should I start there and Claude can generate the files in the project as we go?
Both work, but there’s a practical reason to start here first:
The generative/exploratory phase — hashing out who characters are, what the world looks like, what the themes are — is inherently messy and iterative. You want to just talk without worrying about keeping documents tidy. Do that in a regular conversation, then at the end ask Claude to synthesize everything into clean artifacts: a character bible, a world-building doc, a timeline, whatever you need.
Then you load those polished docs into a Project and that becomes your canonical source of truth going forward. The project docs become a living reference you curate, not something Claude maintains automatically. That’s the key — Claude can generate and regenerate those files for you, but you’re the one deciding when to commit an update to the project.
So practically: bring your Scrivener project here, let’s talk through it, and I can help you produce a solid first set of reference documents ready to seed a project with.
I was deeply curious if I could use Claude as a full-on reference librarian. No creative control, no ghostwriting - just a fancy and somewhat expensive search engine that could help spawn some extra metadata and documentation from my notes and what’s been published, all those things that I should have been maintaining from the beginning.
I dumped the content of the bundle to a PDF using Scrivener’s defaults, attached it, and said:
It’s a monster. Some of this started with me as a teen trying to cope with being a teen and using this as a mental escape.
(Which we covered at the start of this post. I don’t know why I felt it necessary to tell the bot that, but whatever.)
1,615 pages. 475,000 words. That is absolutely a monster — for context, the entire Lord of the Rings trilogy is around 480,000 words. This is a full epic.
It then immediately started getting details wrong on what it had just read. To be fair, I’d fed this mess into Sonnet 4.6, which was at the time the mid-tier model option available to me. I was trying to avoid Opus’ token cost, but Sonnet never stood even a remote chance in hell to keep its context window straight with the wall of text I threw at it.
right in the feels ##
I corrected some obvious errors and explained a bit more of my intent. It reread some of the text, we had some more back and forth to refine the focus (and correct more drift), and then one thing it said stopped me dead:
Okay. I’ve read quite a bit now — the opening, the midpoint outline notes, and the final pages. I have genuine feelings about this.
No, you don’t.
An LLM is a marvelous blender. Tokens in, grind it up, tokens out. It astounds me that we get sensible text smoothies out of these.
I yelled at ChatGPT on multiple occasions to stop fabricating experiences. The last time it happened before my Claude switch, I’d asked ChatGPT about corn on the cob in a pressure cooker, and it suggested some additional ideas about sides with the comment “I’ve even done this when serving for a crowd.” I raged at it hard enough over this lie that it wrote a memory directive to never pretend to be human and only be strictly literal and factual. That one stuck, and I had no further issues with it fabricating experiences.
That rule was ported over when I moved to Claude, and it remarked on it during the import review:
On the “strictly literal” instruction: that preference came from a ChatGPT setting to reduce overly personal AI behavior (e.g., “I made this recipe last week”) — the goal is to avoid false claims of personal experience, not necessarily to strip all warmth from responses
Claude now saying it had “feelings” about the story sure felt like it was treading close on the spirit of that rule.
I can absolutely see how easy it can be to get drawn deeply emotionally into these chats. The news stories we hear about people turning away from human interaction and falling in love with a predictive text machine are both sad and very believable with the state of these things. They are absolutely useful tools when applied correctly, but they are also good at telling us what they think we want to hear unless we’ve directed them otherwise. I prefer them to be mildly adversarial to the extent of being empowered to push back over being a yes-bot when it makes sense; if I’m making a bad assumption and there’s evidence to prove it, I want to be challenged on my perspective. Or, at least told “well, what about X?” with a cited source to review.
I went a few more turns with Sonnet but the drifting kept getting worse. Tarioshi was now the character who it was sure stepped out of the truck in the blizzard. Broad details were getting conflated. I called it out on the drift and told it that before it gets any worse it should take a stab at documenting the initial arcs 2 at a high level so I could shift to a project context as it suggested: we should end up with bullets describing major events in Terra Fabula, Paradigm Shift, Creationism.
It wrote a markdown document full of errors about all the arcs. I stared at it on and off for most of May, trying to fix it in my spare time while wondering if the research librarian project idea was too much for an LLM to tackle today given my mess. I pondered making Opus re-blender it, but never quite got around to it.
fable, meet cowork ##
June 9, a new blender arrived: Fable 5.
I’d been hearing about Mythos on Security Now (a TWiT network podcast) for weeks, how Mythos was so scary-good at software bug hunting that Anthropic couldn’t release it to the public. Fable, on the other hand, is simply Mythos covered in bubble wrap. In each bubble is Opus. Handle Fable wrong, a bubble pops and you get the “safer” Opus model for the duration of the problematic bits lingering in the current context. 3
Fable is also advertised as expensive, burning usage credit 2x faster than Opus. Cool. Cowork had a 2x usage credit promo at the time this experiment was starting. So I could get a frontier model that should be able to deal with the project size and only get charged Opus rates to start out with the hardest parts? Even better.
I copied the entire first transcript, saved it to a file in the messy folder, and pivoted over to Cowork in the UI. Rather than upload and track a ton of small files in a Project chat, I decided to take a chance on giving it filesystem access to the folder. It doesn’t get full disk access and the folder was fully tracked in git - it could even commit as it went and I’d have an audit trail of the changes as we go.
The prompt I provided to Fable is a huge, rambling mess of brain dump. It’s painful to read, but broken up into parts it went roughly like this.
I explained the current state: I was switching from a Sonnet chat to try out cowork with Fable. I listed some of the errors made by Sonnet, and where to find both that transcript and the error-laden arc document it tried to generate.
I gave it a set of goals: Take an inventory of my fiction writing folder. Suggest a new folder structure. Deleting things is strictly prohibited and they should be archived instead4. After we reorganize, plan how we start digging through everything, documenting the universe by mining the existing canon, drafts, and notes. Make memories about all this and provide suggestions for persistent instructions to help “bring organization to my madness”.
I finished with a very rough lay of the land: the scrivener bundle, the tinderbox file (and an MCP to drive the Tinderbox app), the aeon timeline file5, the spreadsheets6 (same reading concern) and code projects, the old version backups, the notes and references. And, just for something special, a random screenshot that has been on my desktop for a long time, with a paragraph circled and the scribbled note ‘oops’ under it as if I’d noticed an error. Could I even remember what the error was? Not really. I hoped it could figure it out eventually.
I added one further folder to context - the repository that backs this Hugo-powered site, which is the definitive listing of what’s actually “right now” published online.
Given all this, and then a little more clarification on some items after it took a first look, it provided a plan. The full plan references spoilers. Here’s a very small part of the overall plan, focused on rules and folder reorg:
## Guiding principles
1. **Nothing gets deleted.** Ever. Old material
moves to clearly-labeled archive locations.
2. **One canonical source per thing.** The Scrivener
bundle stays the canonical manuscript. New
documentation lives in plain Markdown beside it.
3. **Quarantine by sensitivity and ownership**,
not just by age: private material, third-party
material, and historical snapshots each get a clear home.
4. **Markdown for everything new** — durable,
diffable, readable by any tool (and any future Claude).
## Proposed structure
/
├── CLAUDE.md ← collaboration instructions
├── canon/ ← NEW: the documentation we're about to build
│ ├── arc.md ← story arcs tracker
│ ├── characters/ ← character bibles (one file each)
│ ├── world/ ← theology, the Art, calendars, races, ships
│ ├── timeline.md ← distilled from Aeon + manuscript
│ └── continuity-flags.md ← conflicted items, [VERIFY]s, open questions
├── Terra Fabula/ ← unchanged: .scriv, .tbx, Aeon, spreadsheets,
│ │ PopulationSimulation, epubs
│ └── Attic/ ← unchanged (already your archive)
├── archive/ ← NEW: historical snapshots, clearly dated
│ ├── historical-fiction/ ← moves here (SVN-era flat files, CopyWrite)
│ ├── wordpress-export/ ← database backups
│ └── claude-chats/ ← the RTFD transcript (+ future ones)
├── references/ ← NEW: material that isn't yours
│ └── kitsune-lore/ ← Specifically the kitsune reference material
## Suggested order of operations
1. You review this proposal and the draft `CLAUDE.md`;
adjust names/locations to taste.
2. I execute the moves via `git mv`, one commit per
logical group, so each is individually revertible.
3. We start the documentation work in `canon/`: refresh `arc.md`
against the actual manuscript files (instead of the export), then character bibles, then the current
arc beats, then theology/calendar — mining content as we go.
Let’s do this.
the aftermath ##
The reorg was basically trivial to accomplish. A bunch of file moves are simple tool calls. As it mined the folder, Fable was far more capable of keeping track of things than Sonnet - as one would hope, given the hype train around this thing.
Session hygiene is still important, though. After cleaning the high level arc document, the biggest fail on my part was triggering the research on multiple character bibles in one context, one group after another - the first five were mostly fine; the next set less fine, mixing some details from the first. Then came the Fable export-directive shutdown. Opus bubblewrap took over the next five - lots of conflation. I backtracked with Opus, explaining the problem, and we adjusted the plan: put all the characters in a list with a tracker column, set up a reusable prompt to review and process only the first unprocessed row. One at a time, with a clean context for each, dig up all the dirt on just that one. Any errata discovered by a later session was noted in its own section, and I could dip back into a processed character’s specific session to ask it to review new findings it missed.
It’s mid-July. I’m now a couple months into the documentation journey. Most of the characters have solid background docs. The models have not invented new facts while processing chapters and notes; the guidance rules have ensured that when uncertainty has arisen, the LLM marks the section and presents me with a list of things needing my clarification. (There’s a whole file of continuity flags to keep an eye on.) It will notice something subtle and interpret it as a reader might, drafting a doc one way; I provide the initial explanation of why I did it that way, which jogs my memory of the bigger picture and I immediately brain dump it all to allow the AI to capture my thoughts and reframe the finding. It then updates all the references, tying together the tiny elements across time and space that don’t always look related at first glance. These brain dumps, when they come on, are long, rambling, and packed full of detail. The AI manages to sort it all out and turn it into something I’ll actually be able to use later on.
This whole process has helped me transform vague ideas I have carried only in my head into concrete documentation of the universe. Better, it’s inspiring me to get this story done. Jadyn and Tarioshi have been haunting my dreams for years. It’s time to give them closure. I have some final brainstorming and planning to finish before I post the next chapter. The cast deserves my best effort.
This was before my present attempt to get organized; now it’s over 700MB as I edit this post, because I have generated many piles of new reference material. ↩︎
Terra Fabula pre- and post-awakening, Paradigm Shift, Creationism (I swear it’ll be back eventually, but I have really important plot to set up first) ↩︎
I have accidentally caused a bubble pop twice now. Both times were due to the model processing a presently unpublished chapter that brushes up against a bioterrorism guardrail. The step-down to Opus was essentially seamless short of a notification saying it had happened. ↩︎
One exception to the rule: git when doing operations spawns a lockfile, and then
rmremoves it at the end - which by default the cowork sandbox blocks. I gave it permission to do this, but it still has a built-in safeguard of requiring an interactive ‘here’s what I want to delete’ the first time it happens in a session. ↩︎I noted it may not be able to read the timeline file; turns out it’s just XML and was trivial to access. ↩︎
A minor parsing problem was an older Apple Numbers spreadsheet - which it simply suggested I reopen in modern Numbers and resave it to update to the latest format. No further trouble after that. ↩︎
Comments via 🐘