Skip to content
Closed
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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# deepevents.ai
deepevents.ai main codebase

- `enterprise-grant-portfolio-compliance/` adds deterministic grant and funder mandate compliance tracking for institutional research portfolios.
39 changes: 39 additions & 0 deletions enterprise-grant-portfolio-compliance/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Enterprise Grant Portfolio Compliance

Institutional research offices need a grant-level view of funder obligations before they certify exports or submit reports. This module turns synthetic grant records into deterministic compliance decisions, admin metrics, action queues, export readiness, and signed event payloads.

## What It Covers

- Funder mandate checks for open access, data management plans, repository deposits, DOI evidence, ORCID coverage, and report deadlines.
- Portfolio metrics for institutional admins by department and funder.
- Export readiness decisions for grant and funder portal workflows.
- HMAC-signed event payloads that can be forwarded to institutional integration layers.
- Synthetic sample data only; no credentials or real institution records.

## Run It

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

## Demo Output

```text
Enterprise grant portfolio compliance demo for Northbridge Institute of Translational Science
As of 2026-05-16: 1 ready, 1 needs review, 1 blocked
Average score: 63
NIH-R01-NEURO-142: blocked score=0 blockers=6 warnings=4
HORIZON-CLIMATE-782: ready score=100 blockers=0 warnings=0
UKRI-QUANTUM-008: needs_review score=88 blockers=0 warnings=1
Signed event sample: NIH-R01-NEURO-142 digest=... signature=...
```

## Files

- `src/grant-portfolio-compliance.js` - dependency-free mandate evaluator and signing helpers.
- `data/sample-grant-portfolio.json` - synthetic institutional grant portfolio.
- `test/grant-portfolio-compliance.test.js` - coverage for decisions, obligations, dates, and deterministic event signatures.
- `docs/requirement-map.md` - issue #19 requirement mapping and non-overlap notes.
- `docs/demo.svg` and `docs/demo.gif` - short visual demo artifacts for review.
277 changes: 277 additions & 0 deletions enterprise-grant-portfolio-compliance/data/sample-grant-portfolio.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
{
"asOf": "2026-05-16",
"institution": {
"id": "inst-northbridge",
"name": "Northbridge Institute of Translational Science",
"adminOffice": "Research Integrity and Sponsored Programs",
"timezone": "America/New_York"
},
"grants": [
{
"grantId": "NIH-R01-NEURO-142",
"awardNumber": "R01NS014200",
"funder": "National Institutes of Health",
"program": "BRAIN Initiative",
"principalInvestigator": "Dr. Mara Okafor",
"department": "Neuroscience",
"tags": ["GRANT-TRACKED", "HUMAN-SUBJECTS"],
"mandates": {
"openAccess": {
"required": true,
"deadlineDaysAfterPublication": 30
},
"dataManagementPlan": {
"required": true,
"acceptedStatuses": ["approved", "exempt"]
},
"repositoryDeposit": {
"required": true,
"allowedRepositories": ["PubMed Central", "Zenodo", "Institutional DSpace"],
"deadlineDaysAfterPublication": 30
},
"persistentIdentifiers": {
"doiRequiredFor": ["article", "dataset"],
"orcidForContributors": true
},
"reports": [
{
"type": "annual-progress",
"dueDate": "2026-05-30",
"status": "draft"
},
{
"type": "public-access-final",
"dueDate": "2026-05-10",
"status": "not_started"
}
]
},
"projects": [
{
"projectId": "proj-neuro-atlas",
"title": "Atlas of recovery markers after neural stimulation",
"contributors": [
{
"name": "Mara Okafor",
"role": "PI",
"orcid": "0000-0002-0182-0097"
},
{
"name": "Jin Park",
"role": "Data steward",
"orcid": ""
}
],
"dataManagementPlan": {
"status": "missing",
"lastReviewedAt": null
},
"outputs": [
{
"outputId": "out-neuro-preprint",
"kind": "article",
"title": "Recovery markers in cortical stimulation cohorts",
"publicationDate": "2026-04-01",
"doi": "",
"openAccess": {
"status": "closed",
"scheduledDate": null
},
"repositoryDeposits": []
},
{
"outputId": "out-neuro-signals",
"kind": "dataset",
"title": "Synthetic cortical signal feature table",
"publicationDate": "2026-04-01",
"doi": "",
"openAccess": {
"status": "restricted",
"scheduledDate": null
},
"repositoryDeposits": [
{
"repository": "Lab SharePoint",
"status": "internal_only",
"depositedAt": null
}
]
}
]
}
]
},
{
"grantId": "HORIZON-CLIMATE-782",
"awardNumber": "HORIZON-RIA-782",
"funder": "Horizon Europe",
"program": "Climate Resilience Missions",
"principalInvestigator": "Dr. Leila Varga",
"department": "Earth Systems",
"tags": ["GRANT-TRACKED", "EU-FUNDER"],
"mandates": {
"openAccess": {
"required": true,
"deadlineDaysAfterPublication": 0
},
"dataManagementPlan": {
"required": true,
"acceptedStatuses": ["approved"]
},
"repositoryDeposit": {
"required": true,
"allowedRepositories": ["Zenodo", "Institutional DSpace"],
"deadlineDaysAfterPublication": 0
},
"persistentIdentifiers": {
"doiRequiredFor": ["article", "dataset", "software"],
"orcidForContributors": true
},
"reports": [
{
"type": "periodic-technical",
"dueDate": "2026-06-30",
"status": "submitted"
}
]
},
"projects": [
{
"projectId": "proj-climate-resilience",
"title": "City-scale resilience projections",
"contributors": [
{
"name": "Leila Varga",
"role": "PI",
"orcid": "0000-0003-2088-7711"
},
{
"name": "Tomas Weber",
"role": "Model lead",
"orcid": "0000-0001-4455-9304"
}
],
"dataManagementPlan": {
"status": "approved",
"lastReviewedAt": "2026-04-20"
},
"outputs": [
{
"outputId": "out-climate-model",
"kind": "software",
"title": "Synthetic flood-risk model package",
"publicationDate": "2026-05-01",
"doi": "10.5281/zenodo.7821001",
"openAccess": {
"status": "open",
"scheduledDate": "2026-05-01"
},
"repositoryDeposits": [
{
"repository": "Zenodo",
"status": "deposited",
"depositedAt": "2026-05-01"
}
]
},
{
"outputId": "out-climate-dataset",
"kind": "dataset",
"title": "Synthetic urban sensor panel",
"publicationDate": "2026-05-01",
"doi": "10.5281/zenodo.7821002",
"openAccess": {
"status": "open",
"scheduledDate": "2026-05-01"
},
"repositoryDeposits": [
{
"repository": "Zenodo",
"status": "deposited",
"depositedAt": "2026-05-01"
}
]
}
]
}
]
},
{
"grantId": "UKRI-QUANTUM-008",
"awardNumber": "EP/X008008/1",
"funder": "UK Research and Innovation",
"program": "Quantum Technologies",
"principalInvestigator": "Dr. Imogen Shaw",
"department": "Physics",
"tags": ["DOCTORAL-WORK", "GRANT-TRACKED"],
"mandates": {
"openAccess": {
"required": true,
"deadlineDaysAfterPublication": 90
},
"dataManagementPlan": {
"required": true,
"acceptedStatuses": ["approved", "exempt"]
},
"repositoryDeposit": {
"required": true,
"allowedRepositories": ["Institutional DSpace", "Zenodo"],
"deadlineDaysAfterPublication": 90
},
"persistentIdentifiers": {
"doiRequiredFor": ["article", "dataset"],
"orcidForContributors": true
},
"reports": [
{
"type": "impact-statement",
"dueDate": "2026-05-22",
"status": "draft"
}
]
},
"projects": [
{
"projectId": "proj-quantum-calibration",
"title": "Calibration traces for quantum sensor benches",
"contributors": [
{
"name": "Imogen Shaw",
"role": "PI",
"orcid": "0000-0002-7744-1119"
},
{
"name": "Ari Patel",
"role": "Doctoral researcher",
"orcid": "0000-0002-1010-4040"
}
],
"dataManagementPlan": {
"status": "approved",
"lastReviewedAt": "2026-05-05"
},
"outputs": [
{
"outputId": "out-quantum-paper",
"kind": "article",
"title": "Calibration drift in synthetic quantum sensors",
"publicationDate": "2026-05-11",
"doi": "10.5555/ukri.quantum.008",
"openAccess": {
"status": "scheduled",
"scheduledDate": "2026-06-15"
},
"repositoryDeposits": [
{
"repository": "Institutional DSpace",
"status": "scheduled",
"depositedAt": "2026-06-15"
}
]
}
]
}
]
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions enterprise-grant-portfolio-compliance/docs/demo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions enterprise-grant-portfolio-compliance/docs/requirement-map.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Enterprise Grant Portfolio Compliance Requirement Map

| Issue #19 capability | Implementation evidence |
| --- | --- |
| Organization-wide dashboard for admins | `evaluatePortfolio()` returns `summary`, `adminMetrics.byDepartment`, `adminMetrics.byFunder`, and `topRisks` for a research office portfolio view. |
| Compliance tracking for funder mandates and open access status | `src/grant-portfolio-compliance.js` evaluates open access, repository deposit, data management plan, DOI, ORCID, and report due-date obligations. |
| Export pipelines to grant and funder portals | `buildExportManifest()` produces ready, blocked, and review grant sets plus required evidence fields for institutional export workflows. |
| Secure API and webhook support | `signEvent()` creates deterministic SHA-256 digests and HMAC signatures for downstream webhook/event delivery without external credentials. |
| Research operations analytics | The module calculates compliance scores, risk levels, blockers, warnings, action owners, and top-risk grants from synthetic portfolio records. |
| Reviewer-ready proof | `npm run check`, `npm test`, `npm run demo`, `docs/demo.svg`, and `docs/demo.gif` provide local verification and a short demo artifact. |

## Non-overlap Notes

This slice focuses on grant-portfolio obligations and funder mandate certification. It does not reimplement broad admin dashboards, export package builders, webhook replay ledgers, identity provisioning drift, legal holds, or data residency controls submitted in earlier issue #19 PRs.
20 changes: 20 additions & 0 deletions enterprise-grant-portfolio-compliance/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "enterprise-grant-portfolio-compliance",
"version": "1.0.0",
"description": "Deterministic grant and funder mandate compliance tooling for institutional research portfolios.",
"main": "src/grant-portfolio-compliance.js",
"scripts": {
"check": "node --check src/grant-portfolio-compliance.js && node --check scripts/demo.js && node --check scripts/build-demo-gif.js && node --check test/grant-portfolio-compliance.test.js",
"test": "node --test test/*.test.js",
"demo": "node scripts/demo.js",
"demo:gif": "node scripts/build-demo-gif.js"
},
"keywords": [
"enterprise",
"grants",
"compliance",
"funder-mandates",
"research-operations"
],
"license": "MIT"
}
Loading