Skip to content
Merged
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: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ jobs:
needs: packages
if: needs.packages.outputs.code == 'true'
runs-on: ubuntu-latest
timeout-minutes: 9
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand Down
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,9 @@ allowance is 16 MiB. This does not bound native graph allocation.
the mandatory gates below. Private documentation compilation requires explicit
--trust-docs on each invocation, accepting arbitrary build-script and
procedural-macro effects without a sandbox guarantee.
- **CI budget.** Every job has a nine-minute execution budget, reserving headroom
below the ten-minute job ceiling. Source, fixture,
- **CI budget.** Every job has a nine-minute execution budget, and the hosted
`test-release` job has fifteen minutes; the workflow gate refuses any job
budget above fifteen minutes. Source, fixture,
capability-document and build changes select every workspace package; unrelated
text changes retain root repository gates. Compiler and harness lint jobs apply
to source and asset changes. Licensing and both dependency-policy graphs are
Expand Down
18 changes: 9 additions & 9 deletions docs/capabilities/repository-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ bindings:
- rust_agentic_foundations::test_crate::repo_gates::runtime::no_shipped_crate_depends_on_the_fixture_crate_outside_its_dev_dependencies
- rust_agentic_foundations::test_crate::repo_gates::runtime::a_fixture_dependency_is_refused_outside_dev_dependencies_beside_the_accepted_forms
- cargo_workplan::test_crate::verify::verify_prints_static_results_without_git_or_consumer_execution
- rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_ten_minute_ceiling
- rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_execution_budget
- rust_agentic_foundations::tests::the_absent_gate_root_uses_the_manifest_directory
- rust_agentic_foundations::tests::an_explicit_gate_root_is_used_without_falling_back
- raf_workplan::test_crate::history::a_fixture_commit_obeys_an_installed_hook_and_the_successful_neighbor
Expand Down Expand Up @@ -156,7 +156,7 @@ outside `[dev-dependencies]` unless it declares `publish = false`.
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::runtime::runtime_analysis_libraries_have_no_process_authority,rust_agentic_foundations::test_crate::repo_gates::runtime::runtime_refuses_launches_aliases_and_hidden_macro_paths,rust_agentic_foundations::test_crate::repo_gates::runtime::no_shipped_crate_depends_on_the_fixture_crate_outside_its_dev_dependencies,rust_agentic_foundations::test_crate::repo_gates::runtime::a_fixture_dependency_is_refused_outside_dev_dependencies_beside_the_accepted_forms -->

**Bounded CI.** Every workflow job declares an integer `timeout-minutes` from
one through nine, reserving execution headroom below a ten-minute job ceiling.
one through fifteen. Ordinary jobs declare nine minutes; the hosted test-release job declares fifteen.
Missing, dynamic, zero and excessive values refuse the native
YAML policy gate. The package matrix comes from Cargo's complete workspace
inventory. Source, fixture, capability-document, change-record and build inputs
Expand All @@ -165,7 +165,7 @@ gates. Compiler, release, MSRV and harness lint checks apply to source and
asset changes. File licensing and dependency policy run for every change, with
both the root and independent fuzz dependency graphs checked. Aggregate test
and harness-policy results require their applicable jobs to succeed.
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_ten_minute_ceiling -->
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_execution_budget -->

**Binding validation.** The self-workplan gate validates source bindings and the complete static document model. Consumer tests, examples and doctests are never executed by RAF. Verification prints declarations and static findings; completion uses a prospective document overlay and owned data writes. Maintainer-controlled RAF checks use explicitly controlled fixtures and never grant inspected source execution authority.
<!-- raf:tested-by rust_agentic_foundations::test_crate::self_workplan::repository_workplan_is_clean_and_assessed,cargo_workplan::test_crate::verify::verify_prints_static_results_without_git_or_consumer_execution -->
Expand Down Expand Up @@ -276,11 +276,11 @@ checks, including the Python refusal. Install the commit and merge hooks with
## Examples

A workflow job with `timeout-minutes: 9` passes the budget rule. Omitting the
property, spelling it as an expression, or giving ten refuses and names the
property, spelling it as an expression, or giving sixteen refuses and names the
job. Adding a workspace member automatically adds it to the source-change test
matrix. A documented example shared by several capabilities has one successful
execution for its package, while every binding still receives native planning.
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_ten_minute_ceiling,rust_agentic_foundations::test_crate::self_workplan::repository_workplan_is_clean_and_assessed -->
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_execution_budget,rust_agentic_foundations::test_crate::self_workplan::repository_workplan_is_clean_and_assessed -->

A clean self-Census accepts the currently adopted groups. Adding another
normal-form-equivalent implementation creates growth and makes the same gate
Expand All @@ -298,9 +298,9 @@ An empty `tools/check.py` or an extensionless script beginning with

## Constraints

Workflow execution budgets must be literal integers from one through nine; an absent,
Workflow execution budgets must be literal integers from one through fifteen; an absent,
dynamic, zero or excessive value refuses the repository gate.
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_ten_minute_ceiling -->
<!-- raf:tested-by rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_execution_budget -->

- Self-Census applies the ordinary native Census normal form and exact debt
ratchet. It does not claim preferred-provider execution or external consumer
Expand All @@ -319,7 +319,7 @@ dynamic, zero or excessive value refuses the repository gate.

## Explanation

CI jobs reserve a minute below their ten-minute ceiling for setup and completion.
CI jobs reserve a minute below their declared budget for setup and completion.
These maintainer-controlled jobs qualify RAF itself; they do not grant RAF
authority to execute an inspected consumer. Capability documents are test inputs,
so their changes select the full repository package matrix.
Expand Down Expand Up @@ -399,7 +399,7 @@ no separate interpretation of the documents or source index.
| `rust_agentic_foundations::test_crate::docs_contract::the_checker_judges_markdown_outside_the_document_directories` | test | [Verification](#verification) |
| `rust_agentic_foundations::test_crate::docs_contract::the_checker_judges_the_documents_through_the_model` | test | [Verification](#verification) |
| `rust_agentic_foundations::test_crate::docs_contract::usage_and_examples_blocks_are_the_crate_doctests` | test | [Contract](#contract) |
| `rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_ten_minute_ceiling` | test | [Contract](#contract), [Examples](#examples), [Constraints](#constraints) |
| `rust_agentic_foundations::test_crate::repo_gates::ci::every_workflow_job_has_an_explicit_execution_budget` | test | [Contract](#contract), [Examples](#examples), [Constraints](#constraints) |
| `rust_agentic_foundations::test_crate::repo_gates::citation_accepts_matching_versions` | test | [Contract](#contract) |
| `rust_agentic_foundations::test_crate::repo_gates::citation_rejects_a_manifest_bump_without_a_matching_citation` | test | [Contract](#contract) |
| `rust_agentic_foundations::test_crate::repo_gates::citation_rejects_a_missing_version` | test | [Verification](#verification) |
Expand Down
12 changes: 6 additions & 6 deletions tests/repo_gates/ci.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-FileCopyrightText: 2026 Blackcat Informatics® Inc. <paudley@blackcatinformatics.ca>
// SPDX-License-Identifier: MIT OR Apache-2.0 OR MulanPSL-2.0

//! Workflow execution budgets reserve headroom below the ten-minute ceiling.
//! Workflow execution budgets reserve headroom below the fifteen-minute ceiling.

use purrdf_lex::{json::Value, yaml};

Expand All @@ -20,23 +20,23 @@ fn excessive_jobs(text: &str) -> Result<Vec<String>, String> {
.as_object()
.and_then(|job| job.get("timeout-minutes"))
.and_then(Value::as_u64);
(!matches!(limit, Some(1..=9))).then(|| {
format!("job {name} must declare timeout-minutes as an integer from one to nine")
(!matches!(limit, Some(1..=15))).then(|| {
format!("job {name} must declare timeout-minutes as an integer from one to fifteen")
})
})
.collect())
}

#[test]
fn every_workflow_job_has_an_explicit_ten_minute_ceiling() {
fn every_workflow_job_has_an_explicit_execution_budget() {
assert_eq!(
excessive_jobs("jobs: {fast: {timeout-minutes: 9}}"),
excessive_jobs("jobs: {fast: {timeout-minutes: 15}}"),
Ok(vec![])
);
for job in [
"{}",
"{timeout-minutes: 0}",
"{timeout-minutes: 10}",
"{timeout-minutes: 16}",
"{timeout-minutes: '${{ matrix.limit }}'}",
] {
let failures = excessive_jobs(&format!("jobs: {{slow: {job}}}")).unwrap();
Expand Down
2 changes: 1 addition & 1 deletion work/assessments/repository-contract-constraints.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ subject: cap:repository-contract#constraints
inputs:
- kind: section
name: cap:repository-contract#constraints
digest: b42510b90613c64c9ff7103ea65f1bde0246c03d9d53f8a8b87324821a954469
digest: e55488abfe7e2bd7f191244a24c9467b884e6308dbfcef3efe19252a56413aad
- kind: symbol
name: rust_agentic_foundations
digest: 10d07789202f4cdcb47543cb50aa11a4a452b9f7b65024ec835902e85c3e1b06
Expand Down
2 changes: 1 addition & 1 deletion work/assessments/repository-contract-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ subject: cap:repository-contract#contract
inputs:
- kind: section
name: cap:repository-contract#contract
digest: 0d9a243bccb091bdb26571e2a8bf2f9beded63120b207c6f17b0cbfa39e3496d
digest: 94658ad5e7b90d006a7f45dcc0855ee22aeb362c7212f8098a7a81aa728e02eb
- kind: symbol
name: rust_agentic_foundations
digest: 10d07789202f4cdcb47543cb50aa11a4a452b9f7b65024ec835902e85c3e1b06
Expand Down
2 changes: 1 addition & 1 deletion work/assessments/repository-contract-examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ subject: cap:repository-contract#examples
inputs:
- kind: section
name: cap:repository-contract#examples
digest: 74770b4b2ca7c048ebb1aa4dea7ed1d44c70548119dbf9c61368a742c7208df3
digest: e7ce770bf777202e69476dec00f2b91ba8f3a2e05d2a7d81dbbc4a5aa3b3064a
- kind: symbol
name: rust_agentic_foundations
digest: 10d07789202f4cdcb47543cb50aa11a4a452b9f7b65024ec835902e85c3e1b06
Expand Down
2 changes: 1 addition & 1 deletion work/assessments/repository-contract-explanation.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ subject: cap:repository-contract#explanation
inputs:
- kind: section
name: cap:repository-contract#explanation
digest: 7062c5f5b3fb094cc2be2840037e50ee4247e2a9e16f3abced6987c912245ad8
digest: 17fdf10d83371f7015cafa5deab30c57eb318402714db920b081a976b5a6aeb8
- kind: symbol
name: rust_agentic_foundations
digest: 10d07789202f4cdcb47543cb50aa11a4a452b9f7b65024ec835902e85c3e1b06
Expand Down
Loading