From 091792bebda43aabe8af4b0213f51ecf57b4232f Mon Sep 17 00:00:00 2001
From: barckcode
Date: Fri, 2 Oct 2026 22:36:43 +0200
Subject: [PATCH 1/5] docs(terms): workspace backup add-on terms
Under Membership and payments (EN + ES): no backups unless the add-on
is active; daily crash-consistent snapshots kept 7 days; enabling
charges right away (prorated on a slot), turning it off gives no
partial refund; turning it off or deleting the workspace deletes all
snapshots; an ending slot or lost free-workspace benefit stops billing
and keeps snapshots until the workspace is deleted at the end of its
grace period. Pinned by tests.
Refs helmcode/nan#130
Co-Authored-By: Claude Opus 5.5
---
src/pages/es/terms.astro | 16 ++++-
src/pages/terms.astro | 14 +++-
src/tests/legal/workspaceBackupTerms.test.ts | 75 ++++++++++++++++++++
3 files changed, 103 insertions(+), 2 deletions(-)
create mode 100644 src/tests/legal/workspaceBackupTerms.test.ts
diff --git a/src/pages/es/terms.astro b/src/pages/es/terms.astro
index f1bf1be..e9e8928 100644
--- a/src/pages/es/terms.astro
+++ b/src/pages/es/terms.astro
@@ -2,7 +2,7 @@
import Legal from '../../layouts/NanLegal.astro';
---
-
+
NaN está operada por Helmcode S.L. (NIF B44788511), Avenida Quinto Centenario 27,
Santiago del Teide, España. Contacto: info@helmcode.com.
@@ -28,6 +28,20 @@ import Legal from '../../layouts/NanLegal.astro';
La membresía es una suscripción mensual con impuestos incluidos, mes a mes, sin compromiso. Puedes
cancelar cuando quieras; el acceso se mantiene hasta el final del periodo pagado.
+
+ Copias de seguridad de workspaces. Los workspaces no tienen copias de seguridad salvo
+ que el complemento de backups esté activo. Con el complemento, se toma una instantánea del disco del
+ workspace una vez al día y se conserva durante 7 días. Las instantáneas son consistentes ante caídas
+ (crash-consistent): restaurar una equivale a que la máquina se quede sin corriente en el momento en que se
+ tomó, así que los datos que el workspace aún no había escrito en disco no se incluyen y las bases de datos en
+ ejecución se recuperan como tras un corte de luz. Activar el complemento cobra el primer pago en el momento
+ (prorrateado hasta la fecha de renovación cuando se añade a la suscripción de un slot); desactivarlo lo
+ elimina de inmediato sin reembolso del mes en curso. Desactivar el complemento o eliminar el workspace borra
+ todas sus instantáneas de forma permanente. Si el slot del workspace termina, o un workspace gratuito pierde
+ el beneficio de la membresía, el complemento deja de cobrarse y las instantáneas existentes se conservan hasta
+ que el propio workspace se elimine al final de su periodo de gracia; entonces se borran de forma permanente y
+ no se pueden recuperar.
+
Propiedad intelectual
diff --git a/src/pages/terms.astro b/src/pages/terms.astro
index 6fb7148..c829f1e 100644
--- a/src/pages/terms.astro
+++ b/src/pages/terms.astro
@@ -2,7 +2,7 @@
import Legal from '../layouts/NanLegal.astro';
---
-
+
NaN is operated by Helmcode S.L. (NIF B44788511), Avenida Quinto Centenario 27,
Santiago del Teide, Spain. Contact: info@helmcode.com.
@@ -28,6 +28,18 @@ import Legal from '../layouts/NanLegal.astro';
Membership is a monthly subscription with taxes included, month to month, with no commitment. You can
cancel anytime; access runs until the end of the paid period.
+
+ Workspace backups. Workspaces have no backups unless the workspace backup add-on is
+ active. With the add-on, a snapshot of the workspace disk is taken once a day and kept for 7 days.
+ Snapshots are crash-consistent: restoring one is equivalent to the machine losing power at the moment the
+ snapshot was taken, so data the workspace had not yet written to disk is not included and running databases
+ recover as after a power cut. Enabling the add-on charges the first payment right away (prorated to the
+ renewal date when it is added to a slot subscription); turning it off removes it immediately with no refund
+ for the current month. Turning the add-on off or deleting the workspace deletes all its snapshots
+ permanently. If the workspace's slot ends, or a free workspace loses the membership benefit, the add-on stops
+ being billed and the existing snapshots are kept until the workspace itself is deleted at the end of its
+ grace period; they are then deleted permanently and cannot be recovered.
+
Intellectual property
diff --git a/src/tests/legal/workspaceBackupTerms.test.ts b/src/tests/legal/workspaceBackupTerms.test.ts
new file mode 100644
index 0000000..6f9f704
--- /dev/null
+++ b/src/tests/legal/workspaceBackupTerms.test.ts
@@ -0,0 +1,75 @@
+import { describe, expect, test } from 'vitest';
+import { readFileSync } from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname, resolve } from 'node:path';
+
+/**
+ * Workspace backup add-on (helmcode/nan#130): the terms are the contract the
+ * UI copy points at. These tests pin the promises that must never drift:
+ * no backups without the add-on, daily crash-consistent snapshots, 7-day
+ * retention, deletion on disable/workspace deletion, snapshots kept until the
+ * workspace is deleted when a slot or benefit ends, and no partial refund.
+ */
+const here = dirname(fileURLToPath(import.meta.url));
+const pages = resolve(here, '../../pages');
+const flat = (p: string) => readFileSync(resolve(pages, p), 'utf-8').replace(/\s+/g, ' ');
+
+function section(src: string): string {
+ const m = src.match(/
(.*?)<\/p>/);
+ expect(m, 'workspace-backups paragraph present').toBeTruthy();
+ return m![1].replace(/<[^>]+>/g, '');
+}
+
+describe('terms: workspace backups (EN)', () => {
+ const src = flat('terms.astro');
+ const p = section(src);
+
+ test('sits under "Membership and payments"', () => {
+ const h = src.indexOf('
Membership and payments
');
+ const next = src.indexOf('', h + 1);
+ const at = src.indexOf('id="workspace-backups"');
+ expect(h).toBeGreaterThan(-1);
+ expect(at).toBeGreaterThan(h);
+ expect(at).toBeLessThan(next);
+ });
+
+ test('states every promise', () => {
+ expect(p).toContain('no backups unless the workspace backup add-on is active');
+ expect(p).toContain('once a day and kept for 7 days');
+ expect(p).toContain('crash-consistent');
+ expect(p).toContain('power');
+ expect(p).toContain('no refund for the current month');
+ expect(p).toContain('Turning the add-on off or deleting the workspace deletes all its snapshots permanently');
+ expect(p).toContain('kept until the workspace itself is deleted at the end of its grace period');
+ });
+
+ test('never promises deletion at slot end (owner rule 2026-10-02)', () => {
+ const clause = p.slice(p.indexOf("If the workspace's slot ends")).split(';')[0];
+ expect(clause).toContain('stops being billed');
+ expect(clause).toContain('existing snapshots are kept until the workspace itself is deleted');
+ expect(clause).not.toMatch(/snapshots are deleted|deletes all/);
+ });
+});
+
+describe('terms: workspace backups (ES)', () => {
+ const src = flat('es/terms.astro');
+ const p = section(src);
+
+ test('sits under "Membresía y pagos"', () => {
+ const h = src.indexOf('Membresía y pagos
');
+ const next = src.indexOf('', h + 1);
+ const at = src.indexOf('id="workspace-backups"');
+ expect(h).toBeGreaterThan(-1);
+ expect(at).toBeGreaterThan(h);
+ expect(at).toBeLessThan(next);
+ });
+
+ test('states every promise', () => {
+ expect(p).toContain('no tienen copias de seguridad salvo que el complemento de backups esté activo');
+ expect(p).toContain('una vez al día y se conserva durante 7 días');
+ expect(p).toContain('crash-consistent');
+ expect(p).toContain('sin reembolso del mes en curso');
+ expect(p).toContain('Desactivar el complemento o eliminar el workspace borra todas sus instantáneas de forma permanente');
+ expect(p).toContain('se conservan hasta que el propio workspace se elimine al final de su periodo de gracia');
+ });
+});
From d8381ab7c3b2d985e5a19cd293e5d75ccc5b8d4f Mon Sep 17 00:00:00 2001
From: barckcode
Date: Fri, 2 Oct 2026 22:38:11 +0200
Subject: [PATCH 2/5] docs(terms): restoring brings back self-configured access
Co-Authored-By: Claude Opus 5.5
---
src/pages/es/terms.astro | 4 +++-
src/pages/terms.astro | 4 +++-
src/tests/legal/workspaceBackupTerms.test.ts | 4 ++++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/pages/es/terms.astro b/src/pages/es/terms.astro
index e9e8928..501185c 100644
--- a/src/pages/es/terms.astro
+++ b/src/pages/es/terms.astro
@@ -34,7 +34,9 @@ import Legal from '../../layouts/NanLegal.astro';
workspace una vez al día y se conserva durante 7 días. Las instantáneas son consistentes ante caídas
(crash-consistent): restaurar una equivale a que la máquina se quede sin corriente en el momento en que se
tomó, así que los datos que el workspace aún no había escrito en disco no se incluyen y las bases de datos en
- ejecución se recuperan como tras un corte de luz. Activar el complemento cobra el primer pago en el momento
+ ejecución se recuperan como tras un corte de luz. Restaurar una instantánea recupera todo lo que había en el
+ disco en ese momento, incluido cualquier acceso que hayas configurado tú (por ejemplo claves SSH o ajustes del
+ servidor SSH que añadieras); la plataforma solo vuelve a aplicar tu clave SSH actual de NaN. Activar el complemento cobra el primer pago en el momento
(prorrateado hasta la fecha de renovación cuando se añade a la suscripción de un slot); desactivarlo lo
elimina de inmediato sin reembolso del mes en curso. Desactivar el complemento o eliminar el workspace borra
todas sus instantáneas de forma permanente. Si el slot del workspace termina, o un workspace gratuito pierde
diff --git a/src/pages/terms.astro b/src/pages/terms.astro
index c829f1e..e3e4e9c 100644
--- a/src/pages/terms.astro
+++ b/src/pages/terms.astro
@@ -33,7 +33,9 @@ import Legal from '../layouts/NanLegal.astro';
active. With the add-on, a snapshot of the workspace disk is taken once a day and kept for 7 days.
Snapshots are crash-consistent: restoring one is equivalent to the machine losing power at the moment the
snapshot was taken, so data the workspace had not yet written to disk is not included and running databases
- recover as after a power cut. Enabling the add-on charges the first payment right away (prorated to the
+ recover as after a power cut. Restoring a snapshot brings back everything that was on the disk at that time,
+ including any access you configured yourself (for example SSH keys or SSH server settings you added); only
+ your current NaN SSH key is re-applied by the platform. Enabling the add-on charges the first payment right away (prorated to the
renewal date when it is added to a slot subscription); turning it off removes it immediately with no refund
for the current month. Turning the add-on off or deleting the workspace deletes all its snapshots
permanently. If the workspace's slot ends, or a free workspace loses the membership benefit, the add-on stops
diff --git a/src/tests/legal/workspaceBackupTerms.test.ts b/src/tests/legal/workspaceBackupTerms.test.ts
index 6f9f704..022e47e 100644
--- a/src/tests/legal/workspaceBackupTerms.test.ts
+++ b/src/tests/legal/workspaceBackupTerms.test.ts
@@ -41,6 +41,8 @@ describe('terms: workspace backups (EN)', () => {
expect(p).toContain('no refund for the current month');
expect(p).toContain('Turning the add-on off or deleting the workspace deletes all its snapshots permanently');
expect(p).toContain('kept until the workspace itself is deleted at the end of its grace period');
+ expect(p).toContain('including any access you configured yourself');
+ expect(p).toContain('only your current NaN SSH key is re-applied');
});
test('never promises deletion at slot end (owner rule 2026-10-02)', () => {
@@ -71,5 +73,7 @@ describe('terms: workspace backups (ES)', () => {
expect(p).toContain('sin reembolso del mes en curso');
expect(p).toContain('Desactivar el complemento o eliminar el workspace borra todas sus instantáneas de forma permanente');
expect(p).toContain('se conservan hasta que el propio workspace se elimine al final de su periodo de gracia');
+ expect(p).toContain('incluido cualquier acceso que hayas configurado tú');
+ expect(p).toContain('solo vuelve a aplicar tu clave SSH actual de NaN');
});
});
From a6d115f6a627f88cf839b6a294e60d38cf8ef04d Mon Sep 17 00:00:00 2001
From: barckcode
Date: Fri, 2 Oct 2026 23:17:16 +0200
Subject: [PATCH 3/5] docs(terms): restore limits, grace rules and the 14-day
re-enable window
Adds the product decision: up to 3 restores per workspace in any 24h,
no on-demand backups; restores only while the add-on is active (during
grace: active slot or renewed membership, then turn the add-on on
again, billed again); when billing ends no new snapshots are taken and
existing ones are kept until the workspace is deleted; back in good
standing but not re-enabled within 14 days -> add-on ends, snapshots
deleted. EN + ES, each promise pinned by tests.
Co-Authored-By: Claude Opus 5.5
---
src/pages/es/terms.astro | 19 ++++++++-----
src/pages/terms.astro | 17 +++++++-----
src/tests/legal/workspaceBackupTerms.test.ts | 28 ++++++++++++++++----
3 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/src/pages/es/terms.astro b/src/pages/es/terms.astro
index 501185c..f51d1c8 100644
--- a/src/pages/es/terms.astro
+++ b/src/pages/es/terms.astro
@@ -36,13 +36,18 @@ import Legal from '../../layouts/NanLegal.astro';
tomó, así que los datos que el workspace aún no había escrito en disco no se incluyen y las bases de datos en
ejecución se recuperan como tras un corte de luz. Restaurar una instantánea recupera todo lo que había en el
disco en ese momento, incluido cualquier acceso que hayas configurado tú (por ejemplo claves SSH o ajustes del
- servidor SSH que añadieras); la plataforma solo vuelve a aplicar tu clave SSH actual de NaN. Activar el complemento cobra el primer pago en el momento
- (prorrateado hasta la fecha de renovación cuando se añade a la suscripción de un slot); desactivarlo lo
- elimina de inmediato sin reembolso del mes en curso. Desactivar el complemento o eliminar el workspace borra
- todas sus instantáneas de forma permanente. Si el slot del workspace termina, o un workspace gratuito pierde
- el beneficio de la membresía, el complemento deja de cobrarse y las instantáneas existentes se conservan hasta
- que el propio workspace se elimine al final de su periodo de gracia; entonces se borran de forma permanente y
- no se pueden recuperar.
+ servidor SSH que añadieras); la plataforma solo vuelve a aplicar tu clave SSH actual de NaN. Puedes restaurar
+ hasta 3 veces por workspace en cualquier periodo de 24 horas; no hay copias bajo demanda. Las instantáneas
+ solo se pueden restaurar mientras el complemento esté activo: durante un periodo de gracia tienes que asociar
+ el workspace a un slot activo (o renovar la membresía, si es un workspace gratuito) y volver a activar el
+ complemento, que se cobra de nuevo. Activar el complemento cobra el primer pago en el momento (prorrateado
+ hasta la fecha de renovación cuando se añade a la suscripción de un slot); desactivarlo lo elimina de
+ inmediato sin reembolso del mes en curso. Desactivar el complemento o eliminar el workspace borra todas sus
+ instantáneas de forma permanente. Si el slot del workspace termina, o un workspace gratuito pierde el
+ beneficio de la membresía, el complemento deja de cobrarse. Cuando termina la facturación, no se toman nuevas
+ instantáneas y las existentes se conservan hasta que se elimine el workspace al final de su periodo de
+ gracia. Si el workspace vuelve a estar al día pero el complemento no se reactiva en un plazo de 14 días, el
+ complemento termina y sus instantáneas se borran. Las instantáneas borradas no se pueden recuperar.
Propiedad intelectual
diff --git a/src/pages/terms.astro b/src/pages/terms.astro
index e3e4e9c..69029c7 100644
--- a/src/pages/terms.astro
+++ b/src/pages/terms.astro
@@ -35,12 +35,17 @@ import Legal from '../layouts/NanLegal.astro';
snapshot was taken, so data the workspace had not yet written to disk is not included and running databases
recover as after a power cut. Restoring a snapshot brings back everything that was on the disk at that time,
including any access you configured yourself (for example SSH keys or SSH server settings you added); only
- your current NaN SSH key is re-applied by the platform. Enabling the add-on charges the first payment right away (prorated to the
- renewal date when it is added to a slot subscription); turning it off removes it immediately with no refund
- for the current month. Turning the add-on off or deleting the workspace deletes all its snapshots
- permanently. If the workspace's slot ends, or a free workspace loses the membership benefit, the add-on stops
- being billed and the existing snapshots are kept until the workspace itself is deleted at the end of its
- grace period; they are then deleted permanently and cannot be recovered.
+ your current NaN SSH key is re-applied by the platform. You can restore up to 3 times per workspace in any
+ 24 hours; there are no on-demand backups. Snapshots can only be restored while the add-on is active: during a
+ grace period you must attach the workspace to an active slot (or renew the membership, for a free workspace)
+ and turn the add-on on again, which is billed again. Enabling the add-on charges the first payment right away
+ (prorated to the renewal date when it is added to a slot subscription); turning it off removes it immediately
+ with no refund for the current month. Turning the add-on off or deleting the workspace deletes all its
+ snapshots permanently. If the workspace's slot ends, or a free workspace loses the membership benefit, the
+ add-on stops being billed. When billing ends, no new snapshots are taken and existing snapshots are kept until
+ the workspace is deleted at the end of its grace period. If the workspace is back in good standing but the
+ add-on is not turned on again within 14 days, the add-on ends and its snapshots are deleted. Deleted
+ snapshots cannot be recovered.
Intellectual property
diff --git a/src/tests/legal/workspaceBackupTerms.test.ts b/src/tests/legal/workspaceBackupTerms.test.ts
index 022e47e..f2c4f5e 100644
--- a/src/tests/legal/workspaceBackupTerms.test.ts
+++ b/src/tests/legal/workspaceBackupTerms.test.ts
@@ -40,15 +40,24 @@ describe('terms: workspace backups (EN)', () => {
expect(p).toContain('power');
expect(p).toContain('no refund for the current month');
expect(p).toContain('Turning the add-on off or deleting the workspace deletes all its snapshots permanently');
- expect(p).toContain('kept until the workspace itself is deleted at the end of its grace period');
+ expect(p).toContain('the add-on stops being billed');
expect(p).toContain('including any access you configured yourself');
expect(p).toContain('only your current NaN SSH key is re-applied');
});
+ test('restore limits and grace rules (product decision 2026-10-02)', () => {
+ expect(p).toContain('You can restore up to 3 times per workspace in any 24 hours');
+ expect(p).toContain('there are no on-demand backups');
+ expect(p).toContain('Snapshots can only be restored while the add-on is active');
+ expect(p).toContain('attach the workspace to an active slot (or renew the membership, for a free workspace) and turn the add-on on again, which is billed again');
+ expect(p).toContain('When billing ends, no new snapshots are taken and existing snapshots are kept until the workspace is deleted');
+ expect(p).toContain('within 14 days');
+ });
+
test('never promises deletion at slot end (owner rule 2026-10-02)', () => {
- const clause = p.slice(p.indexOf("If the workspace's slot ends")).split(';')[0];
- expect(clause).toContain('stops being billed');
- expect(clause).toContain('existing snapshots are kept until the workspace itself is deleted');
+ const clause = p.slice(p.indexOf('When billing ends')).split('.')[0];
+ expect(clause).toContain('no new snapshots are taken');
+ expect(clause).toContain('existing snapshots are kept until the workspace is deleted');
expect(clause).not.toMatch(/snapshots are deleted|deletes all/);
});
});
@@ -72,8 +81,17 @@ describe('terms: workspace backups (ES)', () => {
expect(p).toContain('crash-consistent');
expect(p).toContain('sin reembolso del mes en curso');
expect(p).toContain('Desactivar el complemento o eliminar el workspace borra todas sus instantáneas de forma permanente');
- expect(p).toContain('se conservan hasta que el propio workspace se elimine al final de su periodo de gracia');
+ expect(p).toContain('el complemento deja de cobrarse');
expect(p).toContain('incluido cualquier acceso que hayas configurado tú');
expect(p).toContain('solo vuelve a aplicar tu clave SSH actual de NaN');
});
+
+ test('límites de restauración y reglas de gracia', () => {
+ expect(p).toContain('Puedes restaurar hasta 3 veces por workspace en cualquier periodo de 24 horas');
+ expect(p).toContain('no hay copias bajo demanda');
+ expect(p).toContain('Las instantáneas solo se pueden restaurar mientras el complemento esté activo');
+ expect(p).toContain('volver a activar el complemento, que se cobra de nuevo');
+ expect(p).toContain('Cuando termina la facturación, no se toman nuevas instantáneas y las existentes se conservan hasta que se elimine el workspace');
+ expect(p).toContain('en un plazo de 14 días');
+ });
});
From 7ce5a4ce19e0189580ac4b5b3ce1559d20eeed1a Mon Sep 17 00:00:00 2001
From: barckcode
Date: Sun, 4 Oct 2026 11:25:39 +0200
Subject: [PATCH 4/5] docs(terms): turning backups on again resumes the 7-day
retention
Kept snapshots are not pruned while the add-on is off; re-enabling it
resumes retention and the next daily snapshot removes every snapshot
older than 7 days (cloud-api #295). EN + ES, pinned by tests.
Co-Authored-By: Claude Opus 5.5
---
src/pages/es/terms.astro | 7 +++++--
src/pages/terms.astro | 7 ++++---
src/tests/legal/workspaceBackupTerms.test.ts | 10 ++++++++++
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/pages/es/terms.astro b/src/pages/es/terms.astro
index f51d1c8..e6c27a1 100644
--- a/src/pages/es/terms.astro
+++ b/src/pages/es/terms.astro
@@ -2,7 +2,7 @@
import Legal from '../../layouts/NanLegal.astro';
---
-
+
NaN está operada por Helmcode S.L. (NIF B44788511), Avenida Quinto Centenario 27,
Santiago del Teide, España. Contacto: info@helmcode.com.
@@ -47,7 +47,10 @@ import Legal from '../../layouts/NanLegal.astro';
beneficio de la membresía, el complemento deja de cobrarse. Cuando termina la facturación, no se toman nuevas
instantáneas y las existentes se conservan hasta que se elimine el workspace al final de su periodo de
gracia. Si el workspace vuelve a estar al día pero el complemento no se reactiva en un plazo de 14 días, el
- complemento termina y sus instantáneas se borran. Las instantáneas borradas no se pueden recuperar.
+ complemento termina y sus instantáneas se borran. Las instantáneas conservadas no se eliminan mientras
+ el complemento esté desactivado, pero al volver a activarlo se reanuda la retención de 7 días: la siguiente
+ instantánea diaria elimina todas las instantáneas con más de 7 días, así que restaura antes la que necesites.
+ Las instantáneas borradas no se pueden recuperar.
Propiedad intelectual
diff --git a/src/pages/terms.astro b/src/pages/terms.astro
index 69029c7..fe19498 100644
--- a/src/pages/terms.astro
+++ b/src/pages/terms.astro
@@ -2,7 +2,7 @@
import Legal from '../layouts/NanLegal.astro';
---
-
+
NaN is operated by Helmcode S.L. (NIF B44788511), Avenida Quinto Centenario 27,
Santiago del Teide, Spain. Contact: info@helmcode.com.
@@ -44,8 +44,9 @@ import Legal from '../layouts/NanLegal.astro';
snapshots permanently. If the workspace's slot ends, or a free workspace loses the membership benefit, the
add-on stops being billed. When billing ends, no new snapshots are taken and existing snapshots are kept until
the workspace is deleted at the end of its grace period. If the workspace is back in good standing but the
- add-on is not turned on again within 14 days, the add-on ends and its snapshots are deleted. Deleted
- snapshots cannot be recovered.
+ add-on is not turned on again within 14 days, the add-on ends and its snapshots are deleted. Kept snapshots are not pruned while
+ the add-on is off, but turning it on again resumes the 7-day retention: the next daily snapshot removes every
+ snapshot older than 7 days, so restore the one you need first. Deleted snapshots cannot be recovered.
Intellectual property
diff --git a/src/tests/legal/workspaceBackupTerms.test.ts b/src/tests/legal/workspaceBackupTerms.test.ts
index f2c4f5e..fb1b77f 100644
--- a/src/tests/legal/workspaceBackupTerms.test.ts
+++ b/src/tests/legal/workspaceBackupTerms.test.ts
@@ -54,6 +54,11 @@ describe('terms: workspace backups (EN)', () => {
expect(p).toContain('within 14 days');
});
+ test('turning the add-on on again resumes retention (cloud-api #295)', () => {
+ expect(p).toContain('Kept snapshots are not pruned while the add-on is off');
+ expect(p).toContain('turning it on again resumes the 7-day retention: the next daily snapshot removes every snapshot older than 7 days, so restore the one you need first');
+ });
+
test('never promises deletion at slot end (owner rule 2026-10-02)', () => {
const clause = p.slice(p.indexOf('When billing ends')).split('.')[0];
expect(clause).toContain('no new snapshots are taken');
@@ -94,4 +99,9 @@ describe('terms: workspace backups (ES)', () => {
expect(p).toContain('Cuando termina la facturación, no se toman nuevas instantáneas y las existentes se conservan hasta que se elimine el workspace');
expect(p).toContain('en un plazo de 14 días');
});
+
+ test('reactivar el complemento reanuda la retención', () => {
+ expect(p).toContain('Las instantáneas conservadas no se eliminan mientras el complemento esté desactivado');
+ expect(p).toContain('al volver a activarlo se reanuda la retención de 7 días: la siguiente instantánea diaria elimina todas las instantáneas con más de 7 días, así que restaura antes la que necesites');
+ });
});
From 6df83991d9f7686b171d1bbf66b1b672c1194b03 Mon Sep 17 00:00:00 2001
From: barckcode
Date: Sun, 4 Oct 2026 12:26:55 +0200
Subject: [PATCH 5/5] docs(terms): only the last 7 days are restorable after
turning backups on again
The previous wording ("so restore the one you need first") promised
something the API cannot do: restore is blocked while the add-on is off,
and after it is on again cloud-api #295 lists and restores only snapshots
within the 7-day retention; the next daily backup deletes older kept
snapshots. EN + ES updated, pinned by tests (including a negative assert
on the old promise).
Co-Authored-By: Claude Opus 5.5
---
src/pages/es/terms.astro | 5 +++--
src/pages/terms.astro | 4 ++--
src/tests/legal/workspaceBackupTerms.test.ts | 15 +++++++++------
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/pages/es/terms.astro b/src/pages/es/terms.astro
index e6c27a1..d3a5454 100644
--- a/src/pages/es/terms.astro
+++ b/src/pages/es/terms.astro
@@ -48,8 +48,9 @@ import Legal from '../../layouts/NanLegal.astro';
instantáneas y las existentes se conservan hasta que se elimine el workspace al final de su periodo de
gracia. Si el workspace vuelve a estar al día pero el complemento no se reactiva en un plazo de 14 días, el
complemento termina y sus instantáneas se borran. Las instantáneas conservadas no se eliminan mientras
- el complemento esté desactivado, pero al volver a activarlo se reanuda la retención de 7 días: la siguiente
- instantánea diaria elimina todas las instantáneas con más de 7 días, así que restaura antes la que necesites.
+ el complemento esté desactivado. Cuando el complemento se vuelve a activar, solo se pueden restaurar las
+ instantáneas de los últimos 7 días; las instantáneas conservadas más antiguas se eliminan con la siguiente
+ copia diaria.
Las instantáneas borradas no se pueden recuperar.
diff --git a/src/pages/terms.astro b/src/pages/terms.astro
index fe19498..5a5d592 100644
--- a/src/pages/terms.astro
+++ b/src/pages/terms.astro
@@ -45,8 +45,8 @@ import Legal from '../layouts/NanLegal.astro';
add-on stops being billed. When billing ends, no new snapshots are taken and existing snapshots are kept until
the workspace is deleted at the end of its grace period. If the workspace is back in good standing but the
add-on is not turned on again within 14 days, the add-on ends and its snapshots are deleted. Kept snapshots are not pruned while
- the add-on is off, but turning it on again resumes the 7-day retention: the next daily snapshot removes every
- snapshot older than 7 days, so restore the one you need first. Deleted snapshots cannot be recovered.
+ the add-on is off. After the add-on is turned on again, only snapshots from the last 7 days can be restored;
+ older kept snapshots are deleted with the next daily backup. Deleted snapshots cannot be recovered.
Intellectual property
diff --git a/src/tests/legal/workspaceBackupTerms.test.ts b/src/tests/legal/workspaceBackupTerms.test.ts
index fb1b77f..e29d09c 100644
--- a/src/tests/legal/workspaceBackupTerms.test.ts
+++ b/src/tests/legal/workspaceBackupTerms.test.ts
@@ -54,9 +54,11 @@ describe('terms: workspace backups (EN)', () => {
expect(p).toContain('within 14 days');
});
- test('turning the add-on on again resumes retention (cloud-api #295)', () => {
- expect(p).toContain('Kept snapshots are not pruned while the add-on is off');
- expect(p).toContain('turning it on again resumes the 7-day retention: the next daily snapshot removes every snapshot older than 7 days, so restore the one you need first');
+ test('after turning the add-on on again only the last 7 days are restorable (cloud-api #295)', () => {
+ expect(p).toContain('Kept snapshots are not pruned while the add-on is off.');
+ expect(p).toContain('After the add-on is turned on again, only snapshots from the last 7 days can be restored; older kept snapshots are deleted with the next daily backup.');
+ // Never promises that an older kept snapshot can be restored.
+ expect(p).not.toContain('restore the one you need first');
});
test('never promises deletion at slot end (owner rule 2026-10-02)', () => {
@@ -100,8 +102,9 @@ describe('terms: workspace backups (ES)', () => {
expect(p).toContain('en un plazo de 14 días');
});
- test('reactivar el complemento reanuda la retención', () => {
- expect(p).toContain('Las instantáneas conservadas no se eliminan mientras el complemento esté desactivado');
- expect(p).toContain('al volver a activarlo se reanuda la retención de 7 días: la siguiente instantánea diaria elimina todas las instantáneas con más de 7 días, así que restaura antes la que necesites');
+ test('al reactivar el complemento solo se restauran los últimos 7 días', () => {
+ expect(p).toContain('Las instantáneas conservadas no se eliminan mientras el complemento esté desactivado.');
+ expect(p).toContain('Cuando el complemento se vuelve a activar, solo se pueden restaurar las instantáneas de los últimos 7 días; las instantáneas conservadas más antiguas se eliminan con la siguiente copia diaria.');
+ expect(p).not.toContain('restaura antes la que necesites');
});
});