{
  "_id": "6a59f28f09eb0996dd68fcbe",
  "Package": "regulog",
  "Title": "Tamper-Evident Audit Logging for Regulated Environments",
  "Version": "0.2.1",
  "Authors@R": "person(\"Ndoh\", \"Penn\", email = \"ndohpenn9@gmail.com\", role = c(\"aut\", \"cre\"),\ncomment = c(ORCID = \"0009-0003-9054-465X\"))",
  "Description": "Provides tamper-evident, hash-chained audit logging for\nanalytical applications. Every log entry is linked via an\n'SHA-256' hash to its predecessor, making insertions,\ndeletions, and modifications detectable. Covers user\nattribution, timestamp integrity, mandatory reason capture,\nchain verification, structured export, and 'shiny' session\ninstrumentation. For more details see\n<https://reprostats.org/regulog/>. Suitable for any context\nwhere accountability and traceability matter: regulated\nenvironments (21 CFR Part 11, EU Annex 11), internal tooling,\ndata pipelines, and multi-user 'shiny' applications. Ships with\noptional qualification scripts (IQ, OQ, PQ) for use in\nvalidated computerised systems.",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Language": "en-GB",
  "Roxygen": "list(markdown = TRUE)",
  "RoxygenNote": "7.3.3",
  "Config/testthat/edition": "3",
  "Config/Needs/website": "dplyr, ggplot2, tidyr",
  "VignetteBuilder": "knitr",
  "URL": "https://reprostats.org/regulog/,\nhttps://github.com/repro-stats/regulog",
  "BugReports": "https://github.com/repro-stats/regulog/issues",
  "Repository": "https://repro-stats.r-universe.dev",
  "Date/Publication": "2026-07-07 13:55:55 UTC",
  "RemoteUrl": "https://github.com/repro-stats/regulog",
  "RemoteRef": "HEAD",
  "RemoteSha": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-07-17 09:10:44 UTC",
    "User": "root"
  },
  "Author": "Ndoh Penn [aut, cre] (ORCID: <https://orcid.org/0009-0003-9054-465X>)",
  "Maintainer": "Ndoh Penn <ndohpenn9@gmail.com>",
  "_user": "repro-stats",
  "_type": "src",
  "_file": "regulog_0.2.1.tar.gz",
  "_fileid": "https://r2.ropensci.org/b2ba159a3f85bb5da89e3e4d60ecbd22efb920182007efda63d720f2dcff1414",
  "_filesize": 781331,
  "_sha256": "b2ba159a3f85bb5da89e3e4d60ecbd22efb920182007efda63d720f2dcff1414",
  "_expires": "2026-10-25T09:14:53.000Z",
  "_created": "2026-07-17T09:10:44.000Z",
  "_published": "2026-07-17T09:14:55.449Z",
  "_jobs": [
    {
      "job": 87848275639,
      "time": 138,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "8402347431"
    },
    {
      "job": 87848275642,
      "time": 138,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8402347289"
    },
    {
      "job": 87848275653,
      "time": 129,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "8402336891"
    },
    {
      "job": 87848275669,
      "time": 210,
      "config": "macos-release-arm64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8402356818"
    },
    {
      "job": 87847439871,
      "time": 263,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8402291908"
    },
    {
      "job": 87848275598,
      "time": 117,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "8402339551"
    },
    {
      "job": 87848275650,
      "time": 95,
      "config": "windows-devel",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "8402331074"
    },
    {
      "job": 87848275623,
      "time": 72,
      "config": "windows-oldrel",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "8402322164"
    },
    {
      "job": 87848275721,
      "time": 63,
      "config": "windows-release",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8402318426"
    }
  ],
  "_host": "GitHub-Actions",
  "_buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045",
  "_status": "success",
  "_upstream": "https://github.com/repro-stats/regulog",
  "_commit": {
    "id": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
    "author": "ndohpenngit <ndohpenn9@gmail.com>",
    "committer": "ndohpenngit <ndohpenn9@gmail.com>",
    "message": "fix: address CRAN reviewer feedback (resubmission 0.2.1)\n\n- Remove 'for R' from description field\n- Package names in single quotes: 'shiny', 'SHA-256'\n- \\dontrun{} -> if(interactive()){} in shiny.R examples\n",
    "time": 1783432555
  },
  "_maintainer": {
    "name": "Ndoh Penn",
    "email": "ndohpenn9@gmail.com",
    "login": "ndohpenngit",
    "linkedin": "in/ndohpenn",
    "orcid": "0009-0003-9054-465X",
    "description": "Statistician | R enthusiast",
    "uuid": 55984177
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "digest",
      "role": "Imports"
    },
    {
      "package": "jsonlite",
      "role": "Imports"
    },
    {
      "package": "utils",
      "role": "Imports"
    },
    {
      "package": "covr",
      "role": "Suggests"
    },
    {
      "package": "dplyr",
      "role": "Suggests"
    },
    {
      "package": "ggplot2",
      "role": "Suggests"
    },
    {
      "package": "haven",
      "role": "Suggests"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "readr",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "shiny",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "tidyr",
      "role": "Suggests"
    },
    {
      "package": "withr",
      "role": "Suggests"
    }
  ],
  "_owner": "repro-stats",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-25",
      "n": 20
    },
    {
      "week": "2026-26",
      "n": 5
    },
    {
      "week": "2026-27",
      "n": 21
    },
    {
      "week": "2026-28",
      "n": 1
    }
  ],
  "_tags": [
    {
      "name": "v0.2.0",
      "date": "2026-06-24"
    },
    {
      "name": "v0.2.1",
      "date": "2026-07-07"
    }
  ],
  "_topics": [
    "21-cfr-part-11",
    "audit-log",
    "gxp",
    "hash-chain",
    "reproducibility",
    "shiny",
    "temper-evident",
    "validated-systems"
  ],
  "_stars": 1,
  "_contributors": [
    {
      "user": "ndohpenngit",
      "count": 40,
      "uuid": 55984177
    }
  ],
  "_userbio": {
    "uuid": 290093114,
    "type": "organization",
    "name": "reprostats",
    "followers": 1,
    "description": "Open-source R tools for reproducibility and audit logging"
  },
  "_downloads": {
    "count": 0,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/regulog"
  },
  "_devurl": "https://github.com/repro-stats/regulog",
  "_pkgdown": "https://reprostats.org/regulog/",
  "_searchresults": 0,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "extra/regulog.html",
    "LICENSE",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/repro-stats/regulog",
  "_realowner": "repro-stats",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.2.1",
      "date": "2026-07-16"
    }
  ],
  "_exports": [
    "export_audit_trail",
    "filter_log",
    "log_action",
    "log_change",
    "log_note",
    "log_signature",
    "regulog_init",
    "regulog_observer",
    "regulog_shiny_init",
    "rl_read",
    "verify_log",
    "with_log"
  ],
  "_help": [
    {
      "page": "regulog-package",
      "title": "regulog: Tamper-Evident Audit Logging for R",
      "topics": [
        "regulog-package",
        "regulog"
      ]
    },
    {
      "page": "as.data.frame.regulog",
      "title": "Convert a regulog object to a data frame",
      "topics": [
        "as.data.frame.regulog"
      ]
    },
    {
      "page": "export_audit_trail",
      "title": "Export the audit trail",
      "topics": [
        "export_audit_trail"
      ]
    },
    {
      "page": "filter_log",
      "title": "Filter audit log entries",
      "topics": [
        "filter_log"
      ]
    },
    {
      "page": "log_action",
      "title": "Log a discrete action in the audit trail",
      "topics": [
        "log_action"
      ]
    },
    {
      "page": "log_change",
      "title": "Log a before/after field change in the audit trail",
      "topics": [
        "log_change"
      ]
    },
    {
      "page": "log_note",
      "title": "Log a free-text note in the audit trail",
      "topics": [
        "log_note"
      ]
    },
    {
      "page": "log_signature",
      "title": "Apply an electronic signature to the audit trail",
      "topics": [
        "log_signature"
      ]
    },
    {
      "page": "regulog_init",
      "title": "Initialise a regulog audit log session",
      "topics": [
        "regulog_init"
      ]
    },
    {
      "page": "regulog_observer",
      "title": "Create a logging observer for a reactive Shiny input",
      "topics": [
        "regulog_observer"
      ]
    },
    {
      "page": "regulog_shiny_init",
      "title": "Initialise a regulog session inside a Shiny server",
      "topics": [
        "regulog_shiny_init"
      ]
    },
    {
      "page": "rl_read",
      "title": "Log a data read operation",
      "topics": [
        "rl_read"
      ]
    },
    {
      "page": "verify_log",
      "title": "Verify the integrity of an audit log chain",
      "topics": [
        "verify_log"
      ]
    },
    {
      "page": "with_log",
      "title": "Run an expression with automatic data read logging",
      "topics": [
        "with_log"
      ]
    }
  ],
  "_pkglogo": "https://github.com/repro-stats/regulog/raw/HEAD/man/figures/logo.png",
  "_readme": "https://github.com/repro-stats/regulog/raw/HEAD/README.md",
  "_rundeps": [
    "digest",
    "jsonlite"
  ],
  "_vignettes": [
    {
      "source": "getting-started.Rmd",
      "filename": "getting-started.html",
      "title": "Getting started with regulog",
      "engine": "knitr::rmarkdown",
      "headings": [
        "1. Initialise a session",
        "2. Log actions",
        "3. Log field changes",
        "4. Log notes and decisions",
        "5. Logging data reads",
        "Single reads with rl_read()",
        "Scoped logging with with_log()",
        "6. Electronic signatures",
        "7. Verify chain integrity",
        "8. Query the log",
        "9. Convert to data frame",
        "10. Export the audit trail",
        "11. Entry type reference",
        "12. Validation (regulated environments)",
        "Running the protocols",
        "Capturing the qualification record",
        "Requirements traceability",
        "Logging the qualification itself",
        "Re-qualification"
      ],
      "created": "2026-06-19 08:16:06",
      "modified": "2026-07-01 19:53:03",
      "commits": 5
    },
    {
      "source": "shiny-integration.Rmd",
      "filename": "shiny-integration.html",
      "title": "Shiny integration",
      "engine": "knitr::rmarkdown",
      "headings": [
        "1. Basic pattern",
        "2. User resolution",
        "3. Session lifecycle events",
        "4. Using regulog_observer()",
        "5. Notes and decisions from Shiny",
        "6. Logging data changes from Shiny",
        "7. Electronic signatures from Shiny",
        "8. Download handler for the audit trail",
        "9. Per-session vs shared log",
        "Per-session (default)",
        "Shared log across users",
        "10. Querying and verifying from outside the app",
        "11. Logging data reads from Shiny",
        "12. Complete minimal example"
      ],
      "created": "2026-06-19 08:16:06",
      "modified": "2026-07-01 15:45:25",
      "commits": 5
    },
    {
      "source": "hash-chain.Rmd",
      "filename": "hash-chain.html",
      "title": "The hash chain: how tamper detection works",
      "engine": "knitr::rmarkdown",
      "headings": [
        "1. The genesis record",
        "2. How entries are hashed",
        "3. Verification",
        "4. What tampering looks like",
        "4a. Modifying an entry's content",
        "4b. Deleting an entry",
        "4c. Breaking the prev_hash directly",
        "5. What the chain does NOT protect against",
        "6. Verifying a file without a live session",
        "7. Working with persistent .rlog files",
        "8. The NDJSON format",
        "9. Archival and long-term storage",
        "10. Hash algorithm"
      ],
      "created": "2026-06-24 10:07:28",
      "modified": "2026-06-30 12:16:33",
      "commits": 2
    }
  ],
  "_score": 4.778151250383644,
  "_indexed": true,
  "_nocasepkg": "regulog",
  "_universes": [
    "repro-stats",
    "ndohpenngit"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.2.1",
      "date": "2026-07-17T09:13:11.000Z",
      "distro": "resolute",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/528d23943cc9c48b4fb887e7ccd24c2ecb32ddd4dde49ac93fbc6ac46f847df5",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "0.2.1",
      "date": "2026-07-17T09:13:10.000Z",
      "distro": "resolute",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/38de0637b032a0dd3e330a9b0a1c08a6846c01aaa1a39b0fc29f62d2b2c54f91",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.2.1",
      "date": "2026-07-17T09:12:46.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/b30398d4278a77ad5ddfc0c4980ef8b334fdf364eb4e3b2160b74671cd7a1374",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.6.1",
      "os": "mac",
      "version": "0.2.1",
      "date": "2026-07-17T09:13:27.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/9781c4792879e4204c5c20b114bd59e9e67c1de9523afd17dbd9ee19d1984fd8",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.2.1",
      "date": "2026-07-17T09:13:03.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/a0a835174bf9eb152db3bd7d71bee02cdfb5dd854ec59c640558f2af1436fb9a",
      "status": "success",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.2.1",
      "date": "2026-07-17T09:12:20.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/2cbc16a929a7e7f6f47a6dfe30f939ab2dcd09b461ca4bd1d436c87e96c8bff7",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.2.1",
      "date": "2026-07-17T09:11:59.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/86c867a7704dedcf33cc649ffedc2796e1f0388fc3de82a9a50d425748f1e219",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    },
    {
      "r": "4.6.1",
      "os": "win",
      "version": "0.2.1",
      "date": "2026-07-17T09:11:52.000Z",
      "commit": "9eee2c0c45e5fd93a7a803d3d8b30794e60c66f9",
      "fileid": "https://r2.ropensci.org/50284387d6503dda22d3dd57cea4e35070602b4456ee08b840171a86f00dd218",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/repro-stats/actions/runs/29568777045"
    }
  ]
}