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
20 changes: 11 additions & 9 deletions docs/compliance/control-objectives.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,29 @@
# The SEC column is omitted throughout (it covers disclosure, which none of
# these controls evidence).

# The branch-protection `claim` is verbatim from the step 0 measurement
# (Factory#943), repeated on every control whose enforcement relies on required
# status checks (the policy.tier.* and gate.* controls).
# The branch-protection `claim` comes from the step 0 measurement
# (2026-10-07, Factory#943) as updated by #943's decision (enforce_admins on
# main, applied 2026-10-22, re-read 2026-11-07, AIFactory#2014). It is repeated
# on every control whose enforcement relies on required status checks (the
# policy.tier.* and gate.* controls).

[controls."policy.tier.low"]
objective = "A low-tier change auto-merges only when host CI is green, TFactory passed, the achieved VAL meets the floor and CI parity holds; otherwise it is held for async review."
evidence = "apps/backend/merge/merge_policy.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "SOX ITGC change management", "NIST 800-53 CM"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."policy.tier.medium"]
objective = "A medium-tier change is never auto-merged; it is always held for asynchronous human review."
evidence = "apps/backend/merge/merge_policy.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "SOX ITGC change management", "NIST 800-53 CM"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."policy.tier.hard"]
objective = "A hard-tier change is never auto-merged; it is held for blocking human approval, which separates the author from the approver."
evidence = "apps/backend/merge/merge_policy.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "SOX ITGC change management", "SOX ITGC segregation of duties", "NYDFS 500.3", "NIST 800-53 CM"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."policy.overlay"]
objective = "A high-risk or production deployment block, or an unsatisfied required system gate, holds the change for blocking approval before the tier is consulted; it can only tighten the decision."
Expand Down Expand Up @@ -81,19 +83,19 @@ claim = "Accepted residual risks (#1671): non-Claude runners and the GitHub MCP
objective = "The merge decision itself is deterministic: its own import closure reaches no model client."
evidence = "apps/backend/merge/merge_policy.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "NIST 800-53 CM"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."gate.server.services.pr_review_service"]
objective = "The review that feeds the merge verdict is model-assisted, and the page says so; it runs as a spawned runner whose model clients are found by following the declared spawn edge."
evidence = "apps/web-server/server/services/pr_review_service.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "NIST 800-53 SA", "NIST 800-53 RA"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."gate.server.services.pr_endgame"]
objective = "The endgame that applies the merge decision imports model clients; the review verdict it consumes is injected, not computed there."
evidence = "apps/web-server/server/services/pr_endgame.py"
frameworks = ["ISO 27001:2022 A.8.32", "SOC 2 CC8.1", "NIST 800-53 SA", "NIST 800-53 RA"]
claim = "Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943)."
claim = "Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it."

[controls."sandbox.git_config_pins"]
objective = "Every child process the server spawns, and the web terminal, runs git with command-scope pins that override the repo config keys an agent could use to run a program (hooks, fsmonitor, ext transport, ssh, pager, editor, askpass, credential helper, sequence editor)."
Expand Down
12 changes: 6 additions & 6 deletions docs/docs/compliance/autonomy-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,14 @@ Declared, unverified (cross-repo, not probed):

| control | objective | frameworks | evidence | claim |
|---|---|---|---|---|
| `gate.merge.merge_policy` | The merge decision itself is deterministic: its own import closure reaches no model client. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `gate.server.services.pr_endgame` | The endgame that applies the merge decision imports model clients; the review verdict it consumes is injected, not computed there. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 SA; NIST 800-53 RA | `apps/web-server/server/services/pr_endgame.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `gate.server.services.pr_review_service` | The review that feeds the merge verdict is model-assisted, and the page says so; it runs as a spawned runner whose model clients are found by following the declared spawn edge. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 SA; NIST 800-53 RA | `apps/web-server/server/services/pr_review_service.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `gate.merge.merge_policy` | The merge decision itself is deterministic: its own import closure reaches no model client. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `gate.server.services.pr_endgame` | The endgame that applies the merge decision imports model clients; the review verdict it consumes is injected, not computed there. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 SA; NIST 800-53 RA | `apps/web-server/server/services/pr_endgame.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `gate.server.services.pr_review_service` | The review that feeds the merge verdict is model-assisted, and the page says so; it runs as a spawned runner whose model clients are found by following the declared spawn edge. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 SA; NIST 800-53 RA | `apps/web-server/server/services/pr_review_service.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `policy.overlay` | A high-risk or production deployment block, or an unsatisfied required system gate, holds the change for blocking approval before the tier is consulted; it can only tighten the decision. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; SOX ITGC segregation of duties; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | - |
| `policy.path_floor` | A change touching auth, secrets, migrations, infrastructure or CI paths is floored at blocking review, so a change cannot declare itself routine. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; NIST 800-53 CM | `apps/backend/review_tier.py` | - |
| `policy.tier.hard` | A hard-tier change is never auto-merged; it is held for blocking human approval, which separates the author from the approver. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; SOX ITGC segregation of duties; NYDFS 500.3; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `policy.tier.low` | A low-tier change auto-merges only when host CI is green, TFactory passed, the achieved VAL meets the floor and CI parity holds; otherwise it is held for async review. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `policy.tier.medium` | A medium-tier change is never auto-merged; it is always held for asynchronous human review. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection for non-admin merges; the fleet's merge paths do not use admin bypass, but GitHub does not prevent it while enforce_admins is false (measured 2026-10-07, Factory#943). |
| `policy.tier.hard` | A hard-tier change is never auto-merged; it is held for blocking human approval, which separates the author from the approver. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; SOX ITGC segregation of duties; NYDFS 500.3; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `policy.tier.low` | A low-tier change auto-merges only when host CI is green, TFactory passed, the achieved VAL meets the floor and CI parity holds; otherwise it is held for async review. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `policy.tier.medium` | A medium-tier change is never auto-merged; it is always held for asynchronous human review. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; SOX ITGC change management; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | Enforced by branch protection. enforce_admins is on for main in AIFactory, PFactory, TFactory, CFactory and Factory (applied 2026-10-22, re-read 2026-11-07, Factory#943), so there the required checks bind admins too. It is off on every dev branch and on factory-gitops main, where the checks bind non-admin merges only: the fleet's merge paths do not use admin bypass, but GitHub does not prevent it. |
| `policy.val_floor` | A change whose achieved Verification Assurance Level is missing or below its declared floor is not auto-merged, and an unreadable floor fails closed. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 CM | `apps/backend/merge/merge_policy.py` | - |
| `sandbox.git_config_pins` | Every child process the server spawns, and the web terminal, runs git with command-scope pins that override the repo config keys an agent could use to run a program (hooks, fsmonitor, ext transport, ssh, pager, editor, askpass, credential helper, sequence editor). | ISO 27001:2022 A.8.28; SOC 2 CC6.8; NIST 800-53 SI | `apps/backend/core/child_env.py` | - |
| `wiring.auto_merge_flag` | Auto-merge is off by default and is enabled only by an explicit per-project or per-deployment setting. | ISO 27001:2022 A.8.32; SOC 2 CC8.1; NIST 800-53 CM | `apps/web-server/server/services/pr_endgame.py` | - |
Expand Down
Loading
Loading