diff --git a/.github/policies/competition/antitrust.yml b/.github/policies/competition/antitrust.yml new file mode 100644 index 00000000000..4af678a8bfd --- /dev/null +++ b/.github/policies/competition/antitrust.yml @@ -0,0 +1,5 @@ +name: Antitrust Classification +rules: + - id: antitrust-01 + description: Flag mentions of anticompetitive conduct + condition: text contains "anti-competitive" diff --git a/docs/ops/runbooks/competition-events.md b/docs/ops/runbooks/competition-events.md new file mode 100644 index 00000000000..522b90e3eaa --- /dev/null +++ b/docs/ops/runbooks/competition-events.md @@ -0,0 +1,6 @@ +# Competition Events Runbook + +* Alert if: + * extraction fails >5% + * schema mismatch +* SLO: 99% parse success diff --git a/docs/security/data-handling/competition-events.md b/docs/security/data-handling/competition-events.md new file mode 100644 index 00000000000..98091e7fdb6 --- /dev/null +++ b/docs/security/data-handling/competition-events.md @@ -0,0 +1,7 @@ +# Competition Events Data Handling + +* Public news only +* Never log: + * raw prompts + * internal embeddings +* Retention: 30 days raw, permanent structured diff --git a/docs/standards/competition-events.md b/docs/standards/competition-events.md new file mode 100644 index 00000000000..65bb8e7ca23 --- /dev/null +++ b/docs/standards/competition-events.md @@ -0,0 +1,7 @@ +# Competition Events Standards + +| Format | Supported | +| ------------- | ------------ | +| JSON | ✅ | +| Graph (Neo4j) | ✅ | +| OpenAI schema | ❌ (non-goal)| diff --git a/scripts/bench/competition-event.ts b/scripts/bench/competition-event.ts new file mode 100644 index 00000000000..19a98b79294 --- /dev/null +++ b/scripts/bench/competition-event.ts @@ -0,0 +1 @@ +console.log('Benchmark script stub'); diff --git a/scripts/monitoring/competition-drift.ts b/scripts/monitoring/competition-drift.ts new file mode 100644 index 00000000000..a7f50a80681 --- /dev/null +++ b/scripts/monitoring/competition-drift.ts @@ -0,0 +1 @@ +console.log('Monitoring script stub'); diff --git a/src/agents/competition-risk-agent.ts b/src/agents/competition-risk-agent.ts new file mode 100644 index 00000000000..cbd5b0f1606 --- /dev/null +++ b/src/agents/competition-risk-agent.ts @@ -0,0 +1,5 @@ +export class CompetitionRiskAgent { + analyze(text: string) { + return { riskScore: 0.8, flags: ['antitrust'] }; + } +} diff --git a/src/connectors/rest/regulatoryNews.ts b/src/connectors/rest/regulatoryNews.ts new file mode 100644 index 00000000000..905311d40fe --- /dev/null +++ b/src/connectors/rest/regulatoryNews.ts @@ -0,0 +1,11 @@ +import crypto from 'node:crypto'; + +export function extractCompetitionEvent(article: string) { + const hash = crypto.createHash('sha256').update(article).digest('hex'); + return { + id: hash, + type: "REGULATORY_COMPETITION_EVENT", + actors: [], + claims: [], + }; +} diff --git a/src/graphrag/schema/competitionEvent.ts b/src/graphrag/schema/competitionEvent.ts new file mode 100644 index 00000000000..57641370fd2 --- /dev/null +++ b/src/graphrag/schema/competitionEvent.ts @@ -0,0 +1,7 @@ +import type { EvidenceReport } from '../evidence/types.js'; + +export interface CompetitionEvent extends EvidenceReport { + event_type: 'REGULATORY_COMPETITION_EVENT'; + actors: string[]; + claims: string[]; +} diff --git a/subsumption/competition-events/claims.md b/subsumption/competition-events/claims.md new file mode 100644 index 00000000000..76f11b487ce --- /dev/null +++ b/subsumption/competition-events/claims.md @@ -0,0 +1,9 @@ +# Claim Registry + +| Planned Element | Source | +| --------------------------------- | ------------- | +| Competition-risk detector | ITEM:CLAIM-02 | +| Regulatory event ingestion | ITEM:CLAIM-01 | +| Actor conflict graph edges | ITEM:CLAIM-04 | +| Market competition classification | ITEM:CLAIM-03 | +| Antitrust policy tagging | ITEM:CLAIM-05 | diff --git a/subsumption/competition-events/manifest.yaml b/subsumption/competition-events/manifest.yaml new file mode 100644 index 00000000000..5594145e769 --- /dev/null +++ b/subsumption/competition-events/manifest.yaml @@ -0,0 +1,57 @@ +version: 1 +item: + title: "TEMPLATE: Replace with ITEM title" + links: [] + type: "unknown" + date_version: "unknown" + intriguing_claim: "TEMPLATE: 1–2 sentences" +item_slug: "_template" + +claim_registry: + mode: "missing-item" + claims_file: "subsumption/_template/claims.md" + +prs: + - title: "feat(governance): add subsumption bundle framework verifier" + lane: "foundation" + owner: "master" + risk: "green" + +gates: + - name: "verify-subsumption-bundle" + required_checks_status: "assumed" + deny_by_default_required: true + +evidence: + schemas: + report: "evidence/schemas/report.schema.json" + metrics: "evidence/schemas/metrics.schema.json" + stamp: "evidence/schemas/stamp.schema.json" + index: "evidence/index.json" + required_ids: + - "EVD-SUBSUMPTION-FRAMEWORK-GOV-001" + +docs_targets: + - "docs/standards/subsumption-bundle-framework.md" + - "docs/security/data-handling/subsumption-bundle-framework.md" + - "docs/ops/runbooks/subsumption-bundle-framework.md" + - "docs/required_checks.todo.md" + - "docs/repo_assumptions.md" + - "docs/decisions/subsumption-bundle-framework.md" + +fixtures: + deny_policy_dir: "subsumption/_template/fixtures/policy/deny" + tests: + positive: + - "subsumption/_template/fixtures/tests/positive/minimal_bundle" + negative: + - "subsumption/_template/fixtures/tests/negative/missing_docs" + +feature_flags: [] +dependency_delta: + required_if_deps_change: true + doc_root: "deps_delta" + +required_checks_discovery: + status: "assumed" + instructions: "docs/required_checks.todo.md" diff --git a/tests/connectors/regulatoryNews.test.ts b/tests/connectors/regulatoryNews.test.ts new file mode 100644 index 00000000000..5cb12b9e707 --- /dev/null +++ b/tests/connectors/regulatoryNews.test.ts @@ -0,0 +1,10 @@ +import test from 'node:test'; +import assert from 'node:assert'; +import { extractCompetitionEvent } from '../../src/connectors/rest/regulatoryNews.js'; + +test('extractCompetitionEvent', () => { + const article = 'OpenAI formally requested regulatory scrutiny from California AG.'; + const event = extractCompetitionEvent(article); + assert.strictEqual(event.type, 'REGULATORY_COMPETITION_EVENT'); + assert.ok(event.id); +});