Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
48 changes: 48 additions & 0 deletions project-ownership-succession-guard/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Project Ownership Succession Guard

This contribution adds a focused guardrail for SCIBASE's User & Project Management layer. It evaluates project ownership transfer requests when a workspace owner is inactive, has left an institution, is unreachable, or when a project risks becoming orphaned.

The slice is intentionally narrow. It does not rebuild RBAC, invitation flows, offboarding, visibility transitions, deletion, or archive handoff. It covers the succession decision itself: who can inherit control of a scientific workspace, what approvals are required, and how attribution and compliance holds stay intact.

## What It Checks

- A valid owner-inactivity, departure, suspension, legal, or institutional succession trigger.
- Whether the proposed owner has a succession-eligible role such as admin, co-owner, PI, data steward, or institutional steward.
- Fresh identity verification and MFA posture for the successor.
- Independent approval through an institutional steward, data steward plus co-owner quorum, or legal authority.
- Compliance approval when the project contains IRB, DUA, clinical, embargoed, human-subjects, or export-controlled holds.
- Complete collaborator notice and a meaningful objection window.
- Preservation of original owner credit, contribution history, and a public transfer receipt.
- Open ownership disputes or competing successor claims.
- Immutable audit receipts for the transfer packet.

## Running Locally

```bash
npm test
npm run demo
npm run check
npm run video
```

The demo uses only synthetic packets in `data/sample_succession_packets.json`.

Generated files:

- `reports/summary.json`
- `reports/reviewer-packet.md`
- `reports/summary.svg`
- `reports/demo.mp4`

The MP4 is generated from an FFmpeg color source and drawtext slate. It is not a screen recording and contains no desktop capture or private information.

## Why This Matters

Scientific workspaces often outlive a single account owner. A PI can leave, an institutional email can disappear, a lab can close, or an owner may become unreachable while collaborators still need to preserve datasets, manuscripts, audit evidence, and attribution.

Without an explicit succession guard, platforms can drift toward two bad outcomes:

1. Workspaces become orphaned and cannot be responsibly maintained.
2. A contributor or administrator takes over without enough independent approval, notice, or compliance review.

This guard creates a reviewer-ready decision packet so SCIBASE can freeze risky transfers, preserve original credit, and approve clean succession requests with auditable evidence.
183 changes: 183 additions & 0 deletions project-ownership-succession-guard/data/sample_succession_packets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
[
{
"id": "succession-approve-001",
"title": "Departed PI transfer to verified co-owner with full notice",
"reviewDate": "2026-08-15",
"project": {
"visibility": "institutional-only",
"holds": []
},
"currentOwner": {
"id": "owner-1",
"active": false,
"lastSeenAt": "2026-03-01"
},
"proposedOwner": {
"id": "co-owner-2",
"roles": ["co_owner", "admin"],
"identityVerified": true,
"mfaFresh": true
},
"request": {
"reason": "departed_institution",
"inactivityThresholdDays": 90,
"activeDisputeCount": 0
},
"approvals": {
"institutionalSteward": true,
"dataSteward": true,
"coOwnerQuorum": true,
"complianceOfficer": false
},
"notices": {
"collaboratorCount": 8,
"notifiedCollaborators": 8,
"objectionWindowDays": 21
},
"attribution": {
"preserveOriginalOwnerCredit": true,
"preserveContributionHistory": true,
"transferReasonPublicReceipt": true
},
"audit": {
"immutableReceipt": true,
"openOwnershipDispute": false
}
},
{
"id": "succession-hold-002",
"title": "Contributor attempts takeover without independent approval",
"reviewDate": "2026-08-15",
"project": {
"visibility": "private",
"holds": []
},
"currentOwner": {
"id": "owner-9",
"active": true,
"lastSeenAt": "2026-08-01"
},
"proposedOwner": {
"id": "contributor-4",
"roles": ["contributor"],
"identityVerified": true,
"mfaFresh": false
},
"request": {
"reason": "team_preference",
"inactivityThresholdDays": 90,
"competingOwnerClaim": true,
"activeDisputeCount": 1
},
"approvals": {
"institutionalSteward": false,
"dataSteward": false,
"coOwnerQuorum": false,
"complianceOfficer": false
},
"notices": {
"collaboratorCount": 5,
"notifiedCollaborators": 2,
"objectionWindowDays": 3
},
"attribution": {
"preserveOriginalOwnerCredit": false,
"preserveContributionHistory": true,
"transferReasonPublicReceipt": false
},
"audit": {
"immutableReceipt": false,
"openOwnershipDispute": true
}
},
{
"id": "succession-hold-003",
"title": "Clinical dataset project transfer missing compliance signoff",
"reviewDate": "2026-08-15",
"project": {
"visibility": "invitation-only",
"holds": ["irb_hold", "clinical_data_lock", "data_use_agreement"]
},
"currentOwner": {
"id": "owner-3",
"active": false,
"lastSeenAt": "2025-12-15"
},
"proposedOwner": {
"id": "data-steward-7",
"roles": ["data_steward", "admin"],
"identityVerified": true,
"mfaFresh": true
},
"request": {
"reason": "owner_unreachable",
"inactivityThresholdDays": 90,
"activeDisputeCount": 0
},
"approvals": {
"institutionalSteward": true,
"dataSteward": true,
"coOwnerQuorum": true,
"complianceOfficer": false
},
"notices": {
"collaboratorCount": 12,
"notifiedCollaborators": 12,
"objectionWindowDays": 21
},
"attribution": {
"preserveOriginalOwnerCredit": true,
"preserveContributionHistory": true,
"transferReasonPublicReceipt": true
},
"audit": {
"immutableReceipt": true,
"openOwnershipDispute": false
}
},
{
"id": "succession-review-004",
"title": "Eligible successor with short notice window and missing receipt",
"reviewDate": "2026-08-15",
"project": {
"visibility": "private",
"holds": []
},
"currentOwner": {
"id": "owner-5",
"active": false,
"lastSeenAt": "2026-02-01"
},
"proposedOwner": {
"id": "admin-11",
"roles": ["admin"],
"identityVerified": true,
"mfaFresh": true
},
"request": {
"reason": "owner_inactive",
"inactivityThresholdDays": 90,
"activeDisputeCount": 0
},
"approvals": {
"institutionalSteward": true,
"dataSteward": false,
"coOwnerQuorum": false,
"complianceOfficer": false
},
"notices": {
"collaboratorCount": 6,
"notifiedCollaborators": 6,
"objectionWindowDays": 7
},
"attribution": {
"preserveOriginalOwnerCredit": true,
"preserveContributionHistory": true,
"transferReasonPublicReceipt": true
},
"audit": {
"immutableReceipt": false,
"openOwnershipDispute": false
}
}
]
13 changes: 13 additions & 0 deletions project-ownership-succession-guard/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "project-ownership-succession-guard",
"version": "1.0.0",
"description": "Dependency-free guard for project ownership succession and orphaned workspace takeover decisions.",
"main": "src/index.js",
"scripts": {
"test": "node --test",
"demo": "node scripts/demo.js",
"video": "node scripts/render-demo-video.js",
"check": "node --check src/index.js && node --check scripts/demo.js && node --check scripts/render-demo-video.js"
},
"license": "MIT"
}
Binary file not shown.
71 changes: 71 additions & 0 deletions project-ownership-succession-guard/reports/reviewer-packet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Project Ownership Succession Guard Report

Generated: 2026-08-15T21:45:36.455Z
Packets analyzed: 4
Decision counts: APPROVE 1, REVIEW 1, HOLD 2

## Findings

### succession-approve-001: Departed PI transfer to verified co-owner with full notice

Decision: APPROVE
Risk score: 0
Succession trigger: yes
Compliance hold: no

- No succession risk detected.

Recommended actions:
- Approve the ownership transfer and retain the succession receipt.

### succession-hold-002: Contributor attempts takeover without independent approval

Decision: HOLD
Risk score: 100
Succession trigger: no
Compliance hold: no

- CRITICAL NO_VALID_SUCCESSION_TRIGGER: The packet does not show a valid owner inactivity, departure, or succession trigger.
- CRITICAL PROPOSED_OWNER_ROLE_INELIGIBLE: The proposed owner lacks a succession-eligible project role.
- MAJOR SUCCESSOR_IDENTITY_POSTURE_INSUFFICIENT: The proposed owner does not have current verified identity and MFA evidence.
- CRITICAL INDEPENDENT_SUCCESSION_APPROVAL_MISSING: Ownership transfer lacks an independent institutional, data-steward, quorum, or legal approval path.
- MAJOR COLLABORATOR_SUCCESSION_NOTICE_INCOMPLETE: Not all collaborators were notified about the ownership succession request.
- MAJOR OBJECTION_WINDOW_TOO_SHORT: The collaborator objection window is too short for a project ownership transfer.
- MAJOR ORIGINAL_OWNER_ATTRIBUTION_NOT_PRESERVED: The transfer packet does not preserve original owner credit, contribution history, and a public transfer receipt.
- CRITICAL COMPETING_OWNERSHIP_CLAIM_UNRESOLVED: The transfer has an unresolved ownership dispute or competing successor claim.
- MAJOR IMMUTABLE_TRANSFER_AUDIT_RECEIPT_MISSING: The succession packet lacks an immutable audit receipt.

Recommended actions:
- Freeze owner-only project actions until the succession packet is resolved.
- Route the packet to independent governance review.
- Preserve original owner attribution and collaborator notice evidence.

### succession-hold-003: Clinical dataset project transfer missing compliance signoff

Decision: HOLD
Risk score: 35
Succession trigger: yes
Compliance hold: yes

- CRITICAL COMPLIANCE_HOLD_TRANSFER_APPROVAL_MISSING: The project has regulated-data, IRB, DUA, embargo, clinical, or export-control holds without compliance approval.

Recommended actions:
- Keep regulated datasets and embargoed artifacts locked until compliance approval is recorded.
- Freeze owner-only project actions until the succession packet is resolved.
- Route the packet to independent governance review.
- Preserve original owner attribution and collaborator notice evidence.

### succession-review-004: Eligible successor with short notice window and missing receipt

Decision: REVIEW
Risk score: 44
Succession trigger: yes
Compliance hold: no

- MAJOR OBJECTION_WINDOW_TOO_SHORT: The collaborator objection window is too short for a project ownership transfer.
- MAJOR IMMUTABLE_TRANSFER_AUDIT_RECEIPT_MISSING: The succession packet lacks an immutable audit receipt.

Recommended actions:
- Freeze owner-only project actions until the succession packet is resolved.
- Route the packet to independent governance review.
- Preserve original owner attribution and collaborator notice evidence.
Loading