Project Explorer · working sheet

Seeds of the Throne

Seeds of the Throne began as years of conversations and thousands of story ideas. The Project Explorer shows how those ideas are being organized into characters, a world, a timeline, and a finished series.

Interpretive still life of recovered records aligned against hidden-system evidence.

Recovered records held against the working evidence.

Story development tools

See how the authoring system turns ordinary language into finished story work.

The Project Explorer shows the live notes, decisions, and workshop used to develop Seeds of the Throne. Each step keeps confirmed decisions separate from suggestions and unanswered questions.

This is a public, read-only look at the real project, so it contains full spoilers. You can try the workshop, but your draft stays in this browser unless you export it.

  1. The author explains the story in ordinary language.

    The system records those ideas and separates confirmed decisions from suggestions and unanswered questions.

    Read how the system is designed
  2. The current workshop asks one consequential question at a time.

    Each question helps the author decide a missing cause, character choice, relationship, world rule, or event.

    Open a workshop question
  3. Accepted answers are added where they belong.

    An accepted decision can update character notes, the timeline, world rules, plot events, and the list of remaining questions.

    Review decisions and supporting information
  4. Use the completed plan to write and revise scenes.

    The planned system will create scene outlines, draft prose, check continuity, revise weak sections, and assemble the manuscript for the author's approval.

    Read the system plan

Seeds of the Throne is the working example. The notes, decisions, and workshop below are the live project, not a demonstration mockup.

Vault overview

See the whole story-development system at a glance.

605 notes work together as one system. The vault remembers where ideas came from, what the author decided, what remains uncertain, and what should happen next.

The vault turns conversations into organized story memory. It preserves sources, separates decisions from suggestions, finds missing connections, supports research and workshops, prepares scenes and prose, checks continuity, and publishes selected material without surrendering author control.

  • Working now Capture, memory, workshops, and research already operate.
  • Needs repair Current-state agreement, automatic checks, and decision updates still drift.
  • Planned next Durable answers, manuscript production, and mobile save are not built yet.
  1. Capture

    Conversations, mobile notes, and raw ideas are preserved.

  2. Understand

    Current context and compiled notes explain what the project means now.

  3. Decide

    Workshops ask one important question and preserve the author's answer.

  4. Develop

    Research, alternatives, story structure, and focused tests strengthen the work.

  5. Create

    Scene plans, prose, images, and manuscript material are produced for review.

  6. Share

    Selected material becomes the story site, Project Explorer, and public posts.

What lives where

Each area has a job. Folder names are secondary detail.

  • New material

    Preserves incoming ideas and the order in which they developed.

    00 Inbox, 01 Sessions

  • Story memory

    Keeps the detailed working knowledge and a smaller briefing used to resume work.

    02 Story, 03 Context

  • Research

    Separates questions, reports, and usable findings from story decisions.

    04 Research

  • Public work

    Holds reviewed material prepared for readers.

    05 Public

  • Drafts

    Holds scenes and manuscript candidates awaiting review.

    06 Draft

  • Decisions and direction

    Records choices, contradictions, current work, handoffs, and verification.

    07 QA, 07 Coordination

  • Development tools

    Diagnoses missing connections and tests possible story directions.

    08 Story Loop, 09 Story Exploration

  • Reusable methods

    Provides repeatable methods for writing, research, images, websites, and checks.

    skills, scripts

What already works, what needs repair, and what is still planned

Working well

  • Idea and session capture
  • Human-readable story memory
  • Author authority and decision boundaries
  • Research kept separate from story truth
  • Workshop questions that wait for an answer
  • Decisions, contradictions, and open questions
  • Visual identity and image controls
  • Markdown files and recoverable history
  • Searchable file access

Needs repair

  • One trustworthy current-state view
  • Automatic checks before a change is merged
  • Shared labels and stable record identifiers
  • Updating every affected note after a decision
  • Keeping the weekly cycle current
  • Clearer boundaries around older folders
  • A cleaner split between the repository and the live site

Planned next Not built yet

  • Durable integration of conversational answers
  • Automatic reports of what a decision would change
  • Complete scene-to-manuscript production
  • Manuscript assembly and export
  • Reliable mobile save, resume, and synchronization

The next build order

  1. Make builds and checks reliable.
  2. Create one trustworthy current state.
  3. Normalize the records for one small complete path.
  4. Connect accepted decisions to every affected file.
  5. Prove one complete path from conversation to approved manuscript material.
  6. Expand only after that path works.

Current story development

See what the story already has and what it still needs.

The system checks the whole story for missing causes, weak character decisions, unclear rules, and unfinished events. The results show the author what to work on next.

Current story premise

The colonization process trains participants and contains dangerous criminals.

Humanity developed the Luminai inside an interactive colonization environment. Sylvan and his Luminai are tested against Samuel Franklin, a criminal already held inside the containment process.

The current story problem Make the formal separation, rapid financial collapse, processing, exposure, and accepted placement feel inevitable.

Read the current story assessment

0 / 10major story problems resolved

Current development pass0%
0%
Current sweep
Reassessment
Current task
RW-01
  1. 01 Reassessment
  2. 02 Causal sequence
  3. 03 Character agency
  4. 04 Systems + evidence
  5. 05 Scene design
  6. 06 Draft

Story files

Browse the files used to develop the story.

Search 605 documents about the world, characters, plot, research, decisions, workshops, and earlier ideas.

Current document iainreiddotdev/docs/EXPERIMENT_VISIBILITY.md

Experiment Visibility — private-first workshop experiments

A SaaS experiment can be deployed to the real production server before it is publicly discoverable. It can be used privately, then by a few invited testers, then published only after it earns public access. This document explains the mechanism and how to operate it.

Why experiments deploy privately first

There is no separate staging server. A shared cPanel host is the production environment, and standing up a second environment is not worth it for small experiments. Instead, an experiment ships to production but stays invisible: visibility = private means only administrators can reach it, so you can use the real thing under real conditions before anyone else knows it exists. A separate staging server is unnecessary because privacy is enforced in the application, not by hiding the deployment.

Status vs visibility (never confuse them)

Two independent columns on the experiments table:

  • visibilitywho may access this? This is authorization. One of

private, invite, public.

  • statuswhere is this idea in its lifecycle? This is informational only:

inbox, exploring, validating, building, testing, launched, paused, archived.

Authorization is derived only from visibility (plus admin, plus invite). Never from status. A status of launched does not grant access; only visibility = public does. Archiving is a status, not a deletion and not an access rule. See docs/SAAS_LAB.md for the idea-manager model.

The three states

  • private — administrators only. Everyone else gets a 404.
  • invite — administrators, plus logged-in registered users who hold an invite

to this experiment. Everyone else gets a 404.

  • public — anyone, logged in or not.

Why unauthorized private/invite access returns 404

The privacy guarantee is that a hidden experiment is indistinguishable from a route that does not exist. So unauthorized access to a private or invite experiment returns a real HTTP 404, not 200, 302, 401, or 403, and never a redirect to login (a redirect would reveal that the page exists and that logging in might grant access). The 404 body is identical to a genuinely missing slug and names nothing about the experiment or the viewer's login state.

The single most important rule: gate before any output

The gate can only send a 404 before any byte of output has been sent. Therefore require_experiment_access('<slug>') must be the first thing a gated page does after including the bootstrap — before any HTML, whitespace, blank line, BOM, <title>, meta tag, or database query.

If output has already started, the not-found renderer cannot set a 404; it logs loudly to the server error log and raises rather than silently returning a "200 not found" (which is forbidden). Keep the top of every gated page exactly like this, with no blank line or markup above the gate:

<?php
declare(strict_types=1);
require __DIR__ . '/../includes/bootstrap.php';
$experiment = require_experiment_access('hello'); // FIRST action, before any output
// ... only now include layout and render ...

How to register an experiment / idea

Registering a record does not create any code or directory — it is metadata.

  1. Log in as an administrator and open Ideas

(/devsite/iainreiddotdev/admin/experiments.php).

  1. Capture an idea with name and one-sentence concept only. The system

assigns IDEA-NNN, a unique slug, status = inbox, priority = normal, and visibility = private.

  1. Open the Idea workspace to refine fields, visibility, and invites.
  2. Build the actual page(s) under x/<slug>... and gate them (below).

route_path is a display-only note so you can remember where a page lives. It is never used for routing, redirects, includes, or authorization.

How to gate a single page

<?php
declare(strict_types=1);
require __DIR__ . '/../includes/bootstrap.php';
$experiment = require_experiment_access('your-slug');

require __DIR__ . '/../includes/layout.php';
render_page_top('Your experiment');
// render using $experiment ...
render_page_bottom();

See x/hello.php for the working demo.

How to gate a multi-page experiment

Do not rely on remembering to gate every file. Give the experiment one tiny per-experiment bootstrap and include it first from every page:

  1. Copy x/_experiment.example.php to x/<slug>/_experiment.php and set the

slug.

  1. Make the first line of every page in x/<slug>/:

``php <?php require __DIR__ . '/_experiment.php'; ``

Gating the whole sub-app is then structural, not per-file discipline. Every route inside a gated experiment must enforce access — directly or through this shared bootstrap. Never gate only the homepage and leave internal routes open.

How to invite an existing user

Invites only matter while visibility is invite, and only apply to existing registered users. From Ideas → Idea workspace → Tester invitations:

  • Enter the user's email and Add invite. If no registered user matches, nothing

is created or sent and you get an inline message.

  • Invited users appear in the list; Remove revokes access immediately.

There are no invite emails, tokens, expiring links, bulk invites, or groups. A user cannot invite anyone or change visibility; only admins manage invites.

Moving private → invite → public, and archiving

Change visibility in the Idea workspace (Access and deployment). published_at is set the first time visibility becomes public and is preserved if you later move it back. To retire an idea, use Archive idea (POST + CSRF): status becomes archived and archived_at is set. Restore idea returns it to inbox. The record and its data remain; there is no delete in this phase.

Where the framing Markdown is used

experiments/_template/EXPERIMENT.md is a short, phone-writable framing template: the one job, the riskiest assumption, the disconfirming signal, the smallest complete loop, private-use notes, invite-test notes, and the public decision with a note. Copy it per experiment to think through the experiment; it is documentation, not deployed code.

Verifying a private route is not exposed (run on the live host)

You run these on the deployed site; they cannot be run from the build environment. With the demo seeded as private:

# Logged out — expect 404 (a real not-found, no redirect to login)
curl -s -o /dev/null -w "%{http_code}\n" https://iainreid.dev/devsite/iainreiddotdev/x/hello.php   # -> 404

# Compare with a genuinely missing slug page — the gate body should match

Then check the source of the public VibeKB page and site navigation and confirm the experiment name/slug appears nowhere (HTML, comments, meta/OG, canonical, JSON/JS, structured data, sitemap, feeds). Privacy must come from the server-side gate, not from an obscure URL or robots.txt.

After flipping to invite, confirm: the invited user reaches it; a logged-in uninvited user and a logged-out visitor both get 404; it shows on the invited user's account page only. After flipping to public, confirm everyone reaches it. After revoking an invite, confirm that user is back to 404.

The /devsite/iainreiddotdev/-inclusive URL shape

The repository is served under /devsite/ and the application is nested under /devsite/iainreiddotdev/, so gated experiments live at, e.g.:

https://iainreid.dev/devsite/iainreiddotdev/x/hello.php

Build every internal link with the shared url() helper so the base path is never hardcoded.

Deployment and stale files

x/ is copied on deploy; experiments/ and docs/ are not. The cPanel deploy is copy-only and never deletes removed/renamed files, so a renamed gated route can leave an old ungated file live. After renaming or replacing a gated route, delete the stale file over SSH and re-verify the old URL 404s. See docs/DEPLOYMENT.md.

Security summary

Server-side enforcement only; 404 for unauthorized private/invite; no authorization in any cookie beyond the existing session; no URL tokens; hidden visibility inputs are validated against the allowed set; prepared statements; output escaping; database-level uniqueness on experiment_code and slug; foreign keys on invites; all admin mutations are POST with a validated CSRF token and a fresh server-side require_admin() check. route_path is display-only.