Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
64cecf9
fix: harden audited access and data lifecycle paths
Nov 5, 2026
da764ef
fix: keep bulk confirmation errors within compliance wording guard
Nov 5, 2026
53aa708
Merge current document tooling and preserve private draft files
Nov 5, 2026
f256f3a
fix: synchronize verification refs only after React commits
Nov 5, 2026
7b0f0a2
fix: propagate browser build heap settings to TypeScript children
Nov 5, 2026
9f963da
test: cover inherited browser build heap limits
Nov 5, 2026
212f457
test: validate the browser runner production environment
Nov 5, 2026
33f6478
fix: update glob consumers and scope verified minimatch overrides
Nov 5, 2026
fca888f
docs: record remaining backend audit acceptance and rollout tasks
Nov 5, 2026
2131b95
chore: refresh repo-awareness snapshot for the backend audit document
claude Nov 6, 2026
973168a
fix(db): qualify unnest ids so maintenance snapshot fences fire
claude Nov 6, 2026
53ee0ff
fix(db): ship maintenance fence alias fix as a new forward migration
claude Nov 6, 2026
4c2de64
test(sql): keep the roster behaviour fixture ahead of today
claude Nov 6, 2026
b3b1be5
fix(db): commit the CI-generated drift manifest
claude Nov 6, 2026
7542290
fix(audit): address PR #3902 docs and tooling review threads
claude Nov 6, 2026
15c4f83
fix(audit): resolve PR #3902 review threads on app, auth and booking …
claude Nov 6, 2026
b13d6ae
Merge remote-tracking branch 'origin/audit/remediation-2026-11-05' in…
claude Nov 6, 2026
7668f65
test(on-call): supply the refetch read in the save-vs-older-list tests
claude Nov 6, 2026
48818a1
fix(visual-backfill): page past the API row cap when loading candidates
claude Nov 6, 2026
8c3ded9
Merge origin/main (#3900, #3901) into audit/remediation-2026-11-05
claude Nov 7, 2026
d3eb134
fix(supabase): renumber this PR's nine draft migrations after main's …
claude Nov 7, 2026
964b1f9
test(calendar): drop the duplicate feed-repository import left by the…
claude Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/sentry-alerts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ name: Sentry production alerts
# Setup (owner, once): a Sentry personal token with event:read, org:read and project:read,
# stored as the repository secret SENTRY_ALERTS_TOKEN. The organisation and project are
# discovered from the token; set the repository variables SENTRY_ORG / SENTRY_PROJECT only
# if the account holds more than one of either. Without the secret every run is a warning
# and nothing else.
# if the account holds more than one of either. Without the secret the detector fails as
# unavailable, so the daily summary cannot describe its silence as healthy.

on:
workflow_dispatch:
Expand Down Expand Up @@ -51,7 +51,7 @@ jobs:
script: |
const token = (process.env.SENTRY_ALERTS_TOKEN || "").trim();
if (!token) {
core.warning("SENTRY_ALERTS_TOKEN is not set, so Sentry errors are not reaching the owner. See the header of sentry-alerts.yml.");
core.setFailed("SENTRY_ALERTS_TOKEN is not set; Sentry monitoring is unavailable.");
return;
}

Expand Down
5 changes: 5 additions & 0 deletions data/repo-awareness-snapshot.json
Original file line number Diff line number Diff line change
Expand Up @@ -4069,6 +4069,11 @@
"section": "decisions",
"catalogued": true
},
{
"path": "docs/backend-audit-remediation-2026-11-05.md",
"section": "root",
"catalogued": false
},
{
"path": "docs/production-readiness.md",
"section": "root",
Expand Down
4 changes: 3 additions & 1 deletion docs/agents/document-drafts.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ Older workspaces can gain input snapshots by reconciling once while their inputs

Export emits absolute `path`, current `before_sha256` and `after_base64` fields for the existing integrator. It is a proposal. The integrator must check claims and required gates, establish a serial write, compare the current original hash immediately before applying, and re-reconcile changed inputs. The helper has no apply command and grants no release, takeover, publication or additional authority. Keep governing-rule and substantive conflicts for their authorised decision-maker.

On POSIX, new task workspaces are owned by the current user with mode 0700 and new copied artifacts use mode 0600. Existing broader-permission or another-owner workspaces are refused without changing them: preserve the old draft/candidate and reconcile it in a fresh private task-owned workspace. Windows filesystem ACL privacy still needs verification on its actual host. Per-file reads stop at the 10 MiB limit plus one byte before rejecting oversized input; this is not an OS adversarial-filesystem sandbox.

Supported inputs: UTF-8 `.md`, `.txt`, `.rst`, `.adoc`; at most 100 exact paths and 10 MiB total. Traversal, hidden/sensitive/configuration names, links/reparse points, changed baselines, stale exports and busy locks fail closed. Filename screening does not certify contents safe. Never copy secrets, private sessions or data outside the task purpose/audience. Never reclaim an uncertain lock by age.

Run the synthetic safety/merge checks with `python3 scripts/test-document-drafts.py`. The dedicated Document drafts workflow runs the same checks on a hosted Linux runner after relevant PR changes. That proves helper behaviour on that runner; it does not prove any chat loaded or followed the rules.

This copy reuses the reviewed shared helper, SHA-256 `f9f919523098e8ac0a00d8082e593c0bfca969bb05163f5d1f957f31262c39fe`. Maintain helper and tests together; compare reviewed hashes before updating another copy. No private instruction source or Windows installation is required on cloud hosts. A cloud checkout must select this feature branch or a main revision containing it; a PR does not change existing checkouts. Coordinate only task-safe metadata through supported native task tools with destination authority. If a host is offline, preserve the draft and continue independent authorised work; do not collect raw sessions or create a replacement chat service.
This copy includes locally reviewed private-workspace and bounded-read safeguards, SHA-256 `990e3017b9e0ccccd5800660cb87088f47c9c19ff003740d65592d0765c3d939`. The shared-helper predecessor was `f9f919523098e8ac0a00d8082e593c0bfca969bb05163f5d1f957f31262c39fe`. Maintain helper and tests together; compare reviewed hashes before updating another copy. No private instruction source or Windows installation is required on cloud hosts. A cloud checkout must select this feature branch or a main revision containing it; a PR does not change existing checkouts. Coordinate only task-safe metadata through supported native task tools with destination authority. If a host is offline, preserve the draft and continue independent authorised work; do not collect raw sessions or create a replacement chat service.
2 changes: 1 addition & 1 deletion docs/audit/tenancy-defense-in-depth-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ staying quiet.
| `src/lib/work-roles/hospital-sick.ts` | `work_hospital_teams` | `readHospitalSickCalls` | Team links of that same hospital, after the same gate (DB-01). |
| `src/lib/work-roles/hospital-starters.ts` | `work_hospitals` | `readHospitalStarters` | Hospital name after the `starters.view` gate (DB-01). |
| `src/lib/work-roles/hospital-starters.ts` | `work_hospital_teams` | `readHospitalStarters` | Team links of that same hospital, after the same gate (DB-01). |
| `src/lib/work-roles/people.ts` | `work_hospitals` | `hospitalsFor`, `moveTeam`, `renameHospital`, `archiveHospital`, `applyPeopleChange` | Organisation structure (hospital id and name), no person named. Every write is administrator-only; `hospitalsFor` keeps only hospitals `canManagePeople` allows (DB-01). |
| `src/lib/work-roles/people.ts` | `work_hospitals` | `hospitalsFor`, `moveTeam`, `renameHospital`, `archiveHospital`, `applyPeopleChange` | Organisation structure (hospital id and name), no person named. Every write is administrator-only; link-team additionally reads only its exact destination id and live archive state after that administrator check, repeated by the database guard under a row lock. `hospitalsFor` keeps only hospitals `canManagePeople` allows (DB-01). |
| `src/lib/work-roles/people.ts` | `work_hospital_teams` | `readPeople`, `readUnlinkedTeams`, `hospitalTeamIds`, `moveTeam`, `applyPeopleChange` | Team-to-hospital links, no person named. Reads follow the `canManagePeople` or administrator check; link and move are administrator-only (DB-01). |
| `src/lib/work-roles/server.ts` | `work_hospitals` | `addGrantedRoles` | Names and archive state of hospitals on the session user's own grants (`.eq("user_id", userId)`) (DB-01). |
| `src/lib/work-roles/server.ts` | `work_hospital_teams` | `addGrantedRoles` | Team links of those same hospitals, to resolve the session user's own roles (DB-01). |
Expand Down
Loading
Loading