S00-005: Record blocked task and remediation handoff
Changes: Preserve incomplete work and blocker metadata for S00-005. This checkpoint does not mark implementation accepted. Validation: Session ended with status blocked. Blocker: Previous runner session was interrupted before submit/escalate; processes stopped. User now explicitly requests resuming development. Preserve partial artifacts, verify them in a fresh bounded remediation, and return original to a new executor only after independent review. Task: S00-005 Agent: auto-storage-88c3286c6641 Role: storage Action: claim Status: blocked Task title: Выбрать IndexedDB wrapper и migration policy
This commit is contained in:
1 parent
55d9c69a21
commit
5f4d044444
16 files changed
+363
-11
No files matched your search
@@ -0,0 +1,2 @@
|
|||||||
|
registry=https://registry.npmjs.org/
|
||||||
|
strict-ssl=true
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
24.21.0
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "0004-storage-design",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "0004-storage-design",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"fake-indexeddb": "6.2.5"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "24.21.0",
|
||||||
|
"npm": "11.19.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/fake-indexeddb": {
|
||||||
|
"version": "6.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.2.5.tgz",
|
||||||
|
"integrity": "sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "0004-storage-design",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"engines": { "node": "24.21.0", "npm": "11.19.0" },
|
||||||
|
"packageManager": "npm@11.19.0",
|
||||||
|
"scripts": {
|
||||||
|
"check:rollback": "node src/rollback.mjs",
|
||||||
|
"check:quota": "node src/quota-blocked.mjs",
|
||||||
|
"check": "npm run check:rollback && npm run check:quota"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fake-indexeddb": "6.2.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import "fake-indexeddb/auto";
|
||||||
|
function open(name, version, upgrade) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const req = indexedDB.open(name, version);
|
||||||
|
const ev = { upgraded:false, blocked:false };
|
||||||
|
req.onupgradeneeded = () => { ev.upgraded = true; if (upgrade) upgrade(req.result); };
|
||||||
|
req.onsuccess = () => resolve({db:req.result, ev});
|
||||||
|
req.onerror = () => reject(new Error(`open ${name} v${version}: ${req.error?.name}`));
|
||||||
|
req.onblocked = () => { ev.blocked=true; console.log("BLOCKED", name); };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// fresh DB clears to v2 cleanly
|
||||||
|
const o = await open("fresh", 2, (db)=>{ const a=db.createObjectStore("accounts",{keyPath:"accountId"}); a.add({accountId:"A1",displayName:"Alice"}); });
|
||||||
|
console.log("fresh v2 ok", o.db.version, [...o.db.objectStoreNames]);
|
||||||
|
o.db.close();
|
||||||
|
// not deleting cleanly - check delete
|
||||||
|
await new Promise((res,rej)=>{ const r=indexedDB.deleteDatabase("fresh"); r.onsuccess=res; r.onerror=()=>rej(r.error); });
|
||||||
|
console.log("after delete", await indexedDB.databases());
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
import "fake-indexeddb/auto";
|
||||||
|
import assert from "node:assert/strict";
|
||||||
|
|
||||||
|
// Bounded storage experiment (S00-005, focused check "Rollback experiment").
|
||||||
|
// Uses fake-indexeddb 6.2.5 (in-memory, pure-JS IndexedDB implementation) to exercise
|
||||||
|
// the transaction/schema-upgrade rollback guarantees that a Web storage layer relies
|
||||||
|
// on for STORE-001 (transactional saves or verifiable equivalent recovery).
|
||||||
|
// This is an API-semantics probe, not a browser-durability claim.
|
||||||
|
|
||||||
|
const DB = "rollback-probe";
|
||||||
|
|
||||||
|
function open(version, upgrade) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const req = indexedDB.open(DB, version);
|
||||||
|
const events = { upgraded: false, blocked: false };
|
||||||
|
req.onupgradeneeded = () => {
|
||||||
|
events.upgraded = true;
|
||||||
|
if (upgrade) upgrade(req.result);
|
||||||
|
};
|
||||||
|
req.onsuccess = () => resolve({ db: req.result, events });
|
||||||
|
req.onerror = () => reject(new Error(`open(v${version}): ${req.error?.name}`));
|
||||||
|
req.onblocked = () => { events.blocked = true; };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAll(db, store) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const tx = db.transaction(store, "readonly");
|
||||||
|
tx.objectStore(store).getAll().onsuccess = (e) => resolve(e.target.result);
|
||||||
|
tx.onerror = () => reject(tx.error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function seedV1() {
|
||||||
|
const { db } = await open(1, (db) => {
|
||||||
|
db.createObjectStore("accounts", { keyPath: "accountId" });
|
||||||
|
});
|
||||||
|
db.close();
|
||||||
|
// write a durable per-account record (configuration, non-secret fixture)
|
||||||
|
const w = await open(1);
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
const tx = w.db.transaction("accounts", "readwrite");
|
||||||
|
tx.objectStore("accounts").add({ accountId: "A1", displayName: "Alice" });
|
||||||
|
tx.oncomplete = resolve;
|
||||||
|
tx.onerror = () => reject(tx.error);
|
||||||
|
});
|
||||||
|
w.db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scenario 1 (rollback): upgrade v1 -> v2 that fails mid-way because a data migration
|
||||||
|
// violates a new unique index inside the versionchange transaction. The whole upgrade
|
||||||
|
// must abort and revert: schema version stays at v1, the new index/store is absent,
|
||||||
|
// and pre-existing v1 data is untouched.
|
||||||
|
async function failedUpgradeRollsBack() {
|
||||||
|
const req = indexedDB.open(DB, 2);
|
||||||
|
let aborted = true;
|
||||||
|
req.onupgradeneeded = () => {
|
||||||
|
const db = req.result;
|
||||||
|
const accounts = db.createObjectStore("accounts", { keyPath: "accountId" });
|
||||||
|
accounts.createIndex("displayName", "displayName", { unique: true });
|
||||||
|
// Both rows share the same unique displayName -> the second write fails and
|
||||||
|
// aborts the versionchange transaction (organic failure, not a manual abort).
|
||||||
|
accounts.add({ accountId: "A1", displayName: "Shared" });
|
||||||
|
accounts.add({ accountId: "A2", displayName: "Shared" });
|
||||||
|
};
|
||||||
|
req.onsuccess = () => { aborted = false; req.result.close(); };
|
||||||
|
req.onerror = () => { /* default abort */ };
|
||||||
|
|
||||||
|
await new Promise((resolve) => { req.onsuccess = resolve; req.onerror = resolve; });
|
||||||
|
|
||||||
|
assert.equal(aborted, true, "failing data migration must abort the upgrade (no fake success)");
|
||||||
|
|
||||||
|
// Schema version must remain at v1 after the abort.
|
||||||
|
const meta = await indexedDB.databases().then((l) => l.find((d) => d.name === DB));
|
||||||
|
assert.equal(meta.version, 1, "failed upgrade must keep persisted schema version at v1");
|
||||||
|
|
||||||
|
const { db } = await open(1);
|
||||||
|
assert.ok(db.objectStoreNames.contains("accounts"), "v1 accounts store survives");
|
||||||
|
const rows = await getAll(db, "accounts");
|
||||||
|
assert.equal(rows.length, 1, "no partial migration rows persisted");
|
||||||
|
assert.equal(rows[0].accountId, "A1", "pre-existing v1 data intact after rollback");
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scenario 2 (retry after rollback): after a clean rollback a corrected migration can be
|
||||||
|
// retried and commits fully to v2 without a stale schema or lost data.
|
||||||
|
async function retryAfterRollbackSucceeds() {
|
||||||
|
const { db, events } = await open(2, (db) => {
|
||||||
|
const accounts = db.createObjectStore("accounts", { keyPath: "accountId" });
|
||||||
|
accounts.createIndex("displayName", "displayName", { unique: true });
|
||||||
|
accounts.add({ accountId: "A1", displayName: "Alice" });
|
||||||
|
accounts.add({ accountId: "A2", displayName: "Bob" });
|
||||||
|
});
|
||||||
|
assert.equal(events.upgraded, true, "retry upgrade runs");
|
||||||
|
assert.equal(db.version, 2, "retry commits to v2");
|
||||||
|
const rows = await getAll(db, "accounts");
|
||||||
|
assert.equal(rows.length, 2, "both accounts migrated");
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
await seedV1();
|
||||||
|
await failedUpgradeRollsBack();
|
||||||
|
await retryAfterRollbackSucceeds();
|
||||||
|
console.log("rollback.mjs PASS: failed v1->v2 upgrade rolled back atomically (schema v1 kept, no partial data); corrected retry committed cleanly to v2.");
|
||||||
|
}
|
||||||
|
|
||||||
|
await main();
|
||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке.
|
Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке.
|
||||||
|
|
||||||
Задач: 22; entry: нет; exit: S00-010.
|
Задач: 23; entry: нет; exit: S00-010.
|
||||||
|
|
||||||
## [S01: Предметные контракты](stages/S01.md)
|
## [S01: Предметные контракты](stages/S01.md)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Матрица задач
|
# Матрица задач
|
||||||
|
|
||||||
Generated; state revision **62**. Canonical status: state/tasks.json.
|
Generated; state revision **64**. Canonical status: state/tasks.json.
|
||||||
|
|
||||||
| ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача |
|
| ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача |
|
||||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||||
@@ -8,7 +8,7 @@ Generated; state revision **62**. Canonical status: state/tasks.json.
|
|||||||
| [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | done | auto-orchestrator-68a05c587e33 | S00-001, S00-011, S00-012 | Выбрать framework и build runtime |
|
| [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | done | auto-orchestrator-68a05c587e33 | S00-001, S00-011, S00-012 | Выбрать framework и build runtime |
|
||||||
| [S00-003](tasks/S00-003.md) | S00 | protocol | qa | blocked | auto-protocol-59f4d359b339 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 | Проверить XMPP WSS/auth библиотеку |
|
| [S00-003](tasks/S00-003.md) | S00 | protocol | qa | blocked | auto-protocol-59f4d359b339 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 | Проверить XMPP WSS/auth библиотеку |
|
||||||
| [S00-004](tasks/S00-004.md) | S00 | crypto | security | blocked | auto-crypto-fe1c81c17ded | S00-001, S00-002, S00-021, S00-022 | Проверить browser OMEMO backend |
|
| [S00-004](tasks/S00-004.md) | S00 | crypto | security | blocked | auto-crypto-fe1c81c17ded | S00-001, S00-002, S00-021, S00-022 | Проверить browser OMEMO backend |
|
||||||
| [S00-005](tasks/S00-005.md) | S00 | storage | qa | todo | | S00-002 | Выбрать IndexedDB wrapper и migration policy |
|
| [S00-005](tasks/S00-005.md) | S00 | storage | qa | blocked | auto-storage-88c3286c6641 | S00-002, S00-023 | Выбрать IndexedDB wrapper и migration policy |
|
||||||
| [S00-006](tasks/S00-006.md) | S00 | orchestrator | security | todo | | S00-002 | Зафиксировать browser/reference matrix |
|
| [S00-006](tasks/S00-006.md) | S00 | orchestrator | security | todo | | S00-002 | Зафиксировать browser/reference matrix |
|
||||||
| [S00-007](tasks/S00-007.md) | S00 | security | orchestrator | todo | | S00-004, S00-005 | Утвердить password и crypto unlock модель |
|
| [S00-007](tasks/S00-007.md) | S00 | security | orchestrator | todo | | S00-004, S00-005 | Утвердить password и crypto unlock модель |
|
||||||
| [S00-008](tasks/S00-008.md) | S00 | ci-cd | qa | todo | | S00-003, S00-004 | Описать WSS/upload/TURN/push topology |
|
| [S00-008](tasks/S00-008.md) | S00 | ci-cd | qa | todo | | S00-003, S00-004 | Описать WSS/upload/TURN/push topology |
|
||||||
@@ -25,6 +25,7 @@ Generated; state revision **62**. Canonical status: state/tasks.json.
|
|||||||
| [S00-020](tasks/S00-020.md) | S00 | ci-cd | qa | in_progress | auto-ci-cd-5a18c8aa1b42 | S00-001, S00-002, S00-017, S00-018, S00-019 | Restore access to the pinned Linux XMPP experiment toolchain |
|
| [S00-020](tasks/S00-020.md) | S00 | ci-cd | qa | in_progress | auto-ci-cd-5a18c8aa1b42 | S00-001, S00-002, S00-017, S00-018, S00-019 | Restore access to the pinned Linux XMPP experiment toolchain |
|
||||||
| [S00-021](tasks/S00-021.md) | S00 | crypto | security | done | auto-crypto-fcef9b6781bf | S00-001, S00-002 | Устранить прерывание: Проверить browser OMEMO backend |
|
| [S00-021](tasks/S00-021.md) | S00 | crypto | security | done | auto-crypto-fcef9b6781bf | S00-001, S00-002 | Устранить прерывание: Проверить browser OMEMO backend |
|
||||||
| [S00-022](tasks/S00-022.md) | S00 | crypto | security | blocked | | S00-001, S00-002, S00-021 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint |
|
| [S00-022](tasks/S00-022.md) | S00 | crypto | security | blocked | | S00-001, S00-002, S00-021 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint |
|
||||||
|
| [S00-023](tasks/S00-023.md) | S00 | storage | qa | todo | | S00-002 | Устранить прерывание: Выбрать IndexedDB wrapper и migration policy |
|
||||||
| [S00-010](tasks/S00-010.md) | S00 | qa | orchestrator | todo | | S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009 | Gate: Профиль и проверка стека |
|
| [S00-010](tasks/S00-010.md) | S00 | qa | orchestrator | todo | | S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009 | Gate: Профиль и проверка стека |
|
||||||
| [S01-001](tasks/S01-001.md) | S01 | orchestrator | security | todo | | S00-010 | Описать identity/model contracts |
|
| [S01-001](tasks/S01-001.md) | S01 | orchestrator | security | todo | | S00-010 | Описать identity/model contracts |
|
||||||
| [S01-002](tasks/S01-002.md) | S01 | orchestrator | security | todo | | S00-010, S01-001 | Описать async account context |
|
| [S01-002](tasks/S01-002.md) | S01 | orchestrator | security | todo | | S00-010, S01-001 | Описать async account context |
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
- [S00-002](../tasks/S00-002.md): Выбрать framework и build runtime — orchestrator; done.
|
- [S00-002](../tasks/S00-002.md): Выбрать framework и build runtime — orchestrator; done.
|
||||||
- [S00-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; blocked.
|
- [S00-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; blocked.
|
||||||
- [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; blocked.
|
- [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; blocked.
|
||||||
- [S00-005](../tasks/S00-005.md): Выбрать IndexedDB wrapper и migration policy — storage; todo.
|
- [S00-005](../tasks/S00-005.md): Выбрать IndexedDB wrapper и migration policy — storage; blocked.
|
||||||
- [S00-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; todo.
|
- [S00-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; todo.
|
||||||
- [S00-007](../tasks/S00-007.md): Утвердить password и crypto unlock модель — security; todo.
|
- [S00-007](../tasks/S00-007.md): Утвердить password и crypto unlock модель — security; todo.
|
||||||
- [S00-008](../tasks/S00-008.md): Описать WSS/upload/TURN/push topology — ci-cd; todo.
|
- [S00-008](../tasks/S00-008.md): Описать WSS/upload/TURN/push topology — ci-cd; todo.
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
- [S00-020](../tasks/S00-020.md): Restore access to the pinned Linux XMPP experiment toolchain — ci-cd; in_progress.
|
- [S00-020](../tasks/S00-020.md): Restore access to the pinned Linux XMPP experiment toolchain — ci-cd; in_progress.
|
||||||
- [S00-021](../tasks/S00-021.md): Устранить прерывание: Проверить browser OMEMO backend — crypto; done.
|
- [S00-021](../tasks/S00-021.md): Устранить прерывание: Проверить browser OMEMO backend — crypto; done.
|
||||||
- [S00-022](../tasks/S00-022.md): Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint — crypto; blocked.
|
- [S00-022](../tasks/S00-022.md): Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint — crypto; blocked.
|
||||||
|
- [S00-023](../tasks/S00-023.md): Устранить прерывание: Выбрать IndexedDB wrapper и migration policy — storage; todo.
|
||||||
- [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo.
|
- [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo.
|
||||||
|
|
||||||
## Граница этапа
|
## Граница этапа
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ S00-001,S00,orchestrator,security,done,auto-orchestrator-48aab142ecde,,Утве
|
|||||||
S00-002,S00,orchestrator,security,done,auto-orchestrator-68a05c587e33,"S00-001, S00-011, S00-012",Выбрать framework и build runtime
|
S00-002,S00,orchestrator,security,done,auto-orchestrator-68a05c587e33,"S00-001, S00-011, S00-012",Выбрать framework и build runtime
|
||||||
S00-003,S00,protocol,qa,blocked,auto-protocol-59f4d359b339,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-020",Проверить XMPP WSS/auth библиотеку
|
S00-003,S00,protocol,qa,blocked,auto-protocol-59f4d359b339,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-020",Проверить XMPP WSS/auth библиотеку
|
||||||
S00-004,S00,crypto,security,blocked,auto-crypto-fe1c81c17ded,"S00-001, S00-002, S00-021, S00-022",Проверить browser OMEMO backend
|
S00-004,S00,crypto,security,blocked,auto-crypto-fe1c81c17ded,"S00-001, S00-002, S00-021, S00-022",Проверить browser OMEMO backend
|
||||||
S00-005,S00,storage,qa,todo,,S00-002,Выбрать IndexedDB wrapper и migration policy
|
S00-005,S00,storage,qa,blocked,auto-storage-88c3286c6641,"S00-002, S00-023",Выбрать IndexedDB wrapper и migration policy
|
||||||
S00-006,S00,orchestrator,security,todo,,S00-002,Зафиксировать browser/reference matrix
|
S00-006,S00,orchestrator,security,todo,,S00-002,Зафиксировать browser/reference matrix
|
||||||
S00-007,S00,security,orchestrator,todo,,"S00-004, S00-005",Утвердить password и crypto unlock модель
|
S00-007,S00,security,orchestrator,todo,,"S00-004, S00-005",Утвердить password и crypto unlock модель
|
||||||
S00-008,S00,ci-cd,qa,todo,,"S00-003, S00-004",Описать WSS/upload/TURN/push topology
|
S00-008,S00,ci-cd,qa,todo,,"S00-003, S00-004",Описать WSS/upload/TURN/push topology
|
||||||
@@ -20,6 +20,7 @@ S00-019,S00,crypto,security,done,auto-crypto-c68801170fa4,"S00-001, S00-002, S00
|
|||||||
S00-020,S00,ci-cd,qa,in_progress,auto-ci-cd-5a18c8aa1b42,"S00-001, S00-002, S00-017, S00-018, S00-019",Restore access to the pinned Linux XMPP experiment toolchain
|
S00-020,S00,ci-cd,qa,in_progress,auto-ci-cd-5a18c8aa1b42,"S00-001, S00-002, S00-017, S00-018, S00-019",Restore access to the pinned Linux XMPP experiment toolchain
|
||||||
S00-021,S00,crypto,security,done,auto-crypto-fcef9b6781bf,"S00-001, S00-002",Устранить прерывание: Проверить browser OMEMO backend
|
S00-021,S00,crypto,security,done,auto-crypto-fcef9b6781bf,"S00-001, S00-002",Устранить прерывание: Проверить browser OMEMO backend
|
||||||
S00-022,S00,crypto,security,blocked,,"S00-001, S00-002, S00-021",Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
|
S00-022,S00,crypto,security,blocked,,"S00-001, S00-002, S00-021",Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
|
||||||
|
S00-023,S00,storage,qa,todo,,S00-002,Устранить прерывание: Выбрать IndexedDB wrapper и migration policy
|
||||||
S00-010,S00,qa,orchestrator,todo,,"S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009",Gate: Профиль и проверка стека
|
S00-010,S00,qa,orchestrator,todo,,"S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009",Gate: Профиль и проверка стека
|
||||||
S01-001,S01,orchestrator,security,todo,,S00-010,Описать identity/model contracts
|
S01-001,S01,orchestrator,security,todo,,S00-010,Описать identity/model contracts
|
||||||
S01-002,S01,orchestrator,security,todo,,"S00-010, S01-001",Описать async account context
|
S01-002,S01,orchestrator,security,todo,,"S00-010, S01-001",Описать async account context
|
||||||
|
|||||||
|
+50
-1
@@ -376,7 +376,8 @@
|
|||||||
"title": "Выбрать IndexedDB wrapper и migration policy",
|
"title": "Выбрать IndexedDB wrapper и migration policy",
|
||||||
"outcome": "ADR определяет transactions/quota/schema upgrade и key ownership для browser storage.",
|
"outcome": "ADR определяет transactions/quota/schema upgrade и key ownership для browser storage.",
|
||||||
"depends_on": [
|
"depends_on": [
|
||||||
"S00-002"
|
"S00-002",
|
||||||
|
"S00-023"
|
||||||
],
|
],
|
||||||
"requirements": [
|
"requirements": [
|
||||||
"STORE-001",
|
"STORE-001",
|
||||||
@@ -1279,6 +1280,54 @@
|
|||||||
],
|
],
|
||||||
"context_budget_chars": 48000
|
"context_budget_chars": 48000
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "S00-023",
|
||||||
|
"stage": "S00",
|
||||||
|
"kind": "blocker",
|
||||||
|
"root_task": "S00-005",
|
||||||
|
"blocker_depth": 1,
|
||||||
|
"unblocks": [
|
||||||
|
"S00-005"
|
||||||
|
],
|
||||||
|
"role": "storage",
|
||||||
|
"reviewer_role": "qa",
|
||||||
|
"title": "Устранить прерывание: Выбрать IndexedDB wrapper и migration policy",
|
||||||
|
"outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.",
|
||||||
|
"depends_on": [
|
||||||
|
"S00-002"
|
||||||
|
],
|
||||||
|
"requirements": [],
|
||||||
|
"scope": [
|
||||||
|
"docs/decisions/0004-storage-design.md",
|
||||||
|
"experiments/0004-storage-design/**"
|
||||||
|
],
|
||||||
|
"inputs": [
|
||||||
|
"docs/WEB_PROFILE.md",
|
||||||
|
"docs/ARCHITECTURE.md",
|
||||||
|
"docs/CONTRACTS.md",
|
||||||
|
"docs/TESTING.md",
|
||||||
|
"roles/storage.md",
|
||||||
|
"docs/decisions/README.md",
|
||||||
|
"state/blockers/S00-023.md"
|
||||||
|
],
|
||||||
|
"spec_sections": [],
|
||||||
|
"ui_sections": [],
|
||||||
|
"steps": [
|
||||||
|
"Прочитать blocker report и handoff.",
|
||||||
|
"Воспроизвести конкретную причину.",
|
||||||
|
"Исправить только локальную причину в scope или уточнить внешний input.",
|
||||||
|
"Выполнить focused проверку и submit."
|
||||||
|
],
|
||||||
|
"acceptance": [
|
||||||
|
"Причина воспроизводимо устранена.",
|
||||||
|
"Исходная задача не завершена обходом требований."
|
||||||
|
],
|
||||||
|
"checks": [
|
||||||
|
"Повторить сценарий прерывания.",
|
||||||
|
"Проверить отсутствие изменений вне scope."
|
||||||
|
],
|
||||||
|
"context_budget_chars": 48000
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "S00-010",
|
"id": "S00-010",
|
||||||
"stage": "S00",
|
"stage": "S00",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
- Этап: S00
|
- Этап: S00
|
||||||
- Оператор: storage
|
- Оператор: storage
|
||||||
- Reviewer: qa
|
- Reviewer: qa
|
||||||
- Зависимости: S00-002
|
- Зависимости: S00-002, S00-023
|
||||||
- Требования: STORE-001, STORE-004
|
- Требования: STORE-001, STORE-004
|
||||||
|
|
||||||
## Один результат
|
## Один результат
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# S00-023: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy
|
||||||
|
|
||||||
|
- Remediation для: S00-005; root: S00-005; depth: 1
|
||||||
|
|
||||||
|
> Generated from planning/tasks.json; status is in state/tasks.json.
|
||||||
|
|
||||||
|
- Этап: S00
|
||||||
|
- Оператор: storage
|
||||||
|
- Reviewer: qa
|
||||||
|
- Зависимости: S00-002
|
||||||
|
- Требования: инженерная подготовка
|
||||||
|
|
||||||
|
## Один результат
|
||||||
|
|
||||||
|
Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.
|
||||||
|
|
||||||
|
## Разрешённые пути
|
||||||
|
|
||||||
|
- `docs/decisions/0004-storage-design.md`
|
||||||
|
- `experiments/0004-storage-design/**`
|
||||||
|
|
||||||
|
Не изменять другие modules, shared contracts или spec snapshots без изменения плана. Stem без расширения разрешает принятые stack-specific extensions и focused test рядом.
|
||||||
|
|
||||||
|
## Прочитать
|
||||||
|
|
||||||
|
- docs/WEB_PROFILE.md
|
||||||
|
- docs/ARCHITECTURE.md
|
||||||
|
- docs/CONTRACTS.md
|
||||||
|
- docs/TESTING.md
|
||||||
|
- roles/storage.md
|
||||||
|
- docs/decisions/README.md
|
||||||
|
- state/blockers/S00-023.md
|
||||||
|
|
||||||
|
## Шаги
|
||||||
|
|
||||||
|
1. Прочитать blocker report и handoff.
|
||||||
|
2. Воспроизвести конкретную причину.
|
||||||
|
3. Исправить только локальную причину в scope или уточнить внешний input.
|
||||||
|
4. Выполнить focused проверку и submit.
|
||||||
|
|
||||||
|
## Приёмка
|
||||||
|
|
||||||
|
1. Причина воспроизводимо устранена.
|
||||||
|
2. Исходная задача не завершена обходом требований.
|
||||||
|
|
||||||
|
## Focused checks
|
||||||
|
|
||||||
|
1. Повторить сценарий прерывания.
|
||||||
|
2. Проверить отсутствие изменений вне scope.
|
||||||
|
|
||||||
|
## Блокер и завершение запуска
|
||||||
|
|
||||||
|
Для всех ролей scope — только эта задача. При блокере создать issue JSON по state/ISSUE_TEMPLATE.json, вызвать escalate с текущим ID/role/agent, проверить status=blocked и resolution_task, затем немедленно завершить запуск. Не решать blocker и не выбирать следующую задачу самому. Новый агент назначается runner. Правки metadata через CLI — единственное исключение scope.
|
||||||
|
|
||||||
|
## Передача
|
||||||
|
|
||||||
|
Сохранить evidence/handoff; submit → review и завершить запуск. Reviewer также выполняет только эту задачу, включая обязательное escalate при блокере.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Blocker S00-023
|
||||||
|
|
||||||
|
- Original task: S00-005
|
||||||
|
- Root task: S00-005
|
||||||
|
- Reporter: auto-storage-88c3286c6641
|
||||||
|
- Role: storage
|
||||||
|
- Original owner: auto-storage-88c3286c6641
|
||||||
|
- Waits for user/external condition: False
|
||||||
|
|
||||||
|
## Cause
|
||||||
|
|
||||||
|
Previous runner session was interrupted before submit/escalate; processes stopped. User now explicitly requests resuming development. Preserve partial artifacts, verify them in a fresh bounded remediation, and return original to a new executor only after independent review.
|
||||||
|
|
||||||
|
## One remediation outcome
|
||||||
|
|
||||||
|
Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.
|
||||||
|
|
||||||
|
## Evidence / reproduction
|
||||||
|
|
||||||
|
See original handoff and task evidence.
|
||||||
|
|
||||||
|
The reporting agent must stop now. A new agent implements only S00-023.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
# Blocked handoff
|
||||||
|
|
||||||
|
Original: S00-005; reporter: auto-storage-88c3286c6641; resolution: S00-023.
|
||||||
|
|
||||||
|
Previous runner session was interrupted before submit/escalate; processes stopped. User now explicitly requests resuming development. Preserve partial artifacts, verify them in a fresh bounded remediation, and return original to a new executor only after independent review.
|
||||||
|
|
||||||
|
Next: complete and review the remediation; only a fresh session may continue.
|
||||||
+43
-4
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"schema_version": 1,
|
"schema_version": 1,
|
||||||
"revision": 62,
|
"revision": 64,
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"S00-001": {
|
"S00-001": {
|
||||||
"status": "done",
|
"status": "done",
|
||||||
@@ -62,8 +62,17 @@
|
|||||||
"resumed_after_blocker": true
|
"resumed_after_blocker": true
|
||||||
},
|
},
|
||||||
"S00-005": {
|
"S00-005": {
|
||||||
"status": "todo",
|
"status": "blocked",
|
||||||
"owner": null
|
"owner": "auto-storage-88c3286c6641",
|
||||||
|
"started_at": "2026-10-15T09:15:46+00:00",
|
||||||
|
"reason": "Previous runner session was interrupted before submit/escalate; processes stopped. User now explicitly requests resuming development. Preserve partial artifacts, verify them in a fresh bounded remediation, and return original to a new executor only after independent review.",
|
||||||
|
"updated_at": "2026-10-15T09:32:46+00:00",
|
||||||
|
"blocked_by": [
|
||||||
|
"S00-023"
|
||||||
|
],
|
||||||
|
"resume_status": "in_progress",
|
||||||
|
"blocker_report": "state/blockers/S00-023.md",
|
||||||
|
"handoff": "state/handoffs/S00-005.md"
|
||||||
},
|
},
|
||||||
"S00-006": {
|
"S00-006": {
|
||||||
"status": "todo",
|
"status": "todo",
|
||||||
@@ -1298,6 +1307,12 @@
|
|||||||
"owner": null,
|
"owner": null,
|
||||||
"external_wait": true,
|
"external_wait": true,
|
||||||
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
|
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
|
||||||
|
},
|
||||||
|
"S00-023": {
|
||||||
|
"status": "todo",
|
||||||
|
"owner": null,
|
||||||
|
"external_wait": false,
|
||||||
|
"reason": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"events": [
|
"events": [
|
||||||
@@ -2099,6 +2114,29 @@
|
|||||||
"from": "in_progress",
|
"from": "in_progress",
|
||||||
"to": "blocked",
|
"to": "blocked",
|
||||||
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
|
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"revision": 63,
|
||||||
|
"at": "2026-10-15T09:15:46+00:00",
|
||||||
|
"action": "claim",
|
||||||
|
"task": "S00-005",
|
||||||
|
"agent": "auto-storage-88c3286c6641",
|
||||||
|
"role": "storage",
|
||||||
|
"from": "todo",
|
||||||
|
"to": "in_progress",
|
||||||
|
"reason": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"revision": 64,
|
||||||
|
"at": "2026-10-15T09:32:46+00:00",
|
||||||
|
"action": "escalate",
|
||||||
|
"task": "S00-005",
|
||||||
|
"resolution_task": "S00-023",
|
||||||
|
"agent": "auto-storage-88c3286c6641",
|
||||||
|
"role": "storage",
|
||||||
|
"from": "in_progress",
|
||||||
|
"to": "blocked",
|
||||||
|
"reason": "Previous runner session was interrupted before submit/escalate; processes stopped. User now explicitly requests resuming development. Preserve partial artifacts, verify them in a fresh bounded remediation, and return original to a new executor only after independent review."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"retired_agents": [
|
"retired_agents": [
|
||||||
@@ -2113,6 +2151,7 @@
|
|||||||
"auto-protocol-dcdf92cd067e",
|
"auto-protocol-dcdf92cd067e",
|
||||||
"auto-protocol-59f4d359b339",
|
"auto-protocol-59f4d359b339",
|
||||||
"auto-crypto-8bf3dcf711b9",
|
"auto-crypto-8bf3dcf711b9",
|
||||||
"auto-crypto-fe1c81c17ded"
|
"auto-crypto-fe1c81c17ded",
|
||||||
|
"auto-storage-88c3286c6641"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user