From 064f22d84eac1d44256bdcdfc256bec5a0ed2e49 Mon Sep 17 00:00:00 2001 From: Pranav Bhave <90584946+Cubits11@users.noreply.github.com> Date: Wed, 1 Jul 2026 16:50:24 -0400 Subject: [PATCH 1/3] docs: add community health files --- .github/ISSUE_TEMPLATE/bug_report.yml | 34 +++++ .github/ISSUE_TEMPLATE/feature_request.yml | 35 ++++++ .github/ISSUE_TEMPLATE/research_question.yml | 33 +++++ .github/PULL_REQUEST_TEMPLATE.md | 18 +++ CODE_OF_CONDUCT.md | 125 +++++++++++++++++++ CONTRIBUTING.md | 65 ++++++++++ SECURITY.md | 33 +++++ 7 files changed, 343 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/research_question.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..721104a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,34 @@ +name: Bug report +description: Something in cc-framework is not behaving as documented. +title: "[bug]: " +labels: ["bug"] +body: + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Describe the observed behavior and what you expected instead. + validations: + required: true + - type: textarea + id: repro + attributes: + label: Minimal reproduction + description: Include the smallest script, command, or dataset slice that reproduces the issue. + render: python + validations: + required: true + - type: input + id: version + attributes: + label: cc-framework version / commit + placeholder: "0.3.0-rc1 or git SHA" + validations: + required: true + - type: textarea + id: env + attributes: + label: Environment + description: Python version, OS, install command, and relevant dependency versions. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..3a770b2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,35 @@ +name: Feature request +description: Propose a focused addition or improvement. +title: "[feature]: " +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: Problem or workflow + description: What are you trying to do that cc-framework does not support well today? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed change + description: Describe the smallest useful change and where it might live. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Existing APIs, workarounds, or designs you have tried. + validations: + required: false + - type: checkboxes + id: compatibility + attributes: + label: Compatibility checks + options: + - label: This does not require deployment approval claims. + required: true + - label: This does not collide with the `Claim` envelope schema or established module namespaces. + required: true diff --git a/.github/ISSUE_TEMPLATE/research_question.yml b/.github/ISSUE_TEMPLATE/research_question.yml new file mode 100644 index 0000000..814da59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/research_question.yml @@ -0,0 +1,33 @@ +name: Research question +description: Ask about the methodology, assumptions, or interpretation. +title: "[research]: " +labels: ["research-question"] +body: + - type: textarea + id: question + attributes: + label: Question + description: What part of the methodology, assumption set, bound, or interpretation is unclear? + validations: + required: true + - type: textarea + id: context + attributes: + label: Context + description: Link to the theorem, README section, code path, paper note, or example you are reading. + validations: + required: true + - type: textarea + id: attempted + attributes: + label: What you have already checked + description: Mention related docs, examples, or commands you ran. + validations: + required: false + - type: checkboxes + id: claim-discipline + attributes: + label: Claim discipline + options: + - label: I understand cc-framework bounds what the available evidence supports under stated assumptions; it does not certify a system is safe. + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a1064dc --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +## What changed + +## Why + +## Verification performed + +- [ ] `make test-kernel` passes +- [ ] `make test-release` passes +- [ ] New/changed public API has a docstring and a working example + +## Compatibility check + +- [ ] No naming collision with the existing `Claim` envelope schema or other module namespaces +- [ ] No breaking change to public API without a version-bump note + +## Definition of Done reference + +Which item(s) from the Launch-Hardening Plan does this satisfy? diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..a740636 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,125 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances + of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for +moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement through the +maintainer contact listed on the Cubits11 GitHub profile. All complaints will +be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 2.1, +available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. + +Community Impact Guidelines were inspired by Mozilla's code of conduct +enforcement ladder. + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..164a312 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# Contributing to CC-Framework + +Thanks for helping make CC-Framework easier to inspect, reproduce, and use. +This repository is research software, so contributions should keep claims +narrow: the package bounds what available evidence supports under stated +assumptions; it does not certify that a stacked system is safe. + +## Development setup + +Use Python 3.10 or newer. Python 3.12 is the primary local development target +in the current Makefile. + +```bash +python -m venv .venv +source .venv/bin/activate +python -m pip install -e ".[dev]" +``` + +Before opening a pull request, run the release-facing checks: + +```bash +make test-kernel +make test-release +``` + +As verified on 2026-07-01, `make test-kernel` runs the kernel unit tests, +strict mypy on `src/cc/kernel`, and ruff checks for the kernel surface. +`make test-release` runs that same gate plus the minimal bounds example and +release artifact integration tests. + +## Coding standards + +- Prefer the existing public kernel surface in `cc.kernel.strict` for + documentation and examples. +- Keep statistical claims tied to assumptions, evidence, and tests that are + checked in this repository. +- Add or update tests for changes to bound computation, witness construction, + metrics, serialization, or adapter behavior. +- Keep generated artifacts out of commits unless the file is explicitly part of + a documented release, paper, or launch asset. +- Do not introduce public language that implies deployment approval. + +## Pull request process + +1. Keep the PR focused on one reviewable change. +2. Include the commands you ran and their actual outcome. +3. Link any related issue or design note. +4. Call out compatibility risks, especially public API, schema, or artifact + format changes. +5. Wait for maintainer review before merge. + +## Adding a guardrail adapter + +Adapters should live under `src/cc/adapters/` unless an established module gives +a more specific home. A new adapter should include: + +- a small, typed interface that records per-item pass/fail outcomes; +- tests covering success, failure, malformed input, and empty input; +- a README or example if the adapter depends on a third-party tool; +- clear mapping from the external tool's result model to the repository + convention that `Z_i = 1` means guardrail failure / unsafe pass. + +Do not choose adapter names that collide with the existing `Claim` envelope +schema or other established module namespaces. If a proposed name is close to a +core schema, open a design issue before implementing it. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..49f5ac6 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,33 @@ +# Security Policy + +## Reporting a vulnerability + +Please do not report security vulnerabilities through public GitHub issues. + +If GitHub private vulnerability reporting is enabled for this repository, use +the repository's **Security** tab to open a private report. If that option is +not available, contact the maintainer through the public contact method listed +on the Cubits11 GitHub profile and include: + +- the affected commit, release, or package version; +- a minimal reproduction or proof of concept; +- expected impact and affected workflows; +- whether the vulnerability is already public. + +You should receive an initial acknowledgement within 7 days. The maintainer +will coordinate next steps, remediation, and disclosure timing based on impact. + +## Scope + +Security reports are appropriate for vulnerabilities in repository code, +release artifacts, example workflows, or integrity/audit evidence handling. + +Methodology questions, statistical disagreements, documentation issues, and +general feature requests should use the normal issue templates instead. + +## Current automation status + +Private vulnerability reporting could not be verified or enabled from the +2026-07-01 Codex hardening session because the local environment did not have +an authenticated GitHub CLI or token. A repository admin should verify this in +GitHub settings before launch. From 2af3edff4dd6013e7c5995b70e95fff14bfcec20 Mon Sep 17 00:00:00 2001 From: Pranav Bhave <90584946+Cubits11@users.noreply.github.com> Date: Wed, 1 Jul 2026 16:52:01 -0400 Subject: [PATCH 2/3] docs: clarify README and citation metadata --- CITATION.cff | 28 ++++++++++++++++++++++++++++ README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..27d0c81 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,28 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it using the metadata below." +title: "cc-framework" +abstract: > + Dependence-aware composition of AI guardrails: statistical bounds + (Frechet-Hoeffding), two-world evaluation protocols, and tamper-evident + audit evidence for stacked guardrail systems. This metadata does not imply + that the software certifies a system as safe; it bounds what the available + evidence supports under stated assumptions. +type: software +version: "0.3.0-rc1" +# date-released must be set to the actual release publication date. +# date-released: "YYYY-MM-DD" +# Drafted from git history for human confirmation before release. +authors: + - family-names: "Bhave" + given-names: "Pranav" +license: "MIT" +repository-code: "https://github.com/Cubits11/cc-framework" +keywords: + - ai-safety + - guardrails + - dependence-modeling + - uncertainty-quantification + - model-evaluation +# identifiers: +# - type: doi +# value: "10.5281/zenodo.XXXXXXX" diff --git a/README.md b/README.md index 487290f..63a3334 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,54 @@ # CC-Framework -**Sharp partial-identification bounds for composed AI guardrail failures under unknown dependence.** +**Dependence-aware composition of AI guardrails: Frechet-Hoeffding bounds on +stacked-system failure, not a safety certification.** [![CI](https://github.com/Cubits11/cc-framework/actions/workflows/ci.yml/badge.svg)](https://github.com/Cubits11/cc-framework/actions/workflows/ci.yml) [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -![Status](https://img.shields.io/badge/status-research%20prototype-orange) + + -CC-Framework is research software for dependence-aware partial identification -of composed AI guardrail failures. It asks what a composed guardrail evaluation -actually identifies when singleton failure rates are observed but the joint -dependence structure is unknown or only partially constrained. +CC-Framework computes what available guardrail evidence supports under stated +dependence assumptions. It does not certify that a stacked system is safe. + +## 60-second quickstart + +```bash +python -m venv .venv +source .venv/bin/activate +python -m pip install -e ".[stats]" +python - <<'PY' +from cc.kernel.strict import frechet_bounds + +failure_rates = { + "input_filter": 0.10, + "policy_judge": 0.10, +} +bounds = frechet_bounds(list(failure_rates.values()), event="and") +independent = failure_rates["input_filter"] * failure_rates["policy_judge"] + +print(f"Stacked failure is bounded by [{bounds.lower:.2%}, {bounds.upper:.2%}]") +print(f"Independence would estimate {independent:.2%}") +PY +``` + +Expected output: + +```text +Stacked failure is bounded by [0.00%, 10.00%] +Independence would estimate 1.00% +``` + +For deeper context, start with the +[validation matrix](docs/validation_matrix.md), the +[finite-sample identification note](docs/theory/finite_sample_identification.md), +and the runnable [minimal example](examples/minimal/run_bounds.py). + +If you use this software, cite it with the metadata in +[CITATION.cff](CITATION.cff). Contributions should follow +[CONTRIBUTING.md](CONTRIBUTING.md). GitHub Discussions can be enabled from the +repository settings before launch. ## Research Status From ad6da1a4e311c579a9b907fb7218d97eb99292df Mon Sep 17 00:00:00 2001 From: Pranav Bhave <90584946+Cubits11@users.noreply.github.com> Date: Wed, 1 Jul 2026 16:57:25 -0400 Subject: [PATCH 3/3] docs: add launch social preview asset --- docs/assets/social-preview.png | Bin 0 -> 14380 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/social-preview.png diff --git a/docs/assets/social-preview.png b/docs/assets/social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..b56e5d6afdc25efe710cb7792688ce2a103a5906 GIT binary patch literal 14380 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

&~Bz6 zVWu|zsRaA-V1_ZDI6cK8QoA!#A3cUo@2GBkOjFUWFxX}}bhliG<>B?|Wbx>P!`cw% zx-Xs8R-wq#ypA2dQ27I=MZ6=%ofa_Gvu(Wcv1I$#Ts%J`L{swbORuSf3pVxSl~jn+ zMrzsE=ux9U-O7MYE=A7dO92#FnoJ~ry}{7#IWZz^}>Y;OFrf}5vg}9$XslK zbW>mX$J@%9q`*<_QqIP6glCX@_gfvQ2HW{9!)jqpw@RzcK|(m|sagqLGZ~0TI5Svy zuv7*bNWvtL(dx5k^PB1PuN`8pRo*K#2%}6ekCfxLc^!I(GJt@hwp0#1a@?#XiDIUV zJA+`<=zYT$uJ68$CziectJ*Qe)q$=HDPR@8mY53R*pOM%%$WFRNxg!U&I7-Ue*KJ8 zRH#45)0VxX3d;Fo(GAWpV^pR7lsz7#ge1-0^g(>eSM1z(vS2N({t;&2~A7QvDwX0rY8i5I6yHXjE z^c(x%av&*Xx>hrLEjpAdm_Tf3CVm_ff5G|}(z$;4qDsfIRUOksPAPNupM78n?%n*- zXY05<6Lq^+&+Xercix>Vn0J@nUYE{0X}qWQZ?oqh-W%pXoo+dM*W+2Df0~A0Twh!& zdPnqB-GPawkMJt8>({!ul`@)WZGsPd13zt{T-6Jts>z+aXV1**zw#2>?3nZmN7yUAI*PyV>G@`hboRw9?Ti}yG{}Mv6a^@P9#{&YIW3MZ15MJY5!E(NIiT0YiIqT;w;g!8p(C-CjQQyHE zUx7&_Tc%Fc2yeDR<#NjM?MN+O#hLo_T*KU7A3TS9e&w1J)yLsgW)-#e*VE@~_BNb8 zwv!*4K8|yo#*g8nMjf0Yd{r3C=W=EOE7IKr|KNd|FapNRxaH+Pjo~4&x+HB40?l-C z4Cf6PO6)(5zX@I(P*sVwCpr6{7FK^xYuKixF!e&5I_Z9JDyMW-;fC;Su-izt>Otml z8KgY9)#0}=(44yIHLoiT4s|i}_e2pQArn_P{N=looiyw#P;j;31sRFtghtdw7 z_1E797ze;C z@jI2kWSr#|>s4VI+_EEsrQ0zCVSbA^3q`m1Q`2Ys@LyVtM~Stdg`ElO65VHyA2}6PtNjyg4Lg z&J$WhaP@GW#bq*A-^h;yLu))@nb&HByz1mjrIS-Ee+{<;4Xw)W3_-$k(vPj<%>=Y; zpL$BPGY;2Jevyk^Q6#>A$%fTqGtyYR&h+MXX@<#+P;`@gcBfFEicyVJkWQgXiuaE3 z>09U2uay2!0M>M~T}$v94SY>AcOA=Q?v4Mv;H6wU>YyXL$lF^myIT@Z8qIZVc$BFJ z4wH&db}s)miRU5%l=*#YPkT4IZR3~HqO2xBCoP_=^-EE znDn9x{q~VW#fU(ZPE7o8wW<(FsUF_*8h+|uU~I0&EnEoT)aNE-ZfbMqU&g9QixaoG z`bTkDfgREDT5>V6o|#}_fr9*SwY-EqA_qum_DN&>Y}fP#Ux0m{|9O9|9hnO{P&b_ X)*|ZKS(~=M+DS>szb$)X5b(bMMLj!; literal 0 HcmV?d00001