| render_with_liquid | false |
|---|
Level: L400 (Expert) Objective: Master GitHub custom properties as the metadata backbone for repository governance, policy targeting, and compliance reporting at enterprise scale
Document status
- Last reviewed: 2026-06-30
- Authorship: Drafted with AI assistance (GitHub Copilot, multi-model review) and reviewed by a human maintainer before publication.
- Sources: Based on public documentation — primarily docs.github.com, learn.microsoft.com, and official vendor blogs cited inline.
- Verify before acting: GitHub and Microsoft update product documentation continuously. Re-confirm against the live source pages before relying on this content for production decisions.
- Overview
- Why Custom Properties Matter for Governance
- Core Concepts
- Definition Scope: Enterprise vs Organization
- Property Value Types
- Schema Design Principles
- Recommended Governance Taxonomy
- Setting and Editing Property Values
- Required Properties, Defaults, and Explicit Values
- Promoting Organization Properties to the Enterprise
- Targeting Rulesets with Custom Properties
- Searching and Filtering by Custom Properties
- Automation and Infrastructure as Code
- Operating Model and Change Control
- Auditing, Reporting, and Drift Detection
- Compliance Framework Mapping
- Permissions Reference
- Limits Reference
- Best Practices Summary
- Anti-Patterns to Avoid
- Implementation Roadmap
- References
Custom properties are structured metadata fields you attach to repositories to enable consistent organization, governance, and automation across GitHub Enterprise Cloud. A custom property is a typed key-value pair — for example data-classification = confidential or compliance-framework = pci-dss — defined centrally at the enterprise or organization level and then applied to individual repositories.
Unlike repository topics (which are free-form, user-created tags) or naming conventions (which are fragile and unenforceable), custom properties provide a governed vocabulary: administrators control which properties exist, what values are allowed, and which repositories must carry them. This makes custom properties the connective tissue between your repository inventory and your policy engine.
The strategic value comes from a single capability: repository rulesets can target repositories by custom property value. This turns metadata into enforcement. Instead of manually maintaining lists of repositories that need branch protection, signed commits, or required status checks, you classify repositories once and let policy follow the classification automatically — including for repositories created in the future. (GitHub's newer enterprise repository-policy features also build on the same property model; confirm current capabilities against the live documentation.)
Note: The visibility of a custom property value matches the visibility of the repository. Values on public repositories are visible to anyone; values on internal or private repositories are visible only to accounts with
readaccess to the repository. Do not store secrets or sensitive data in property values.
Governance at scale fails when it depends on humans remembering to apply controls to the right repositories. Custom properties replace that manual discipline with declarative, attribute-based governance.
| Governance challenge | Without custom properties | With custom properties |
|---|---|---|
| Apply branch protection to production repos | Manually configure each repository or maintain ruleset target lists by name | Target a ruleset at service-tier = tier-1; new tier-1 repos inherit protection automatically |
| Prove which repositories are in PCI scope | Spreadsheet maintained by hand, quickly stale | Filter the org repository list by compliance-framework = pci-dss on demand |
| Identify ownerless repositories | Tribal knowledge, CODEOWNERS spelunking | Make owning-team a required property; query repositories missing a value |
| Enforce stricter controls on confidential code | Inconsistent, reviewer-dependent | Rulesets keyed to data-classification = confidential require signed commits and reviews |
| Cost allocation and chargeback | Manual mapping of repos to cost centers | Tag cost-center once; export values via API for finance |
| Lifecycle hygiene (archive candidates) | Ad hoc audits | Query lifecycle-stage = deprecated and act in bulk |
In short, custom properties give you attribute-based access and policy control (ABAC) for repositories: define the attributes once, attach policy to the attributes, and let classification drive enforcement consistently across thousands of repositories.
- Property definition (schema): The named, typed field created by an enterprise or organization owner — for example a
single_selectnamedenvironmentwith allowed valuesproduction,staging,development. - Property value: The specific value assigned to a property on a given repository — for example
environment = productiononocto-payments. - Source type: Whether the definition originates at the
enterpriseororganizationlevel. Enterprise-defined properties are available to every organization in the enterprise. - Required property: A property that all in-scope repositories must have. Repositories without an explicit value inherit a configured default.
- Editable-by setting: Controls who can set values — organization actors only, or organization and repository actors.
GitHub constrains the characters allowed in property names and values:
- Names:
a-z,A-Z,0-9,_,-,$,#. No spaces. Maximum 75 characters. - Values: All printable ASCII characters except the double-quote (
"). Maximum 75 characters per value.
Convention: Use lowercase, hyphen-separated names (
data-classification,owning-team,cost-center). This reads cleanly in rulesets, repository search filters, and API payloads, and avoids case-sensitivity confusion.
Custom properties can be defined at two levels. Choosing the right level is the first governance decision.
Enterprise owners define properties under Enterprise → Policies → Custom properties. These definitions become available across all organizations in the enterprise, creating a consistent vocabulary and consistent allowed values everywhere.
- An enterprise-defined (or promoted) property name must be unique across all organizations in the enterprise; promotion is blocked if the name collides with an existing organization-managed property.
- Enterprise owners can mark properties required and set default values that apply enterprise-wide.
- Ideal for governance-critical classifications that must mean the same thing in every organization (data classification, compliance scope, environment).
Organization owners define properties under Organization → Settings → Repository → Custom properties. These apply only within that organization.
- Ideal for organization-specific context (a team taxonomy, a product line, an internal service catalog ID) that does not need to exist enterprise-wide.
- Organization properties can later be promoted to the enterprise if they prove broadly useful (see Promoting Organization Properties to the Enterprise).
| Define at... | When the property... |
|---|---|
| Enterprise | Drives cross-org compliance, must have identical meaning and values everywhere, or feeds enterprise-wide reporting (data classification, compliance framework, environment, criticality) |
| Organization | Reflects local structure, varies by org, or is still being piloted before broader rollout (team names, product codes, local service catalog IDs) |
Recommendation: Establish a small set of mandatory, enterprise-defined governance properties as your "golden schema," then let organizations extend with local properties. This balances consistency with autonomy.
GitHub supports five value types. Choose the most constrained type that fits the data — constrained types prevent typos, keep reporting clean, and make rulesets reliable.
| Type | Description | Best for | Example |
|---|---|---|---|
single_select |
One value chosen from a predefined list (up to 200 allowed values) | Governed taxonomies where exactly one value applies | data-classification: public, internal, confidential, restricted |
multi_select |
One or more values from a predefined list | Attributes where multiple labels can apply | compliance-framework: soc2, iso-27001, pci-dss |
true_false |
Boolean | Yes/no flags | customer-facing: true / false |
string |
Free-text (printable ASCII, max 75 chars) | Identifiers that cannot be enumerated in advance | cost-center: CC-48213 |
url |
A URL value | Links to external systems of record | runbook-url: https://... |
Prefer
single_selectandmulti_selectoverstringfor anything used in governance. Free-text strings drift (prod,Production,PROD), break ruleset targeting, and pollute reports. Reservestringfor genuinely open identifiers such as cost-center codes or ticket numbers.
A well-designed schema is small, opinionated, and stable. Treat it like a database schema, not a tag cloud.
- Start minimal. Ship 5–8 high-value properties. You can always add more; removing widely-used properties is disruptive.
- One concept per property. Avoid overloading a property (
type = prod-pci-customerfacing). Split into orthogonal properties so each can be queried and targeted independently. - Constrain values. Default to
single_select/multi_selectwith an explicit allowed-values list. Document the meaning of each value. - Name for the consumer. Names appear in rulesets, search (
props.<name>:<value>), and API payloads. Use clear, lowercase, hyphenated nouns. - Make governance-critical properties required. If a property must exist for policy to work (classification, owner), require it and set a sensible default.
- Pick a sensible default carefully. A required default of
confidentialfails safe (over-protect); a default ofpublicfails open. Default toward the more restrictive posture for security properties. - Version your taxonomy in code. Keep the canonical schema in a repository as IaC (Terraform/REST scripts) so changes are reviewed, audited, and reproducible.
- Document the data dictionary. Maintain a single source of truth describing every property, its type, allowed values, owner, and intended policy use.
The following is a battle-tested starter taxonomy. Adapt names and values to your environment, but keep the structure: a few required governance anchors plus optional context.
| Property | Type | Required | Suggested allowed values | Governance / compliance purpose |
|---|---|---|---|---|
data-classification |
single_select |
Yes | public, internal, confidential, restricted |
Drives encryption, review, and access policy; core to ISO 27001 / SOC 2 data handling |
compliance-framework |
multi_select |
No | soc2, iso-27001, pci-dss, hipaa, gdpr, fedramp |
Identifies in-scope repositories for audits and evidence collection |
service-tier |
single_select |
Yes | tier-0, tier-1, tier-2, tier-3 |
Criticality; targets stricter rulesets at higher tiers |
environment |
single_select |
No | production, staging, development, sandbox |
Separates production controls from experimentation |
lifecycle-stage |
single_select |
Yes | incubating, active, maintenance, deprecated, archived |
Drives lifecycle hygiene and archival workflows |
owning-team |
string or single_select |
Yes | Team slugs (or a curated select list) | Accountability; resolves ownerless-repo risk |
business-unit |
single_select |
No | Your BU list | Portfolio reporting and org alignment |
cost-center |
string |
No | CC-##### |
Chargeback and financial allocation |
customer-facing |
true_false |
No | true, false |
Flags external exposure for risk and incident triage |
contains-pii |
true_false |
No | true, false |
Privacy obligations (GDPR/CCPA); triggers stricter handling |
runbook-url |
url |
No | URL | Operational readiness; links to incident runbook |
Minimum viable governance set:
data-classification,service-tier,lifecycle-stage, andowning-teamas required enterprise properties give you classification, criticality, lifecycle, and accountability — the four anchors most policies and audits depend on.
Defining a property creates the schema; you still need to populate values on repositories. There are three complementary paths.
Organization owners set values from Organization → Settings → Repository → Custom properties → Set values:
- Open the Set values tab.
- Select one or more repositories from the list.
- Click Edit properties.
- Choose values for each property in the dialog.
- Click Save changes.
This is the fastest way to classify an existing estate. Combine with search/filter to apply values to logical groups (for example, select all repositories matching a naming pattern and set business-unit).
If a property definition enables Allow repository actors to set this property, users (or apps) with the repository-level custom properties fine-grained permission can set the value from Repository → Settings → Custom properties. Use this to delegate context that repository teams know best (for example runbook-url) while keeping governance anchors centrally controlled.
When a property allows repository actors to set it, anyone creating a repository can set the value at creation time. Pair this with required properties and require_explicit_values to force classification decisions up front rather than retrofitting them later.
Anyone with read access to a repository can view its property values under Repository → Settings → Custom properties but cannot edit them unless granted the appropriate permission.
Three settings on a property definition determine how strictly it is enforced:
- Require this property for all repositories: Every in-scope repository must have a value. Repositories without an explicit value inherit the configured default value. This guarantees universal coverage — useful for
data-classificationandowning-team. - Default value: The fallback applied to required properties when no explicit value is set. Choose a fail-safe default for security-sensitive properties (e.g., default
data-classificationtoconfidential, notpublic). - Require explicit user-specified values: When enabled, users and apps must provide an explicit value when setting properties, creating repositories, or transferring repositories. Repositories that do not yet have an explicit value still inherit the default, but new/transferred repositories cannot be created without a deliberate choice. This eliminates "default by accident" and forces conscious classification.
Pattern for high-assurance governance: Mark
data-classificationrequired, default it torestricted/confidential, and enable Require explicit user-specified values. New repositories then cannot dodge classification, and anything unclassified is treated as sensitive until proven otherwise.
A property that proves valuable in one organization can be promoted so its name and values are consistent across the whole enterprise.
- Navigate to your enterprise (for example, from the Enterprises page on GitHub.com).
- In the left sidebar, under Policies, click Custom properties.
- Filter to organization-managed properties using Managed by → organization (or the filter
managed-by:organization). Optionally narrow to one org withorg:<ORGANIZATION-NAME>. - Select the property name to open its details page.
- Click Promote to enterprise, then confirm with Promote.
The property name must be unique across all organizations in the enterprise; otherwise promotion is blocked. Use promotion to graduate a piloted, well-understood property into the enterprise golden schema once its taxonomy has stabilized.
This is the highest-leverage use of custom properties: repository rulesets and repository policies can target repositories by property value, turning classification into automatic enforcement.
When you create an organization ruleset, the target selection lets you include or exclude repositories by custom property in addition to by name. Because targeting is evaluated dynamically, a repository that later receives the matching property value immediately falls under the ruleset — no manual re-targeting required.
| Classification | Ruleset enforcement |
|---|---|
service-tier = tier-0 or tier-1 |
Require pull requests, 2 or more approvals, required status checks, linear history, block force pushes |
data-classification = confidential / restricted |
Require signed commits, required reviewers via CODEOWNERS, restrict who can push |
compliance-framework contains pci-dss |
Require status checks for security scans, require deployments to pass, restrict deletions |
environment = production |
Protect default branch, require successful CI, disallow direct pushes |
lifecycle-stage = archived |
Restrict updates; pair with archival policy |
- Future-proof: New repositories inherit policy the moment they are classified, including auto-created repositories.
- Self-documenting: The ruleset states the governance intent ("all confidential repos require signing") rather than an opaque list of names.
- Resistant to drift: Renames and reorganizations do not break targeting, because policy follows the attribute, not the name.
Sequence rollout to avoid surprises: Define the property → classify repositories → create the ruleset in Evaluate (dry-run) mode → review the insights → switch to Active. Validate that the target set matches expectations before enforcing.
See also Repository Governance for the full ruleset deep dive and Policy Inheritance for enterprise → org → repo enforcement layering.
Custom properties make your repository estate queryable, which is essential for audits and operational hygiene.
From Organization → Repositories, type prop in the search bar to list available custom properties, then select one to filter. You can combine property filters with other repository search qualifiers. GitHub also exposes a property search qualifier (commonly of the form props.<property-name>:<value>); confirm the exact qualifier syntax against the live GitHub search documentation, as it has evolved over time.
| Goal | Approach |
|---|---|
| List all confidential repositories | Filter by data-classification = confidential |
| Find PCI-scope repositories for an audit | Filter by compliance-framework = pci-dss |
| Find ownerless repositories | List repositories missing a value for required owning-team (via API export) |
| Identify archive candidates | Filter by lifecycle-stage = deprecated |
| Scope an incident blast radius | Filter by customer-facing = true combined with service-tier = tier-0 |
Treat your property schema and value assignments as code so changes are reviewed, versioned, and reproducible.
Scope note: The REST endpoints below operate at the organization level (
/orgs/{org}/properties). They are ideal for defining and populating properties within an organization and for scripted, multi-org rollouts (loop over each org). Enterprise-level property definitions and promotion are managed by enterprise owners in the enterprise Policies → Custom properties UI; do not assume the org endpoints define enterprise-scoped schema.
Custom properties are managed through the REST API under /orgs/{org}/properties:
| Operation | Method & endpoint |
|---|---|
| Get all property definitions | GET /orgs/{org}/properties/schema |
| Create/update definitions (batch) | PATCH /orgs/{org}/properties/schema |
| Get one property definition | GET /orgs/{org}/properties/schema/{name} |
| Create/update one definition | PUT /orgs/{org}/properties/schema/{name} |
| Remove a definition | DELETE /orgs/{org}/properties/schema/{name} |
| List values across repositories | GET /orgs/{org}/properties/values |
| Set values (batch, up to 30 repos) | PATCH /orgs/{org}/properties/values |
curl -L -X PATCH \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <YOUR-TOKEN>" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/orgs/ORG/properties/schema \
-d '{
"properties": [
{
"property_name": "data-classification",
"value_type": "single_select",
"required": true,
"default_value": "confidential",
"description": "Sensitivity of the data handled by this repository",
"allowed_values": ["public", "internal", "confidential", "restricted"],
"values_editable_by": "org_actors",
"require_explicit_values": true
},
{
"property_name": "service-tier",
"value_type": "single_select",
"required": true,
"default_value": "tier-3",
"allowed_values": ["tier-0", "tier-1", "tier-2", "tier-3"]
}
]
}'curl -L -X PATCH \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <YOUR-TOKEN>" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/orgs/ORG/properties/values \
-d '{
"repository_names": ["payments-api", "payments-web"],
"properties": [
{ "property_name": "data-classification", "value": "restricted" },
{ "property_name": "service-tier", "value": "tier-1" },
{ "property_name": "compliance-framework", "value": ["pci-dss", "soc2"] }
]
}'Setting a property value to
nullremoves (unsets) it from the repository. A single value-assignment request can update a maximum of 30 repositories.
Use gh api to script the same endpoints, which is convenient for one-off audits and pipelines:
# Export all property values across the org to a file
gh api --paginate /orgs/ORG/properties/values > property-values.json
# Read the schema
gh api /orgs/ORG/properties/schemaIf you manage GitHub with Terraform, you can keep the property schema (and optionally per-repository assignments) under version control with plan/apply review. The exact resource and argument names in the integrations/github provider change between versions, so verify against the provider documentation for the version you pin before adopting a concrete resource block.
As a provider-agnostic alternative that is stable across versions, drive the verified REST endpoints from Terraform with a terraform_data/null_resource and gh api, or generate the schema from a checked-in JSON file and apply it with the PATCH /orgs/{org}/properties/schema call shown above. This keeps the canonical schema in source control without depending on a specific provider resource name.
Reminder: for
single_select, the default value is a single string (for example"confidential"); onlymulti_selectdefaults are expressed as a list. Match this in whichever tool you use.
A schema is only as trustworthy as the process that governs it. For an L400 compliance audience, define an explicit operating model alongside the technical configuration.
- Schema owner (RACI): Name an accountable owner (typically platform engineering or the GitHub admin team) for the enterprise golden schema. Document who is Responsible, Accountable, Consulted, and Informed for property changes.
- Value stewardship: Decide per property who owns the values — centrally set governance anchors (
data-classification,service-tier) versus team-delegated context (runbook-url,owning-team).
- Propose via pull request: Keep the canonical schema (JSON or IaC) in a controlled repository; all additions, renames, or allowed-value changes go through review.
- Assess blast radius: Adding an allowed value is low risk; renaming or removing a property or value can break ruleset targeting and reporting. Treat these as breaking changes with a migration plan.
- Deprecation strategy: Renames are effectively delete-plus-recreate. Migrate values and re-point rulesets before retiring an old property. Stage changes in Evaluate mode first.
- Exception register: Record any repository granted an exception from a required classification or a property-targeted ruleset, with owner, justification, and expiry.
- Sensitive-value approval: Require a second approver to change high-impact values (for example downgrading
data-classificationfromrestricted), and capture the change in the audit log. - Break-glass: Define how an emergency classification change is made and retroactively reviewed.
- Periodic attestation: On a fixed cadence (commonly quarterly), owning teams confirm their repositories' classifications. Track attestation completion as a compliance KPI.
- Data-quality SLA: Set targets such as "100% of repositories have a
data-classificationvalue" and "0 required properties left on default after 30 days" and report against them.
Custom properties only deliver governance value if values stay accurate. Build a lightweight assurance loop:
- Coverage report: Periodically pull
GET /orgs/{org}/properties/valuesand flag repositories missing required properties or still on default values. Track coverage percentage as a governance KPI. - Drift detection: Compare live property values against the intended state declared in your IaC. Alert on unexpected changes, especially to
data-classificationandservice-tier. - Audit-log monitoring: Custom property definition and value changes are captured in the organization/enterprise audit log. Review these events for unauthorized schema or classification changes.
- Reclassification reviews: Schedule recurring reviews (quarterly is common) where owning teams confirm or update classifications. Tie this to access and lifecycle reviews already in your governance cadence.
- Evidence packs: For audits, export the filtered repository list (e.g., all
compliance-framework:pci-dssrepos with their ruleset coverage) as point-in-time evidence.
Custom properties provide the classification layer that many control frameworks expect. The table below is an illustrative example mapping of common requirements to a property-driven implementation — not a statement of GitHub-native compliance certification. Validate control applicability with your own compliance owner or auditor before relying on it for evidence.
| Framework / control area | Requirement | Custom-property implementation |
|---|---|---|
| ISO 27001 (A.8 Asset management) | Inventory and classify information assets | data-classification (required) + owning-team provide the asset register and ownership |
| SOC 2 (CC6 / CC7) | Logical access and change controls scaled to risk | service-tier + data-classification target rulesets enforcing reviews, signing, and status checks |
| PCI DSS (Req. 6) | Secure SDLC for in-scope systems | compliance-framework:pci-dss targets a ruleset requiring security checks and restricted changes |
| GDPR / CCPA | Identify and protect personal data | contains-pii = true flags repositories for stricter handling and data-protection reviews |
| NIST CSF (Identify) | Asset and criticality identification | service-tier + business-unit establish criticality and portfolio context |
| FedRAMP / regulated workloads | Boundary and scope definition | compliance-framework:fedramp plus environment delineate authorization boundaries |
Custom properties are an enabling control, not a complete compliance solution. They make scope, classification, and policy targeting auditable and consistent; you still need the underlying rulesets, scanning, and process controls described in Security and Compliance and Security-by-Default Policies.
| Action | Who can perform it |
|---|---|
| Define/edit enterprise properties | Enterprise owners |
| Define/edit organization properties | Organization owners, or holders of the custom_properties_org_definitions_manager fine-grained permission |
| Set values across the organization | Organization owners, or holders of custom_properties_org_values_editor |
| Set values on a single repository | Repository actors with the repository-level custom properties permission (only if the definition allows repository actors to set it) |
| View property values | Anyone with read access to the repository |
| Promote org property to enterprise | Enterprise owners |
API tokens require the Custom properties organization permission at the appropriate level: read to list, write to set values, and admin to manage definitions.
| Limit | Value |
|---|---|
| Property definitions per enterprise | 100 |
Allowed values per single_select / multi_select list |
200 |
| Property name length | 75 characters |
| Property value length | 75 characters |
| Repositories updated per value-assignment API request | 30 |
| Name allowed characters | a-z, A-Z, 0-9, _, -, $, # (no spaces) |
| Value allowed characters | All printable ASCII except " |
Limits change over time. Re-confirm against the live GitHub documentation before designing against a specific ceiling.
- Define a small, mandatory golden schema at the enterprise level (
data-classification,service-tier,lifecycle-stage,owning-team) and let organizations extend locally. - Prefer
single_select/multi_selectwith explicit allowed values for anything used in governance; reservestringfor open identifiers. - Make governance anchors required, set fail-safe defaults, and enable Require explicit user-specified values for sensitive classifications.
- Drive policy from properties: target rulesets and repository policies at property values so enforcement follows classification automatically.
- Roll out rulesets in Evaluate mode first to validate the target set before enforcing.
- Manage the schema as code (Terraform or REST scripts) under pull-request review; keep a documented data dictionary.
- Classify on creation, not as an afterthought — use set-on-creation plus required explicit values.
- Measure coverage and detect drift with periodic API exports and audit-log review.
- Tie reclassification to existing governance reviews (access, lifecycle, security) so it does not become orphaned work.
- Never store secrets or sensitive data in values — value visibility follows repository visibility.
- Free-text everywhere: Using
stringforenvironmentorteaminvitesprod/Production/PRODdrift that breaks ruleset targeting and reporting. - Overloaded properties: Cramming multiple concepts into one value (
prod-pci-tier1) makes filtering and targeting impossible. Keep properties orthogonal. - Schema sprawl: Launching 30 properties on day one. Start with the minimum viable set and grow deliberately.
- Optional governance anchors: Leaving
data-classificationoptional yields blind spots. Required + explicit values prevents gaps. - Fail-open defaults: Defaulting security-sensitive properties to the least restrictive value (
public) silently under-protects new repositories. - Manual-only assignment: Classifying by hand without API/IaC backing makes the estate impossible to audit or reproduce.
- Enforcing before validating: Activating a ruleset keyed to a property before checking the target set, causing unexpected friction for teams.
A pragmatic phased rollout:
- Design (week 1): Workshop the taxonomy with security, compliance, and platform teams. Document the data dictionary and choose enterprise vs org scope for each property.
- Define (week 1–2): Create the golden schema via REST/Terraform at the enterprise level. Start required properties with safe defaults but keep enforcement light.
- Classify (week 2–4): Bulk-assign values to the existing estate using the Set values UI for obvious groups and the API for scripted classification. Track coverage toward 100% of required properties.
- Enforce in dry-run (week 4–5): Create rulesets targeting key property values in Evaluate mode. Review insights and reconcile mis-classifications.
- Activate (week 5–6): Switch validated rulesets to Active. Enable Require explicit user-specified values so new repositories must classify on creation.
- Operate (ongoing): Run coverage and drift reports, monitor the audit log, and fold reclassification into quarterly governance reviews. Promote proven org properties to the enterprise as the taxonomy matures.
- Managing custom properties for repositories in your organization
- Managing custom properties for repositories in your enterprise
- REST API endpoints for organization custom properties
- About rulesets
- Creating rulesets for repositories in your organization
- Managing custom organization roles
- GitHub Well-Architected — Governance
- Related workshop docs: Policy Inheritance · Repository Governance · Security and Compliance · Security-by-Default Policies