Strip self-referential guarantee copy from the UI
The app editorialised about its own guarantees all over the place. Removed or trimmed the clutter: - chat composer footer 'Chat is the write-path. Destructive changes are proposed, never assumed.' (removed) - Settings: dropped the 'no truth is lost' token note, the rebuildable-index / no-webhooks Sync essay (now one line about offline reads), the 'Reginald never does the arithmetic' model note, and the 'not configurable, that is the point' labels justification. - Onboarding: cut 'I never attempt the arithmetic myself', 'nothing human is lost', the 'no bot comments / only footprint' bootstrap claim, 'everything reversible', and 'Nothing more' from the token hint. - Directives: removed the 'entries are never edited, remembers everything politely' footer. - Issue detail: removed the 'lives in pm-state, your repo never sees it' note. - Calibration: cut 'never tracked'. Capture: cut 'no bot comments, your repo remains yours'. Connect: cut 'stored encrypted, never leaves it'. Functional guidance and status copy kept. desktop tsc + build clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -112,7 +112,7 @@ export function CalibrationScreen({ onBack, data }: { onBack: () => void; data?:
|
|||||||
<circle key={i} cx={X(e) + ((i % 5) - 2) * 3} cy={Y(a)} r="3" fill="var(--accent)" opacity="0.55" />
|
<circle key={i} cx={X(e) + ((i % 5) - 2) * 3} cy={Y(a)} r="3" fill="var(--accent)" opacity="0.55" />
|
||||||
))}
|
))}
|
||||||
</svg>
|
</svg>
|
||||||
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: '8px 0 0' }}>estimated (x) vs actual days (y) · actuals inferred from git events, never tracked</p>
|
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: '8px 0 0' }}>estimated (x) vs actual days (y)</p>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ export function CaptureScreen({ onDone }: { onDone: () => void }) {
|
|||||||
{live ? filedCount : tickets.length} issues opened in gitea with <span style={{ font: 'var(--text-data)' }}>est/*</span> and <span style={{ font: 'var(--text-data)' }}>p/*</span> labels, nothing else touched.
|
{live ? filedCount : tickets.length} issues opened in gitea with <span style={{ font: 'var(--text-data)' }}>est/*</span> and <span style={{ font: 'var(--text-data)' }}>p/*</span> labels, nothing else touched.
|
||||||
</p>
|
</p>
|
||||||
<p style={{ font: 'var(--text-agent)', color: 'var(--ink-2)', margin: 0 }}>
|
<p style={{ font: 'var(--text-agent)', color: 'var(--ink-2)', margin: 0 }}>
|
||||||
Elapsed {clock}, under budget. No bot comments, no synthetic issues; your repo remains yours.
|
Elapsed {clock}.
|
||||||
</p>
|
</p>
|
||||||
<Button iconRight="arrow-right" onClick={onDone}>To morning service</Button>
|
<Button iconRight="arrow-right" onClick={onDone}>To morning service</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export function ConnectScreen({ onConnected, existing }: { onConnected: () => vo
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<p style={{ font: 'var(--text-body)', color: 'var(--ink-2)', margin: '0 0 18px' }}>
|
<p style={{ font: 'var(--text-body)', color: 'var(--ink-2)', margin: '0 0 18px' }}>
|
||||||
Connect your Gitea. Your token is stored encrypted on this machine and never leaves it.
|
Connect your Gitea.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
|
||||||
|
|||||||
@@ -115,10 +115,6 @@ export function DirectivesScreen() {
|
|||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: 0 }}>
|
|
||||||
Entries are never edited. Corrections are new entries; the ledger remembers everything, politely.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -335,12 +335,6 @@ export function IssueScreen({
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{/* provenance note */}
|
|
||||||
<div style={{ padding: '10px 20px 14px', borderTop: '1px solid var(--line-1)' }}>
|
|
||||||
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: 0 }}>
|
|
||||||
Lives in pm-state. Your repo never sees any of it.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -155,11 +155,11 @@ export function OnboardingScreen({ onConnected }: { onConnected: (dest: 'focus'
|
|||||||
<Frame footer={<Button iconRight="arrow-right" onClick={() => setStep(1)}>Begin</Button>}>
|
<Frame footer={<Button iconRight="arrow-right" onClick={() => setStep(1)}>Begin</Button>}>
|
||||||
<h1 style={{ font: 'var(--text-title)', color: 'var(--ink-1)', margin: 0 }}>Good morning.</h1>
|
<h1 style={{ font: 'var(--text-title)', color: 'var(--ink-1)', margin: 0 }}>Good morning.</h1>
|
||||||
<p style={{ font: 'var(--text-agent-lg)', color: 'var(--ink-2)', margin: 0 }}>
|
<p style={{ font: 'var(--text-agent-lg)', color: 'var(--ink-2)', margin: 0 }}>
|
||||||
I am Reginald, your project manager. I interview you rather than trouble you with forms, I forecast in
|
I am Reginald, your project manager. I interview you rather than trouble you with forms, and I forecast
|
||||||
honest ranges, and I never attempt the arithmetic myself; there is a scheduler for that.
|
in honest ranges.
|
||||||
</p>
|
</p>
|
||||||
<p style={{ font: 'var(--text-body)', color: 'var(--ink-2)', margin: 0 }}>
|
<p style={{ font: 'var(--text-body)', color: 'var(--ink-2)', margin: 0 }}>
|
||||||
Your plans reside in your own Gitea as ordinary issues and labels. Dismiss me, and nothing human is lost.
|
Your plans reside in your own Gitea as ordinary issues and labels.
|
||||||
</p>
|
</p>
|
||||||
</Frame>
|
</Frame>
|
||||||
) : null}
|
) : null}
|
||||||
@@ -196,7 +196,7 @@ export function OnboardingScreen({ onConnected }: { onConnected: (dest: 'focus'
|
|||||||
type="password"
|
type="password"
|
||||||
value={token}
|
value={token}
|
||||||
placeholder="gitea PAT"
|
placeholder="gitea PAT"
|
||||||
hint="Scopes: repo, issue. Nothing more."
|
hint="Scopes: repo, issue."
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setToken(e.target.value)
|
setToken(e.target.value)
|
||||||
setDiscovery('idle')
|
setDiscovery('idle')
|
||||||
@@ -352,14 +352,11 @@ export function OnboardingScreen({ onConnected }: { onConnected: (dest: 'focus'
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: 0 }}>
|
|
||||||
No bot comments, no body frontmatter, no synthetic issues, ever. Labels are the only footprint.
|
|
||||||
</p>
|
|
||||||
</Frame>
|
</Frame>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span style={{ font: '400 11px var(--font-mono)', color: 'var(--ink-3)' }}>first run · everything reversible</span>
|
<span style={{ font: '400 11px var(--font-mono)', color: 'var(--ink-3)' }}>first run</span>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ export function SettingsScreen({
|
|||||||
<Icon name="layers" size={12} />
|
<Icon name="layers" size={12} />
|
||||||
sidecar: {connection.pmStateRepo ?? `${connection.repo}-pm-state`}
|
sidecar: {connection.pmStateRepo ?? `${connection.repo}-pm-state`}
|
||||||
</Row>
|
</Row>
|
||||||
<Note>Your token is stored encrypted on this machine. Delete the sidecar and resync; no truth is lost.</Note>
|
|
||||||
<Row style={{ gap: 8, marginTop: 2 }}>
|
<Row style={{ gap: 8, marginTop: 2 }}>
|
||||||
<Button variant="secondary" size="sm" icon="settings-2" onClick={onReconnect}>
|
<Button variant="secondary" size="sm" icon="settings-2" onClick={onReconnect}>
|
||||||
Reconfigure
|
Reconfigure
|
||||||
@@ -105,11 +104,7 @@ export function SettingsScreen({
|
|||||||
Reconciles on launch and after every write
|
Reconciles on launch and after every write
|
||||||
</span>
|
</span>
|
||||||
</Row>
|
</Row>
|
||||||
<Note>
|
<Note>Offline, the board reads from the last cached snapshot.</Note>
|
||||||
The board is a rebuildable index over gitea, the durable truth. When gitea is unreachable the last
|
|
||||||
snapshot is served from cache (the rail's dot turns red), and the next successful reconcile supersedes it.
|
|
||||||
No webhooks, no polling: reads are on demand.
|
|
||||||
</Note>
|
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
@@ -135,8 +130,7 @@ export function SettingsScreen({
|
|||||||
</Row>
|
</Row>
|
||||||
)}
|
)}
|
||||||
<Note>
|
<Note>
|
||||||
An OpenAI-compatible endpoint (set it in Reconfigure). Reginald names, negotiates and explains; it never
|
An OpenAI-compatible endpoint (set it in Reconfigure).
|
||||||
does the arithmetic; the scheduler and Monte Carlo do that.
|
|
||||||
</Note>
|
</Note>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -154,7 +148,7 @@ export function SettingsScreen({
|
|||||||
))}
|
))}
|
||||||
<Tag label="deadline/hard" />
|
<Tag label="deadline/hard" />
|
||||||
</Row>
|
</Row>
|
||||||
<Note>Fixed sets, human-meaningful, visible in gitea. Not configurable: that is rather the point.</Note>
|
<Note>The fixed label vocabulary, visible in gitea.</Note>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
|||||||
@@ -198,9 +198,6 @@ export function ChatPanel({ onOpenDirectives, offline, onApplyChange }: ChatPane
|
|||||||
<Icon name="send" size={14} />
|
<Icon name="send" size={14} />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<p style={{ font: 'var(--text-caption)', color: 'var(--ink-3)', margin: '8px 2px 0' }}>
|
|
||||||
Chat is the write-path. Destructive changes are proposed, never assumed.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user