Coherence: one component per idea, one spelling per word, one truth per claim

Claude-Session: https://claude.ai/code/session_01Ms2FbjQy31TVf3CEvQhGM8
This commit is contained in:
Gabriel Brown
2026-08-25 02:21:45 -04:00
parent 06c53d6c21
commit bd2fd12de2
87 changed files with 660 additions and 766 deletions
@@ -58,25 +58,25 @@ SettingsPage {
table: "camera",
label: "Camera",
detail: "",
empty: "No app has asked for the camera. The portal records an answer the first time each one asks."
empty: "No application has asked for the camera. The portal records an answer the first time each one asks."
},
{
table: "microphone",
label: "Microphone",
detail: "",
empty: "No app has asked for the microphone. The portal records an answer the first time each one asks."
empty: "No application has asked for the microphone. The portal records an answer the first time each one asks."
},
{
table: "screencast",
label: "Screen sharing",
detail: "Can capture the screen",
empty: "No app holds a screen-capture grant."
empty: "No application holds a screen-capture grant."
},
{
table: "remote-desktop",
label: "Remote desktop",
detail: "Can move the pointer and type",
empty: "No app holds a remote-control grant."
empty: "No application holds a remote-control grant."
},
{
table: "location",
@@ -89,7 +89,7 @@ SettingsPage {
function askedCount(count: int): string {
if (count === 0)
return "";
return count + (count === 1 ? " app has asked" : " apps have asked");
return count + (count === 1 ? " application has asked" : " applications have asked");
}
// What a stored secret is FOR, from its attributes. Never its value.
@@ -210,7 +210,7 @@ SettingsPage {
// An empty table means "nothing has asked" only once the store
// has been read and answered. Before that, and when the
// permission store is not running at all, every table is empty
// for the same reason -- and "no app has asked for the camera"
// for the same reason -- and "no application has asked for the camera"
// is then a measurement nobody took.
TextRow {
width: section.width
@@ -246,7 +246,7 @@ SettingsPage {
// session, so an app that has shared four times is four
// entries and one question.
detail: grantRow.confirming
? "The recorded answer goes away, and this app is asked again the next time it tries."
? "The recorded answer goes away, and this application is asked again the next time it tries."
: (!section.simple && !section.revokeOnly
? (grantRow.modelData.allowed === true ? "Allowed" : "Withheld")
: String(section.modelData.detail)
@@ -311,13 +311,14 @@ SettingsPage {
}
}
Item { width: 1; height: 10 }
// The limit, stated rather than left to be discovered. Saying "your
// camera is protected" when a system package can open /dev/video0
// would be a claim this page cannot back up.
TextRow {
label: "Only sandboxed apps are covered"
detail: "These are the answers Flatpak apps gave the permission portal. Programs installed as system packages are not sandboxed, never ask, and reach these devices directly."
divider: false
SettingsNote {
headline: "Only sandboxed applications are covered"
body: "These are the answers Flatpak applications gave the permission portal. Programs installed as system packages are not sandboxed, never ask, and reach these devices directly."
}
}
@@ -334,8 +335,8 @@ SettingsPage {
visible: Permissions.available
title: "Run in the background"
subtitle: backgroundCard.rows.length === 0
? "No app has asked to keep running with no window open."
: backgroundCard.rows.length + " app"
? "No application has asked to keep running with no window open."
: backgroundCard.rows.length + " application"
+ (backgroundCard.rows.length === 1 ? " is" : "s are")
+ " allowed to keep running with no window open."
@@ -412,10 +413,9 @@ SettingsPage {
divider: Keyring.available || Keyring.lastError !== ""
}
SettingRow {
visible: Keyring.lastError !== ""
ErrorRow {
label: "Keyring problem"
detail: Keyring.lastError
message: Keyring.lastError
divider: Keyring.available
}
@@ -544,7 +544,7 @@ SettingsPage {
TextRow {
visible: root.showingSecrets && Keyring.listed && Keyring.storedCount === 0
label: "Nothing stored yet"
detail: "Applications that save a password or token will appear here."
detail: "Applications that save a password or token will appear here"
value: ""
divider: false
}
@@ -553,7 +553,7 @@ SettingsPage {
// ── Traces ───────────────────────────────────────────────────────────────
//
// Panama's own, now. Each row clears one thing, once, when asked -- there
// is no "clean up your machine" button here and no number coloured red,
// is no "clean up your machine" button here and no number colored red,
// because none of this is a problem to be solved. It is a list of what is
// remembered, with a way to stop remembering it.
@@ -569,7 +569,7 @@ SettingsPage {
label: "Recent files"
detail: recentsRow.confirming
? "This empties the list. Applications start filling it again as you open things."
: "The recents list GTK apps show"
: "The recents list GTK applications show"
+ (Traces.measured
? " · " + Traces.recentsEntries + " entr"
+ (Traces.recentsEntries === 1 ? "y" : "ies")
@@ -710,21 +710,19 @@ SettingsPage {
}
}
Item { width: 1; height: 10 }
// A pointer, not a control: the history belongs to Vicinae, which owns
// the database Super+V browses. Offering a Clear here would mean
// reaching into another program's storage behind its back.
TextRow {
label: "Clipboard history"
detail: "Kept by Vicinae, which owns the database Super+V browses. Panama reads that history and does not clear it."
value: ""
divider: Traces.lastError !== ""
SettingsNote {
headline: "Clipboard history is kept by Vicinae"
body: "Vicinae owns the database Super+V browses. Panama reads that history and does not clear it."
}
SettingRow {
visible: Traces.lastError !== ""
ErrorRow {
label: "That did not work"
detail: Traces.lastError
divider: false
message: Traces.lastError
}
}
@@ -787,8 +785,8 @@ SettingsPage {
}
ActionRow {
label: "Per-app notifications"
detail: "Which apps may notify, and how much they may show on a locked screen"
label: "Per-application notifications"
detail: "Which applications may notify, and how much they may show on a locked screen"
action: "Open Notifications"
divider: false
onTriggered: ShellState.openSettings("notifications")