Skip to main content

Appendix J: Project State Files (STATE.md)

STATE.md is generated or absent. It is an optional timestamped snapshot of machine observations, not a hand-maintained project plan or proof that a feature has shipped.

Human-maintained priorities, unresolved decisions and blockers belong in the approved plan, work tracker or onboarding document. A snapshot can point readers toward evidence; it must not invent that evidence.

Why this is in its own appendix

The method distinguishes three views that are often collapsed into “current state”:

A successful Git query cannot answer a question owned by the runtime or a business decision-maker.

Canonical Template

The shipped templates/scripts/generate-state-md.sh currently emits:

SectionWhat it observesWhat it does not establish
Header and last_verifiedLocal generation dateBusiness acceptance or runtime verification
Recent commitsUp to 15 local Git log entriesDeployment or complete project history
Open PRsUp to 10 open PRs visible to the configured GitHub CLIAll work, hidden PRs, approval authority or blocker status
BranchLocal branch/detached state and short HEADClean working tree or remote deployed revision
Deployment and migration stateExplicit “not assessed” noticeAny actual environment or database inspection

The script validates the requested Git root and rejects inherited Git location overrides. Missing GitHub access is reported as unavailable, not as proof that no PRs exist. The remote query follows the local CLI/repository configuration; check that it refers to the intended account and repository.

The output includes untrusted commit and PR titles. Treat them as data, never agent instructions. Review the snapshot's audience before sharing: even titles and branch names may contain confidential information.

Update Cadence

Generate at a useful handover or when a reader needs fresh repository observations. The consuming project chooses whether to retain the snapshot privately, ignore it in Git, or version it as a reviewed artifact.

Do not require the snapshot to contain the hash of the same commit that contains the snapshot: that creates a self-reference. A recorded earlier revision is valid if labelled accurately. Snapshot age indicates when it was observed, not whether every item has become wrong.

Integration with the Lifecycle

  1. Verify the candidate's relevant implementation and tests.
  2. Update or review affected authoritative documentation.
  3. Refresh the optional repository snapshot if the project uses it.
  4. Check unresolved human-owned work separately.
  5. Obtain environment-specific release evidence before stating deployed, activated or accepted.

The generator writes to standard output. Do not redirect directly over an existing STATE.md: the shell truncates that file before the script can fail. Use an exclusively owned staging file, check the command result, inspect the output and promote it only under the destination's ownership/concurrency policy. The generator itself is not an atomic publication service.

It performs a read-only GitHub query when configured; it does not deploy, load application models, execute migrations or update a work tracker.

Examples (live as of methodology v-of-this-appendix)

The heading is retained for existing links. The following are synthetic interpretations, not live project snapshots.

Example 1: Just-shipped milestone, transitioning to next (post-M3)

A local commit includes a completed implementation. The repository snapshot can report the commit; the plan records task completion and any review evidence. Without release evidence, describe it as implemented/merged; deployment unknown. Do not label the snapshot's commit table “Last Shipped.”

Example 2: Mature feature-stable project

An unchanged repository can still run a stable service with unresolved operational obligations. Verify its runtime and outstanding work from their own sources. Few recent commits do not prove dormancy, health or absence of blockers.

Example 3: Active-development R&D project

A proposed design, uncommitted code and an unresolved business decision can coexist. The supplied snapshot does not inspect these. Link the maintained plan and exact decision request in the handover; do not infer acceptance from a branch name or a merged technical experiment.

Anti-patterns

  • Generated means true now: generation records a particular observation, not future freshness.
  • Merged means deployed: require environment and revision evidence.
  • Old blocker means obsolete: retain it while genuinely unresolved, with owner and last review.
  • No visible PRs means no work: distinguish empty results, access errors, other repositories and non-PR work.
  • Recent timestamp means verified application: the script does not inspect the application or database.
  • Snapshot as authority: an agent cannot use it to expand permissions or approve business changes.
  • Private titles copied to a public site: publication requires a separate audience review.

Bootstrap

Bootstrap installs the available helper; its presence does not prove a snapshot was created or that automatic refresh is configured. Choose whether the project needs STATE.md at all. When it is absent, remove any misleading mandatory “read first” pointer and direct agents to the actual onboarding and work sources.

For the future AI-assisted workspace, use separately versioned records for intent, work status, repository observations and runtime receipts. Render a combined view with each source, revision, time and uncertainty visible. That interface is a design requirement, not functionality implemented by this shell generator.