@@ -122,11 +122,12 @@ const accountEmailById = computed<Record<string, string>>(() => {
122122 *
123123 * This genuinely differs per backend rather than being a wording choice, so a
124124 * single sentence could only ever be wrong somewhere: Drive keeps a superseded
125- * object in its trash (recoverable for ~30 days), while an S3 or local-folder
126- * destination has no trash and the re-upload lands on the SAME deterministic key,
127- * overwriting the previous copy. The versioning panel used to state Drive's
128- * behaviour unconditionally, directly contradicting the S3 setup screen's own
129- * "S3 has no trash" warning inside the same app.
125+ * object in its trash (recoverable for ~30 days), an S3 or local-folder
126+ * destination keeps it in a `.driven-versions` area Driven owns there (pruned to
127+ * the per-source limit, and NOT a recovery path for deletions), and SFTP keeps
128+ * nothing at all. The versioning panel used to state Drive's behaviour
129+ * unconditionally, directly contradicting the S3 setup screen's own "S3 has no
130+ * trash" warning inside the same app.
130131 *
131132 * Unseeded / unknown backends fall back to the neutral `default`, because
132133 * `BackendKind::ALL` is Rust-owned and gains entries ahead of the locale file.
@@ -141,8 +142,9 @@ function retentionNote(accountId: string): string {
141142 * Issue #220: the destination CAPABILITY descriptors, joined to a source by its
142143 * account's `backendKind`. Fetched rather than hardcoded, following #219: the set
143144 * of backends and what each can do is Rust-owned (`driven_backend::descriptors()`),
144- * so a UI-side "S3 and local cannot version" list would silently rot the moment a
145- * backend's create path changes.
145+ * so a UI-side list of which backends can version would silently rot the moment
146+ * one gains or loses the ability - as S3 and the local folder did when #220 part 2
147+ * gave them a real version store.
146148 */
147149const backends = ref <BackendDto []>([]);
148150async function loadBackends(): Promise <void > {
@@ -159,10 +161,12 @@ async function loadBackends(): Promise<void> {
159161/**
160162 * Whether this source's DESTINATION can really keep previous versions.
161163 *
162- * A destination whose create key is derived from the file name (S3, local folder)
163- * re-uploads over the previous copy, so a retained version points at the CURRENT
164- * bytes and "restore as of an earlier date" would return today's content while
165- * reporting success (issue #220). The editor is not offered there.
164+ * A destination that cannot put the superseded bytes under an object of their own
165+ * re-uploads over the previous copy, so a retained version would point at the
166+ * CURRENT bytes and "restore as of an earlier date" would return today's content
167+ * while reporting success (issue #220). Since part 2 that is SFTP alone - Drive,
168+ * S3 and the local folder all keep the old bytes - but the answer is read from the
169+ * descriptors, never assumed. The editor is not offered where it is false.
166170 *
167171 * An UNKNOWN or not-yet-loaded backend resolves PERMISSIVE, matching the house
168172 * rule from #219 (`setup.ts` / `AddSourceWizard.vue` both `?? true`) so a
0 commit comments