Release 0.2.0: graduation merge race fix + VITE_APP_NAME + versioning infrastructure

- Fix §13.3 step 4 race against Gitea's async mergeability
  computation: gitea.wait_for_mergeable polls the mergeable
  field before calling merge, and bot._merge_with_retry rides
  out the transient 'Please try again later' response.
- Frontend now requires VITE_APP_NAME at build time
  (frontend/vite.config.js fails the build if unset). Header
  brand, landing H1, and browser title read the deployment's
  configured name.
- Establish framework versioning: VERSION (canonical) +
  frontend/package.json#version mirror; CHANGELOG.md as the
  release log with RFC 2119 / 8174 normative-language
  upgrade-steps; SPEC.md §20 as the binding policy; CLAUDE.md
  capturing the separation-of-concerns rule; docs/DEPLOYMENTS.md
  as the downstream operating manual; docs/QUICKSTART-VISION.md
  staking the future one-command-deploy capability.
- Surgical fix to SPEC.md opening so the spec no longer asserts
  OHM is the corpus the framework produces.
- SPEC.md §19.2 gains the 'Deployment-supplied subject framing'
  candidate that drives the 0.3.0 release.
This commit is contained in:
Ben Stull
2026-05-26 06:37:48 -07:00
parent 46049d296b
commit 29c96ea300
14 changed files with 1027 additions and 37 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ export default function App() {
<div className="app">
<header className="app-header">
<div className="app-brand">
<Link to="/">Open Human Model</Link>
<Link to="/">{import.meta.env.VITE_APP_NAME}</Link>
</div>
<div className="header-right">
{/* §14.3: the persistent About link. One word, no badge, no
+7 -10
View File
@@ -1,14 +1,11 @@
// Landing.jsx — §14.1's pre-login surface.
//
// This instance hosts the Open Human Model — the corpus the framework
// produces, per PHILOSOPHY.md. The page's three jobs per §14.1 remain:
// name what this thing is, pitch why someone would care, and offer
// the sign-in affordance. Title and subtitle frame OHM-the-corpus;
// the pitch (lifted from the top of PHILOSOPHY.md) does the argument;
// a small attribution line below the deck names Wiggleverse RFC as
// the underlying process so a reader can tell what's the corpus and
// what's the software hosting it. The secondary link to `/philosophy`
// is for the reader who is interested but needs more before signing in.
// The page's three jobs per §14.1: name what this thing is, pitch why
// someone would care, and offer the sign-in affordance. The deployment
// supplies its display name via VITE_APP_NAME (see frontend/.env.example);
// the subtitle and pitch below currently carry the corpus this instance
// hosts and should be lifted into deployment config in a follow-up so
// the framework source stays brand-neutral.
import { Link } from 'react-router-dom'
@@ -16,7 +13,7 @@ export default function Landing() {
return (
<div className="landing">
<div className="landing-inner">
<h1>Open Human Model</h1>
<h1>{import.meta.env.VITE_APP_NAME}</h1>
<p className="subtitle">
An open dictionary of the words humans and machines need to agree on.
</p>