Skip to main content

Proposal System

Users can propose changes to every layer of the framework. Proposals follow a consistent two-scope model: changes take effect locally immediately, and can optionally be proposed upstream to the core framework where they go through governance.


What Can Be Proposed​

LayerWhatLocal (immediate)Upstream (governance)
1. SourcesNew intelligence sourceAdd to security/intel/sources-local.yamlPR to intel/sources.yaml
1. SourcesNew source tierAdd tier to local sourcesPR to create new tier in core catalog
1. SourcesRe-score existing sourceOverride score in local configPR to update score in core catalog
1. SourcesFlag stale sourceLocal notePR to downgrade/remove in core catalog
1. AgentsNew auditor domainAdd agent to project .claude/agents/PR to agents/
1. AgentsUpdate agent checklistModify local copyPR to agent .md file
2. GovernanceBoard membershipN/A (core only)GitHub Issue + team change
3. VectorsNew attack vectorAdd to security/vectors/PR to vectors/community/
3. RulesNew semgrep ruleAdd to project .semgrep/PR to semgrep/
3. StandardsNew standards mappingAdd to local standards/PR to standards/
4. SkillsNew integration skillAdd to project .claude/skills/PR to skills/

Local-First Source Management​

Users can add, score, and manage sources immediately for their own project without waiting for governance approval.

security/intel/sources-local.yaml:

version: "1.0"
last_updated: "2026-03-21"

sources:
# Internal source (project-specific, not proposable)
- id: local-internal-pentest-reports
name: "Internal Penetration Test Reports"
url: "https://wiki.internal/security/pentest"
type: page
domains: [all]
why: "Our internal red team tests Canton deployments quarterly"
score:
recency: 5
community: 1
depth: 5
acceptance: 2
authority: 4
composite: 3.55

# Public source flagged for upstream proposal
- id: local-canton-defi-tracker
name: "Canton DeFi Security Tracker"
url: "https://example.com/canton-security"
type: page
domains: [authorization, state]
why: "New tracker focused on Canton Network exploits"
score:
recency: 5
community: 3
depth: 4
acceptance: 3
authority: 3
composite: 3.70
propose_upstream: true
proposed_tier: 4

# Score override for a core source
- id: override:quantstamp-audits
score_override:
depth: 5
recency: 3

How agents merge both catalogs:

  1. Load core intel/sources.yaml (from framework)
  2. Load local security/intel/sources-local.yaml (from project)
  3. Merge: local sources added, score overrides applied
  4. Sort by composite score, sweep in order

Proposing Sources and Tiers Upstream​

/bastion:propose --sources reads sources-local.yaml for entries with propose_upstream: true, validates the source is reachable and produces relevant content, and submits a GitHub PR.

New tier proposals include a tier definition with justification:

- id: proposed-tier-8-custody-security
tier: 8
tier_name: "Digital Asset Custodian Security"
tier_description: "Security sources specific to digital asset custody"
sources:
- id: custody-security-alliance
name: "Custody Security Alliance Reports"
url: "https://example.com/custody-security"
type: page
domains: [authorization, state]
score:
recency: 4
community: 3
depth: 4
acceptance: 3
authority: 3
composite: 3.50

Vector Proposal Flow​


Zero-Friction Submission​

The user's only job is to say "yes." Everything else is automated. The goal is to make sharing back easier than not sharing.

Makefile targets:

bastion-propose:          ## Review and submit all pending proposals (interactive)
bastion-propose-vector: ## Submit a specific vector (usage: make bastion-propose-vector ID=AV-048)
bastion-propose-sources: ## Submit all flagged local sources
bastion-propose-pending: ## Submit everything in the pending queue
bastion-propose-dry-run: ## Preview without creating PRs
bastion-status: ## Show pending proposals, sync status, contribution stats

The most common flow: make bastion-propose-pending

Auto-generated PR example:

Bastion Proposal: Canton Topology Delegation Bypass

Type: Vector | Domain: authorization | Severity: HIGH | CWE: CWE-285

Description: Canton topology delegation transactions can bypass party vetting when a malicious participant submits a delegation with a forged namespace.

Mitigation Pattern: assertMsg "Delegation must chain to a vetted root namespace" (isVettedNamespace delegationRoot)

Evidence: Discovered by authorization-auditor agent on 2026-03-21. Local test PASSED. Semgrep rule validates.

Checklist: All 7 items auto-checked.

Where PR content comes from (nothing is manual):

PR fieldCollected during
Title, type, domain, severity, CWELayer 1: agent proposal
Description, mitigation patternLayer 3: /integrate-vector sanitization
Test evidence, semgrep evidenceLayer 4: verification run
Applicability statementLayer 3: sanitization step
LabelsAuto-applied from YAML fields

bastion-status output:

Bastion Status — canton-exchange
Framework version: 2.1.0 (up to date)
Last sync: 2026-03-21

Pending proposals (3):
VECTOR AV-048 Canton Topology Delegation Bypass HIGH Ready
SOURCE local-canton-defi-tracker Score: 3.7
RULE daml-topology-delegation-check Matches AV-048

Your contributions:
Vectors proposed: 8 | Accepted: 5
Sources proposed: 3 | Accepted: 2

Run: make bastion-propose-pending

Governing Body Review​

Proposals arrive fully formed with evidence, test results, and validation — the review burden on the committee is minimal.

ACCEPT if: Applies to any DAML/Canton project, classification is accurate, content is correct and generic, not a duplicate, scoring is reasonable.

REJECT if: Project-specific, incomplete, already covered, scoring inflated.

VARIANT if: Similar to existing content but warrants expansion.


Governance Mechanism​

See GOVERNANCE.md for the full GitHub-native implementation (rulesets, CODEOWNERS, teams, branch protection).