diff --git a/REGISTER.md b/REGISTER.md index 3d94516..ed2d23c 100644 --- a/REGISTER.md +++ b/REGISTER.md @@ -12,7 +12,7 @@ Generated by `tools/register_index.py` from `findings/`. Do not edit by hand. La | [RISK-F-0014](findings/RISK-F-0014-emergent-loaded-withdrawal-snapshot.md) | Loaded Emergent 0.2.1 continues serving a source after withdrawal and reseal | emergent-security | low | public | none | emergent-security | open | instant (0) | **due** | | [RISK-F-0013](findings/RISK-F-0013-emergent-unsealed-card-receipt.md) | Loaded Emergent 0.2.1 returns unsealed card bytes under the reviewed digest | emergent-security | medium | public | none | emergent-security | open | instant (0) | **due** | | [RISK-F-0012](findings/RISK-F-0012-e-invoice-receipt-and-retention.md) | The estate cannot show it receives and retains EN 16931 e-invoices | qonto-assistant | medium | public | none | qonto-assistant | open | instant (0) | **due** | -| [RISK-F-0011](findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md) | qonto-assistant audit.deny stream completeness is not established | qonto-assistant | medium | public | **pending** (t5, sent) | qonto-assistant | open | instant (0) | **due** | +| [RISK-F-0011](findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md) | qonto-assistant audit.deny stream completeness is not established | qonto-assistant | medium | public | none | qonto-assistant | accepted | instant (0) | **due** | | [RISK-F-0010](findings/RISK-F-0010-embedded-backup-webdav-credential.md) | Forgejo backup source embeds a WebDAV credential default | railiance-platform | low | public | none | railiance-platform | fixed | 1h (1) | **due** | | [RISK-F-0009](findings/RISK-F-0009-openbao-deny-set-covers-a-third-of-high-risk-lanes.md) | agent-high-risk-boundary denies 6 of 17 high-risk lanes; the direct bao path is unprotected for the rest | railiance-platform | **high** | public | none | railiance-platform | fixed | instant (0) | **due** | | [RISK-F-0008](findings/RISK-F-0008-audit-retention-legal-basis-assumed.md) | The legal basis for retaining audit facts against an erasure request has been assumed, never established | audit-core | medium | public | **answered** (t2, answered) | risk-nexus | accepted | 8h (2) | **due** | diff --git a/SCOPE.md b/SCOPE.md index 31a2c10..7c0207f 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -1,6 +1,6 @@ # SCOPE — risk-nexus -Updated 2026-09-05 (Europe/Berlin), including RISK-WP-0006 and RISK-WP-0007. This describes the checked-in capabilities; +Updated 2026-10-03 (Europe/Berlin), including the cleanup under RISK-WP-0005 and RISK-WP-0007. This describes the checked-in capabilities; [INTENT.md](INTENT.md) remains the intended remit. Evidence and remaining gaps are in the [dated assessment](history/2026-09-05-014333-scope-intent-assessment.md). @@ -18,8 +18,8 @@ or independent scheduler, and does not itself serve `risk.coulomb.social`. | Grade and explain decisions | [Method instruments](docs/method/) define severity, disclosure, escalation, review, dependencies and verification. Dated rulings and finding histories record applied decisions. Scoring and acceptance are judgements, not computed decisions. | | Generate a readable register | `make register` builds `REGISTER.md` from findings and notes, including constraints, finding waits, embargoes and cadence. It is an index, not the source of truth. | | Report review work | `tools/register_check.py` reports due checks, missing grades, selected malformed fields, unknown statuses, waits/defaults, tracked fix state, embargo conditions and review dates, pending handovers and escalations, production re-score flags and regulatory reviews including full policies. `fixed` and `withdrawn` leave the ordinary watch list, but disclosure obligations remain visible; accepted, mitigated and unknown statuses remain watched. | -| Record review outcomes | `make checked ARGS=" clean\|moved\|defer ..."` updates an eligible record's timestamps, checker, cadence and review history, then regenerates the index. Clean climbs one rung from `instant` toward `1q`; moved resets; defer records a supplied date and reason. Completion of the review procedure and operator authorization for deferral are not enforced by the tool. | -| Read remediation records | `make fixes` resolves supported workplan/task IDs in live findings against sibling checkout files under `/home/worsch`, including an archive convention. It reports status, missing tracking and severity-based inactivity windows using the workplan file's last commit date. This is a proxy for recorded activity, not proof of task progress or a deployed fix. | +| Record review outcomes | `make checked ARGS=" clean\|moved\|defer ..."` updates an eligible record's timestamps, checker, cadence and review history, then regenerates the index. Clean climbs one rung from `instant` toward `1q`; moved resets; defer records a supplied date and reason. Completion of the review procedure and founder authorization for deferral are not enforced by the tool. | +| Read remediation records | `make fixes` resolves supported workplan/task IDs in live findings against sibling checkout files under `/home/worsch`, including an archive convention and YAML task blocks with arbitrary field order. It reports status, missing tracking and severity-based inactivity windows using the workplan file's last commit date. This is a proxy for recorded activity, not proof of task progress or a deployed fix. | | Keep closure obligations visible | Live findings can state `closure_condition`, reported independently of source workplan completion. An accepted finding without fix tracking reports its recorded accepter, ending condition, resolvable regulatory determination and review date; missing fields still produce an incomplete-acceptance/missing-tracking warning. This does not verify that acceptance remains valid. | | Check inbox freshness | `tools/inbox_check.py` reads up to 100 State Hub messages and matches names/IDs against live findings checked earlier. It reports potentially newer evidence; it neither interprets nor acknowledges messages. | | Count reporting coverage | `make coverage` counts names appearing as system, fix owner or reporter and compares them with State Hub repo slugs when available. It measures mention coverage, not assessment coverage or assurance. | @@ -52,20 +52,24 @@ or independent scheduler, and does not itself serve `risk.coulomb.social`. ## Current recorded footprint -The checkout contains eleven findings: eight fixed, two open and one accepted; +The checkout contains fifteen findings: nine fixed, four open and two accepted; three notes; one regulatory determination; four full policies out of thirteen -catalogue entries; and three verification records. Both open findings now carry -owner workplan tracking and explicit pending runtime/provider evidence. The -accepted finding carries a resolvable determination and an overdue substantive -review, displayed as a recorded acceptance obligation. Two findings are marked -published, eight pending handover, and one embargoed. These are repository -records, not a fresh verification of the affected systems or published sites. +catalogue entries; and three verification records. Qonto's source-only acceptance +is now recorded with its founder decision and ending conditions, retaining the +runtime closure path. The three Emergent findings remain open pending owner +acceptance/provider evidence; their 0.2.3 local retest has explicit limits. +Two findings are marked published, nine pending handover, and four have no +completed handover recorded. No finding is currently embargoed. The audit +retention acceptance and substantive regulatory reviews remain due. These are +repository records, not fresh verification of affected systems or published sites. +All seven workplans and 37 tasks are complete; remaining external/recurring +obligations are reported without inventing new workplans. ## Ownership boundary The repo owns risk intake records, grading, disclosure decisions, regulatory research retention and escalation/review procedures. Fixes and incident response belong to system owners; publication belongs to `policy-nexus`; canon and -estate-level decisions belong to the custodian/operator. It provides neither +estate-level decisions belong to the custodian and the founder, exercising `GOVERN @ estate`. It provides neither legal advice nor compliance certification, estate-wide detection, or a delivery gate. Completing the intended remit does not require taking over those roles. diff --git a/STATE.md b/STATE.md index ae8b543..22d5fb6 100644 --- a/STATE.md +++ b/STATE.md @@ -1,148 +1,74 @@ # STATE — risk-nexus -**Updated:** 2026-09-05 +**Updated:** 2026-10-03 **Domain:** infotech · **Repo:** risk-nexus · **Owner:** the-custodian -## One-line posture +## Current posture -**The register decides.** Eleven findings graded, three notes below the floor, -one regulatory determination and a thirteen-entry legal policy set; every open -question carries a default and a date. Today's live set is three: an open -medium on qonto-assistant deny-stream completeness, an open low embargoed -backup credential, and an accepted medium on audit retention. +The register contains 15 graded findings: nine fixed, four open and two +accepted; three notes; one regulatory determination; four full policy records +and a thirteen-entry policy catalogue. REGISTER.md is the generated finding +index. Disclosure is public for all findings; two have recorded publication +addresses and nine still carry pending handovers. The e-invoice finding and +three Emergent findings have no completed publication handover recorded. -## Workplans +## Workplan audit — 2026-10-03 -| ID | Status | Notes | +All seven local workplans and their State Hub projections are `finished`. +All 37 local task blocks are `done`. No blocked, active, ready or proposed +workplan exists here, and no unfinished local task requires changing a parent +to `blocked`. No task or workplan was added for this cleanup. + +| Workplan | Completed scope | Remaining external or recurring obligations | | --- | --- | --- | -| `RISK-WP-0001` | **finished** | The four instruments, the index, the first grading. Still waiting on canon kinds until 2026-09-17. | -| `RISK-WP-0002` | **finished** | Two findings and five public method instruments handed to `policy-nexus` | -| `RISK-WP-0003` | **finished** | Regulatory intake; the legal policy set | -| `RISK-WP-0004` | **finished** | Running the register: cadence, verification, inbox-before-grading | -| `RISK-WP-0005` | **finished** | The seven gaps from `history/2026-08-21-intent-gap-analysis.md` | -| `RISK-WP-0006` | **finished** | Reporting survives a stale index; full policies, embargo deadlines and closed-finding handovers stay visible; regression coverage and State Hub registration. | -| `RISK-WP-0007` | **finished** | Owner evidence reconciled, runtime/provider closure conditions recorded, and accepted obligations distinguished from missing engineering fixes. | +| RISK-WP-0001 | Grading instruments and register | Canon-kind default already applied; review instruments as due | +| RISK-WP-0002 | Initial publication and standing handover route | Later finding publication returns belong to policy-nexus | +| RISK-WP-0003 | Regulatory intake and retained policy records | Substantive policy and activation reviews remain due | +| RISK-WP-0004 | Review procedure, inbox checks and activity definitions | Live activity deployment/session completion remains unverified | +| RISK-WP-0005 | Intake, remediation tracking and gap reporting | Production-transition adoption and external contact delivery remain outside this repo | +| RISK-WP-0006 | Resilient reports and obligation visibility | Reporting does not complete the underlying reviews or handovers | +| RISK-WP-0007 | Reconcile owner evidence and closure obligations | Deployed captures and provider/owner acceptance remain owner work | -## Scope correction and reporting repair — 2026-09-05 +## Loose ends resolved — 2026-10-03 -`SCOPE.md` now describes the checked-in capability. The timestamped assessment -in `history/2026-09-05-014333-scope-intent-assessment.md` records the remaining -gaps behind the earlier claim that WP-0005 closed them all. +RISK-F-0011 now records the founder's 2026-09-22 source-only acceptance +(message `61fd83cc-4d21-4a0c-bbef-d91b2e8f129e`). The founder, exercising +`GOVERN @ estate`, accepted the bounded source claim, not deployed completeness. +The medium grade stays; the stall escalation is answered. Acceptance ends +when a deployed qonto stream can be read by King's Guard, or at the next +scheduled risk review after 2026-12-31, whichever occurs first. +KG-WP-0005-T03 remains the closure path; its owner workplan is already blocked. +This is a recorded decision, not renewed acceptance by this register. -WP-0006 repairs the reporting path: `make check` runs every stage even after -failure; `make due` exposes regulatory policies and disclosure obligations; -malformed date strings no longer abort reporting; invalid deferrals cannot -write; archived completed workplans no longer trigger false inactivity alarms. -Eight regression tests pass. The live report now exposes four overdue policies, -eight pending publication handovers, and the existing overdue findings. -These are visibility repairs, not substantive reviews or evidence of closure. +The fix tracker now reads YAML task blocks regardless of field order. +Emergent T04 correctly reports `done` and T07 `wait`, rather than `unreadable`. +A regression test also prevents reading a status from outside the target block. -The daily activity source includes those obligations. Its live synchronization -and end-to-end delivery remain unverified. External intake, incident clocks, -production-transition decisions and estate assessment coverage remain open. +RISK-F-0013 (medium) and RISK-F-0014 (low) retain the historical 0.2.1 +binding/lifecycle defects and local 0.2.3 non-reproduction evidence; owner T07 +acceptance remains pending. RISK-F-0015 (low) records the two retained Claude +owner-routing misses; current-release complete provider evidence remains pending. -WP-0007 then reconciled the owner evidence in RISK-V-0003. Qonto's source -cadence/reconciliation exists; KG-WP-0005-T03 waits for deployed acceptance. -RPF-WP-0029 removed the backup fallback; T02 waits for provider invalidation -and recovery receipts. Both findings were recorded as moved and remain open -at `instant`; F-0010 was closed 2026-09-22 (RISK-RULING-2026-09-22-A), embargo lifted. F-0008's substantive review remains -overdue and its existing acceptance terms are displayed explicitly. Ten tests -pass. WP-0007 and four tasks are registered in State Hub. +## Remaining register obligations -## The register +- RISK-F-0012: qonto-assistant must supply e-invoice owner tracking and the + receiving/retention evidence. Existing default date: 2026-10-06. +- RISK-F-0008: accepted audit-retention risk; its substantive legal review and + real-data activation facts remain due. Existing technical default: 2026-11-17. +- Four full policies and RISK-REG-0001 remain overdue for substantive review. + This cleanup supplies no new legal research or activation assurance. +- Nine finding publication handovers remain pending. A disclosure grade is + not publication. No new external message or publication was sent here. +- Scheduled-session execution, external contact delivery and production-transition + adoption remain unverified; their definitions/routes are completed local work. -| ID | Sev | Status | Disclosure | Cadence | System | -| --- | --- | --- | --- | --- | --- | -| `RISK-F-0011` | medium | open | public | instant | qonto-assistant | -| `RISK-F-0012` | medium | open | public (handover after workplan) | instant | qonto-assistant | -| `RISK-F-0010` | low | fixed | public (handover pending) | 1h | railiance-platform | -| `RISK-F-0009` | high | fixed | public | instant | railiance-platform | -| `RISK-F-0008` | medium | accepted | public | 1h | audit-core | -| `RISK-F-0007` | high | fixed | public | instant | estate | -| `RISK-F-0006` | high | fixed | public | instant | railiance-platform | -| `RISK-F-0005` | medium | fixed | public | instant | audit-core | -| `RISK-F-0004` | medium | fixed | public | instant | tenant-engine | -| `RISK-F-0003` | medium | fixed | public | instant | ops-warden | -| `RISK-F-0002` | medium | fixed | public | instant | ops-warden | -| `RISK-F-0001` | high | fixed | public | instant | flex-auth | +Completed implementation tasks stay finished while those recurring or external +obligations remain on the register. Findings stay watched until concrete closure +or valid acceptance; owner workplan completion alone does not close them. -Notes below the floor: `RISK-N-0001` noisy neighbours · `RISK-N-0003` found by -reading not watching (first observation-sourced finding arrived 2026-09-02, -still a note) · `RISK-N-0004` zone lookup. +## Verification -Not one field reads `unset`. - -## How it works - -``` -findings/*.md source of truth; reporter fields + this repo's grade - ↓ tools/register_index.py -REGISTER.md generated, one screen, never hand-edited - -docs/method/ severity · disclosure · escalation · review - verification · dependencies · check-procedure -docs/rulings/ why each grade is what it is, dated -docs/regulatory/ RISK-REG-0001 + policies/ (13, keyed by activation) -docs/verifications/ RISK-V-000N — what this repo checked itself - -make due the work list -make fixes state of every tracked fix, from the owner's file -make coverage what the register has never heard from -make checked ARGS=... record an outcome; moves the cadence rung -make check index + malformed + waits + inbox + escalations -``` - -**Cadence:** `instant → 1h → 8h → 24h → 48h → 96h → 7d → 14d → 1mo → 1q`. -Clean climbs one rung; anything moving resets to `instant`. The rung is the -stability signal. Operator ruling, 2026-08-20. - -**Scheduled on `activity-core`:** `hourly-register-inbox-watch` (fires only on -an unread message) and `daily-register-check-sweep` (07:15, unconditional). -Both instruct a session that exercises judgement; neither may record an -outcome. - -## Waiting on other people - -| Who | On | Defaults | -| --- | --- | --- | -| qonto-assistant | deployed-instance capture and King's Guard acceptance under `KG-WP-0005-T03`; source cadence/reconciliation now exist (`F-0011`) | 2026-09-16 | -| railiance-platform | whether the age recovery-key taint named in RPF-WP-0029 is a separate exposure to file (raised 2026-09-22 after `F-0010` closed) | — | -| the-custodian | canon kinds packet | 2026-09-17 | -| audit-core | keyed commitment; `platform-pg` co-residency horizon | 2026-11-17 | - -## Verify - -``` -make check # everything, including the inbox -python3 tools/register_check.py # just the register -statehub fix-consistency --repo risk-nexus -``` - -## What the gap analysis changed - -`history/2026-08-21-intent-gap-analysis.md` graded this repo against its own -`INTENT.md` and `RISK-WP-0005` closed all seven gaps the same day. - -- **Fix state is read, not remembered.** `make fixes` resolves every - `fix_tracking` against the owning repo's workplan file. Its first run found - `RISK-F-0005`'s fix already landed three days earlier, and both of - `RISK-F-0002`'s tracked records closed *before that finding was filed*. -- **Incident intake exists**, with `first_observed` starting the 72-hour clock - in `RISK-POL-0005` and escalation that is not batched. -- **Public records have permanent addresses** — two findings and five method - instruments publish through `policy-nexus`; this repo remains their source. -- **Coverage has a number:** `make coverage` — 7 of 117 registered repos have - ever appeared in a finding. The other 110 are unknown, not clean. - -## Known conditions - -- **Earlier workplans were not indexed in the hub.** C-06 on the earlier set: this instance was - not the identifier registrar. Needs a run with `STATEHUB_REGISTRAR=1` on the - production instance. WP-0006 now has a registered Hub workplan and five task - UUIDs; this implementation did not repair historical workplan registration. -- **C-31** fires on `RISK-F-` ids. This is expected noise for this repo: the RISK-WP-0001 default was applied 2026-09-22 after the-custodian did not answer by 2026-09-17. The register no longer treats it as a gap it can close. If canon later registers the kinds, the warning clears on its own. - Defaults 2026-09-17. -- **OpenBao is unverifiable from here** (403). Every grade touching an OpenBao - policy is a grade on a document, and says so. -- **`RISK-F-0011` is due at `instant`.** Graded this sitting; not clean-checked - in the same sitting. The next pass climbs it if nothing moved. +`make test`: 14 tests pass. `make fixes` resolves the Emergent task states. +`make check` checks index, register obligations and inbox; overdue work remains +visible. `statehub fix-consistency` reconciles the seven workplans and pushes. +Historical records retain the provenance of file evidence versus live reads. diff --git a/findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md b/findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md index 7711c2e..1c37c56 100644 --- a/findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md +++ b/findings/RISK-F-0011-qonto-audit-deny-stream-completeness.md @@ -2,7 +2,7 @@ id: RISK-F-0011 type: finding title: "qonto-assistant audit.deny stream completeness is not established" -status: open +status: accepted owner: risk-nexus reported_by: kings-guard reported_via: gate-house @@ -30,17 +30,23 @@ publication_subtitle: "A live deny was observed on qonto-assistant, but nothing revision: "graded-1" last_reviewed: "2026-09-02" review_interval: 6m -escalation: pending +escalation: none escalation_trigger: 5 -escalation_status: sent +escalation_status: answered escalation_sent: "2026-09-22" -last_checked: "2026-09-22T06:13:33Z" -next_check: "2026-09-22T06:13:33Z" +escalation_answered: "2026-09-22" +accepted_by: "the founder, exercising GOVERN @ estate" +accepted_on: "2026-09-22" +acceptance_recorded: "2026-10-03" +acceptance_basis: "Hub decision 61fd83cc-4d21-4a0c-bbef-d91b2e8f129e; QONTO-WP-0005 source-only evidence" +accepted_until: "qonto-assistant runs as a deployed instance with a stream endpoint kings-guard can read, or the next scheduled risk review after 2026-12-31, whichever happens first" +last_checked: "2026-10-03T17:08:27Z" +next_check: "2026-10-03T17:08:27Z" cadence: instant clean_streak: 0 graded_by: risk-nexus ruling: RISK-RULING-2026-09-02-A -checked_by: "worsch" +checked_by: "codex/risk-nexus" --- # RISK-F-0011 — qonto-assistant audit.deny stream completeness is not established @@ -166,8 +172,29 @@ escalation went to the-custodian today and asks who authorizes and runs the deployed capture. Default if unanswered by 2026-09-29: raise once more, then record the stall as accepted by silence. The grade does not change. +## Founder acceptance reconciled — 2026-10-03 + +The founder, exercising `GOVERN @ estate`, chose source-only acceptance on +2026-09-22 in Hub message `61fd83cc-4d21-4a0c-bbef-d91b2e8f129e`. +The register had left that answer unread; this entry records the decision now +without backdating the review. Status is **accepted**, medium, public; the +stall escalation is answered. This is deliberate bounded acceptance, not +acceptance inferred from silence and not deployed-instance completeness. + +Acceptance ends at the first of: a deployed qonto-assistant instance exposing +a stream King's Guard can read; or the next scheduled risk review after +2026-12-31, which must re-check whether a runtime owner exists. The finding +then returns to active remediation. KG-WP-0005-T03 remains the closure path. +On 2026-10-03 the owner's recorded source workplan QONTO-WP-0005 is finished; +King's Guard's workplan is blocked and T03 is waiting for a runtime-owner +capture/endpoint. These are checkout records, not a live deployment read. +No acceptance-ending event is established by those records. + +The review ladder continues while accepted; this change earns no clean rung. + ## Reviews - **2026-09-02** — graded from the Gate House intake, the named conformance review, and a current-source check of qonto-assistant. Local lockout is in-process; the emitted deny stream still has no cadence or reconciliation view. Cadence starts at instant. - **2026-09-05** — not clean: Reviewed owner notice, cadence/logger/endpoint and KG-WP-0005; source remediation exists, deployed-instance acceptance remains pending under KG-WP-0005-T03. See RISK-V-0003. Cadence instant → instant; checked again immediately. - **2026-09-22** — not clean: Default applied: KG-WP-0005-T03 still wait, no deployed capture; stall recorded; escalated to the-custodian under trigger 5 Cadence instant → instant; checked again immediately. +- **2026-10-03** — not clean: Recorded founder source-only acceptance dated 2026-09-22; escalation answered; deployed acceptance still pending under KG-WP-0005-T03 Cadence instant → instant; checked again immediately. diff --git a/findings/RISK-F-0013-emergent-unsealed-card-receipt.md b/findings/RISK-F-0013-emergent-unsealed-card-receipt.md index 44e0a3a..7abd212 100644 --- a/findings/RISK-F-0013-emergent-unsealed-card-receipt.md +++ b/findings/RISK-F-0013-emergent-unsealed-card-receipt.md @@ -90,7 +90,10 @@ Owner tracking read directly: T04 `done`, T07 `wait`, workplan `blocked` on 2026-10-03. The current fix tracker reports these task IDs as `unreadable` because their task blocks place `title` between `id` and `status`; this filing uses the explicit file read, -not that parser result as evidence of absent tracking. +not that parser result as evidence of absent tracking. The 2026-10-03 cleanup +under RISK-WP-0005-T01 subsequently repaired the parser; `make fixes` now +reports T04 `done` and T07 `wait`. This reporting repair supplies no additional +remediation or provider acceptance. Reporter evidence (read from the sibling checkout): diff --git a/findings/RISK-F-0014-emergent-loaded-withdrawal-snapshot.md b/findings/RISK-F-0014-emergent-loaded-withdrawal-snapshot.md index dd058c4..621d8b8 100644 --- a/findings/RISK-F-0014-emergent-loaded-withdrawal-snapshot.md +++ b/findings/RISK-F-0014-emergent-loaded-withdrawal-snapshot.md @@ -87,7 +87,10 @@ Owner tracking read directly: T04 `done`, T07 `wait`, workplan `blocked` on 2026-10-03. The current fix tracker reports these task IDs as `unreadable` because their task blocks place `title` between `id` and `status`; this filing uses the explicit file read, -not that parser result as evidence of absent tracking. +not that parser result as evidence of absent tracking. The 2026-10-03 cleanup +under RISK-WP-0005-T01 subsequently repaired the parser; `make fixes` now +reports T04 `done` and T07 `wait`. This reporting repair supplies no additional +remediation or provider acceptance. Reporter evidence (read from the sibling checkout): diff --git a/findings/RISK-F-0015-emergent-claude-owner-routing.md b/findings/RISK-F-0015-emergent-claude-owner-routing.md index 0afa88c..aae6834 100644 --- a/findings/RISK-F-0015-emergent-claude-owner-routing.md +++ b/findings/RISK-F-0015-emergent-claude-owner-routing.md @@ -88,7 +88,10 @@ Owner tracking read directly: T04 `done`, T07 `wait`, workplan `blocked` on 2026-10-03. The current fix tracker reports these task IDs as `unreadable` because their task blocks place `title` between `id` and `status`; this filing uses the explicit file read, -not that parser result as evidence of absent tracking. +not that parser result as evidence of absent tracking. The 2026-10-03 cleanup +under RISK-WP-0005-T01 subsequently repaired the parser; `make fixes` now +reports T04 `done` and T07 `wait`. This reporting repair supplies no additional +remediation or provider acceptance. Reporter evidence (read from the sibling checkout): diff --git a/tests/test_review_workflow.py b/tests/test_review_workflow.py index 25fec16..eb9b892 100644 --- a/tests/test_review_workflow.py +++ b/tests/test_review_workflow.py @@ -129,6 +129,21 @@ class ReviewWorkflowTests(unittest.TestCase): self.assertIn("finished [archived]", report) self.assertNotIn("UNCHANGED", report) + def test_task_tracking_reads_reordered_fields_without_crossing_blocks(self): + with tempfile.TemporaryDirectory() as directory: + path = pathlib.Path(directory) / "workplan.md" + path.write_text('---\nid: TEST-WP-0001\nstatus: blocked\n---\n' + '```task\nid: TEST-WP-0001-T01\n' + 'title: Implement the fix\npriority: high\nstatus: "done"\n```\n' + '```task\nstatus: wait\ntitle: Accept runtime evidence\n' + 'id: TEST-WP-0001-T02\n```\n' + '```task\nid: TEST-WP-0001-T03\n```\n' + 'status: done\n') + self.assertEqual(fix_tracker.task_status(path, "TEST-WP-0001-T01"), "done") + self.assertEqual(fix_tracker.task_status(path, "TEST-WP-0001-T02"), "wait") + self.assertIsNone(fix_tracker.task_status(path, "TEST-WP-0001-T03")) + self.assertIsNone(fix_tracker.task_status(path, "TEST-WP-0001-T04")) + def test_accepted_obligation_requires_a_resolvable_basis_and_review(self): finding = dict(id="RISK-F-9999", status="accepted", fix_tracking="unset", accepted_by="operator", accepted_until="real data arrives", diff --git a/tools/fix_tracker.py b/tools/fix_tracker.py index 112277b..0388825 100644 --- a/tools/fix_tracker.py +++ b/tools/fix_tracker.py @@ -15,6 +15,7 @@ import datetime as dt import pathlib import re import subprocess +import yaml import register_lib as lib @@ -48,8 +49,16 @@ def last_commit(path: pathlib.Path) -> dt.datetime | None: def task_status(path: pathlib.Path, task_id: str) -> str | None: - m = re.search(rf"id: {re.escape(task_id)}\s*\nstatus: (\w+)", path.read_text(encoding="utf-8")) - return m.group(1) if m else None + for block in re.findall(r"^```task\s*\n(.*?)^```\s*$", + path.read_text(encoding="utf-8"), re.M | re.S): + try: + task = yaml.safe_load(block) + except yaml.YAMLError: + continue + if isinstance(task, dict) and task.get("id") == task_id: + status = task.get("status") + return status if isinstance(status, str) else None + return None def resolve(fix_tracking: str) -> list[dict]: diff --git a/workplans/RISK-WP-0005-close-the-intent-gaps.md b/workplans/RISK-WP-0005-close-the-intent-gaps.md index d2537c7..4c78cba 100644 --- a/workplans/RISK-WP-0005-close-the-intent-gaps.md +++ b/workplans/RISK-WP-0005-close-the-intent-gaps.md @@ -8,7 +8,7 @@ status: finished owner: the-custodian topic_slug: risk-nexus created: "2026-08-21" -updated: "2026-08-21" +updated: "2026-10-03" depends_on_workplans: - RISK-WP-0001 - RISK-WP-0004 @@ -270,3 +270,13 @@ the task, not only here. - Whether findings should be reported to the estate by anything other than their owners — monitoring, coverage sweeps — stays a note until evidence makes it a finding. + +## Loose-end review — 2026-10-03 + +Under existing T01, repaired task status reading: YAML task blocks permit +`title` and other fields between `id` and `status`, quoted values and reordered +keys. Emergent T04/T07 now resolve as done/wait. A regression ensures a missing +status cannot be borrowed from another block or prose. All 14 tests pass. +No tasks were added or reopened. All seven local workplans and their Hub +projections are finished; all 37 local tasks are done. External adoption, +contact provisioning and recurring reviews remain the stated residuals. diff --git a/workplans/RISK-WP-0007-reconcile-owner-evidence.md b/workplans/RISK-WP-0007-reconcile-owner-evidence.md index 9180050..aa96f35 100644 --- a/workplans/RISK-WP-0007-reconcile-owner-evidence.md +++ b/workplans/RISK-WP-0007-reconcile-owner-evidence.md @@ -8,7 +8,7 @@ status: finished owner: the-custodian topic_slug: custodian created: "2026-09-05" -updated: "2026-09-05" +updated: "2026-10-03" depends_on_workplans: - RISK-WP-0006 state_hub_workstream_id: "ac12733f-3f4b-5c7b-aee7-7115b9c4db72" @@ -111,3 +111,15 @@ Still external or unverified: runtime capture/observer acceptance, provider invalidation/recovery receipts, acceptance-trigger facts and legal reviews, external contact delivery and scheduled-session completion. Source searches establish no stronger conclusion. No messages or acknowledgements were sent. + +## Loose-end review — 2026-10-03 + +Under existing T01/T04, reconciled the founder's 2026-09-22 response for +RISK-F-0011, previously unread. Recorded bounded source-only acceptance, +answered the stall escalation, preserved the medium grade and KG-WP-0005-T03 +runtime closure path, and reset cadence with a moved check. The founder, +exercising `GOVERN @ estate`, ends acceptance on a readable deployed instance +or the next scheduled risk review after 2026-12-31, whichever occurs first. +QONTO-WP-0005 is finished; KG-WP-0005 is blocked with T03 waiting. This is a +checkout reconciliation, not live runtime acceptance. Updated STATE/SCOPE and +reconciled inbox handling. No local blocked tasks remain; no new tasks/plans.