Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Clarify extra namespace guidance - #56

Merged
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance
Jul 26, 2026
Merged

Clarify extra namespace guidance#56
Ma11hewThomas merged 3 commits into
mainfrom
spec/add-namespace-guidance

Conversation

@Ma11hewThomas

Copy link
Copy Markdown
Collaborator

Summary

Clarifies the CTRF extension mechanism for extra objects so producers can add tool-specific, vendor-specific, or domain-specific metadata without creating collisions or fragmenting the core format.

This PR keeps CTRF strict outside defined extension points while making the intended shape of extension data clearer inside extra.

What Changed

  • Reworked Section 4.6 into clearer subsections for extension keys, extension values, and extension semantics.
  • Clarified that objects named extra are the only supported extensibility points in CTRF.
  • Clarified that consumers MUST ignore unrecognized fields within any extra object and MUST NOT reject otherwise valid documents solely because those fields are present.
  • Added namespace guidance for extension keys:
    • extension keys SHOULD be namespaced to avoid collisions
    • extension keys SHOULD use a stable, recognizable owner prefix
    • extension keys SHOULD include a delimiter such as . or /
    • extension keys are opaque identifiers, not hierarchical paths
  • Reserved the ctrf.* namespace for CTRF-defined extensions.
  • Added guidance that related extension fields SHOULD be grouped under a single extension key as an object value.
  • Added guidance that a producer SHOULD use the same namespace prefix consistently across extra objects in a single document.
  • Updated examples to demonstrate the intended grouped object style using dotted namespace keys such as myorg.ci and acme.test-management.
  • Updated examples/comprehensive.json so the standalone comprehensive example matches the spec guidance.

Why

CTRF already supports extra, but the previous guidance did not say enough about how extension keys should be named or structured. Without clearer guidance, producers could create incompatible shapes for similar metadata, consumers could treat extension content inconsistently, and the extra mechanism could become difficult to reason about as adoption grows.

The intent is to preserve a small, stable core schema while giving producers a predictable extension pattern:

  • use extra for extension data
  • use a stable namespace key to avoid collisions
  • group related fields under that key
  • keep extension keys opaque
  • reserve ctrf.* for extensions defined by CTRF itself

Examples

Preferred grouped extension shape:

{
"extra": {
"microsoft.azure-devops": {
"pipelineId": "42",
"runId": "10891",
"stageName": "test"
}
}
}

This avoids spreading related fields across many flat keys and makes ownership clearer for consumers that choose to understand a specific extension.

Impact

This is a documentation and example clarification. It does not change the JSON Schema and does not add required fields.

Expected impact:

  • Producers get clearer guidance for extension naming and structure.
  • Consumers get clearer guidance that unknown extra content must be ignored within the extension mechanism.
  • CTRF retains strict validation outside extra while allowing safe extension inside extra.
  • Existing valid CTRF documents remain valid.

Validation

  • jsonschema validate schema/ctrf.schema.json examples/*.json
  • jsonschema test tests/ctrf.test.json
  • jsonschema test tests/normative
  • jsonschema test tests/informative

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refines the CTRF specification’s guidance around the extra extension mechanism, focusing on namespaced extension keys, opaque semantics, and consumer behavior when encountering unknown extension content. It also updates the comprehensive example JSON so it matches the new guidance and records the change in the changelog.

Changes:

  • Reworked spec section 4.6 into clearer subsections for extension keys, values, and semantics, with explicit ignore/forward-compat rules for extra.
  • Updated spec/ctrf.md examples and examples/comprehensive.json to demonstrate grouped, namespaced extension objects (e.g., myorg.ci).
  • Added a changelog entry describing the clarified namespace guidance.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
spec/ctrf.mdRewrites the extension mechanism guidance and updates/adds examples for namespaced extra usage.
examples/comprehensive.jsonUpdates the comprehensive example to use grouped, namespaced extra extension keys.
CHANGELOG.mdNotes the spec/example clarification in the Unreleased changelog.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadspec/ctrf.md Outdated
Comment threadspec/ctrf.md Outdated
@Ma11hewThomas
Ma11hewThomas marked this pull request as ready for review July 26, 2026 15:48
@Ma11hewThomas
Ma11hewThomas merged commit b13cfd2 into mainJul 26, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ma11hewThomas