@ahmed-g-gad/apothem 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/LICENSE +21 -0
- package/LICENSES/MIT.txt +18 -0
- package/LICENSES/PSF-2.0.txt +47 -0
- package/README.md +549 -0
- package/bin/README.md +37 -0
- package/bin/apothem.mjs +78 -0
- package/package.json +75 -0
- package/pyproject.toml +347 -0
- package/src/apothem/README.md +52 -0
- package/src/apothem/__init__.py +66 -0
- package/src/apothem/__main__.py +28 -0
- package/src/apothem/_vendor/.keep +0 -0
- package/src/apothem/_vendor/__init__.py +25 -0
- package/src/apothem/_vendor/attr/__init__.py +104 -0
- package/src/apothem/_vendor/attr/__init__.pyi +389 -0
- package/src/apothem/_vendor/attr/_cmp.py +160 -0
- package/src/apothem/_vendor/attr/_cmp.pyi +13 -0
- package/src/apothem/_vendor/attr/_compat.py +99 -0
- package/src/apothem/_vendor/attr/_config.py +31 -0
- package/src/apothem/_vendor/attr/_funcs.py +497 -0
- package/src/apothem/_vendor/attr/_make.py +3406 -0
- package/src/apothem/_vendor/attr/_next_gen.py +674 -0
- package/src/apothem/_vendor/attr/_typing_compat.pyi +15 -0
- package/src/apothem/_vendor/attr/_version_info.py +89 -0
- package/src/apothem/_vendor/attr/_version_info.pyi +9 -0
- package/src/apothem/_vendor/attr/converters.py +162 -0
- package/src/apothem/_vendor/attr/converters.pyi +19 -0
- package/src/apothem/_vendor/attr/exceptions.py +95 -0
- package/src/apothem/_vendor/attr/exceptions.pyi +17 -0
- package/src/apothem/_vendor/attr/filters.py +72 -0
- package/src/apothem/_vendor/attr/filters.pyi +6 -0
- package/src/apothem/_vendor/attr/py.typed +0 -0
- package/src/apothem/_vendor/attr/setters.py +79 -0
- package/src/apothem/_vendor/attr/setters.pyi +20 -0
- package/src/apothem/_vendor/attr/validators.py +750 -0
- package/src/apothem/_vendor/attr/validators.pyi +140 -0
- package/src/apothem/_vendor/attr.LICENSE +21 -0
- package/src/apothem/_vendor/attrs/__init__.py +72 -0
- package/src/apothem/_vendor/attrs/__init__.pyi +314 -0
- package/src/apothem/_vendor/attrs/converters.py +3 -0
- package/src/apothem/_vendor/attrs/exceptions.py +3 -0
- package/src/apothem/_vendor/attrs/filters.py +3 -0
- package/src/apothem/_vendor/attrs/py.typed +0 -0
- package/src/apothem/_vendor/attrs/setters.py +3 -0
- package/src/apothem/_vendor/attrs/validators.py +3 -0
- package/src/apothem/_vendor/attrs.LICENSE +21 -0
- package/src/apothem/_vendor/jsonschema/__init__.py +120 -0
- package/src/apothem/_vendor/jsonschema/__main__.py +6 -0
- package/src/apothem/_vendor/jsonschema/_format.py +546 -0
- package/src/apothem/_vendor/jsonschema/_keywords.py +449 -0
- package/src/apothem/_vendor/jsonschema/_legacy_keywords.py +449 -0
- package/src/apothem/_vendor/jsonschema/_types.py +204 -0
- package/src/apothem/_vendor/jsonschema/_typing.py +29 -0
- package/src/apothem/_vendor/jsonschema/_utils.py +355 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/__init__.py +5 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/const_vs_enum.py +30 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/contains.py +28 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/import_benchmark.py +31 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/issue232/issue.json +2653 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/issue232.py +25 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/json_schema_test_suite.py +12 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/nested_schemas.py +56 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/subcomponents.py +42 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/unused_registry.py +35 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/useless_applicator_schemas.py +106 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/useless_keywords.py +32 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/validator_creation.py +14 -0
- package/src/apothem/_vendor/jsonschema/cli.py +292 -0
- package/src/apothem/_vendor/jsonschema/exceptions.py +490 -0
- package/src/apothem/_vendor/jsonschema/protocols.py +230 -0
- package/src/apothem/_vendor/jsonschema/validators.py +1410 -0
- package/src/apothem/_vendor/jsonschema.LICENSE +19 -0
- package/src/apothem/_vendor/jsonschema_specifications/__init__.py +12 -0
- package/src/apothem/_vendor/jsonschema_specifications/_core.py +38 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
- package/src/apothem/_vendor/jsonschema_specifications.LICENSE +19 -0
- package/src/apothem/_vendor/referencing/__init__.py +7 -0
- package/src/apothem/_vendor/referencing/_attrs.py +31 -0
- package/src/apothem/_vendor/referencing/_attrs.pyi +21 -0
- package/src/apothem/_vendor/referencing/_core.py +739 -0
- package/src/apothem/_vendor/referencing/exceptions.py +165 -0
- package/src/apothem/_vendor/referencing/jsonschema.py +642 -0
- package/src/apothem/_vendor/referencing/py.typed +0 -0
- package/src/apothem/_vendor/referencing/retrieval.py +94 -0
- package/src/apothem/_vendor/referencing/typing.py +61 -0
- package/src/apothem/_vendor/referencing.LICENSE +19 -0
- package/src/apothem/_vendor/rpds/__init__.py +251 -0
- package/src/apothem/_vendor/typing_extensions.LICENSE +279 -0
- package/src/apothem/_vendor/typing_extensions.py +4317 -0
- package/src/apothem/_vendor/vendor.txt +22 -0
- package/src/apothem/_vendor/yaml/__init__.py +389 -0
- package/src/apothem/_vendor/yaml/composer.py +138 -0
- package/src/apothem/_vendor/yaml/constructor.py +748 -0
- package/src/apothem/_vendor/yaml/cyaml.py +100 -0
- package/src/apothem/_vendor/yaml/dumper.py +61 -0
- package/src/apothem/_vendor/yaml/emitter.py +1137 -0
- package/src/apothem/_vendor/yaml/error.py +74 -0
- package/src/apothem/_vendor/yaml/events.py +85 -0
- package/src/apothem/_vendor/yaml/loader.py +63 -0
- package/src/apothem/_vendor/yaml/nodes.py +48 -0
- package/src/apothem/_vendor/yaml/parser.py +588 -0
- package/src/apothem/_vendor/yaml/reader.py +185 -0
- package/src/apothem/_vendor/yaml/representer.py +388 -0
- package/src/apothem/_vendor/yaml/resolver.py +226 -0
- package/src/apothem/_vendor/yaml/scanner.py +1435 -0
- package/src/apothem/_vendor/yaml/serializer.py +110 -0
- package/src/apothem/_vendor/yaml/tokens.py +103 -0
- package/src/apothem/_vendor/yaml.LICENSE +20 -0
- package/src/apothem/agents/README.md +60 -0
- package/src/apothem/agents/codebase-explorer.md +91 -0
- package/src/apothem/agents/convention-auditor.md +93 -0
- package/src/apothem/agents/dependency-auditor.md +97 -0
- package/src/apothem/agents/fact-checker.md +84 -0
- package/src/apothem/agents/mcp-builder.md +86 -0
- package/src/apothem/agents/memory-auditor.md +93 -0
- package/src/apothem/agents/prompt-evaluator.md +87 -0
- package/src/apothem/agents/quality-gate.md +103 -0
- package/src/apothem/agents/refactor-surgeon.md +74 -0
- package/src/apothem/agents/research-scout.md +73 -0
- package/src/apothem/agents/security-scanner.md +83 -0
- package/src/apothem/agents/test-runner.md +84 -0
- package/src/apothem/audit/README.md +73 -0
- package/src/apothem/audit/_scan_lib.py +182 -0
- package/src/apothem/audit/analyze_graph.py +260 -0
- package/src/apothem/audit/build_capability_graph.py +607 -0
- package/src/apothem/audit/build_inventory.py +657 -0
- package/src/apothem/audit/build_plans_provenance.py +997 -0
- package/src/apothem/audit/check_links.py +389 -0
- package/src/apothem/audit/classify_artifacts.py +381 -0
- package/src/apothem/audit/deprecated-tokens.txt +10 -0
- package/src/apothem/audit/execute_plans_migration.py +491 -0
- package/src/apothem/audit/known-projects.txt +15 -0
- package/src/apothem/audit/render_capability_index.py +467 -0
- package/src/apothem/audit/render_inventory.py +405 -0
- package/src/apothem/audit/scan_ai_surfaces.py +1125 -0
- package/src/apothem/audit/scan_ai_surfaces_coarse.py +261 -0
- package/src/apothem/audit/scan_drift_features.py +143 -0
- package/src/apothem/audit/scan_frontmatter.py +293 -0
- package/src/apothem/audit/scan_header_coverage.py +1134 -0
- package/src/apothem/audit/scan_plan_leakage.py +540 -0
- package/src/apothem/audit/scan_plans_discipline.py +188 -0
- package/src/apothem/audit/scan_secrets_pii.py +245 -0
- package/src/apothem/audit/scan_stale_tokens.py +296 -0
- package/src/apothem/audit/synthesize_drift.py +205 -0
- package/src/apothem/benchmarks/README.md +33 -0
- package/src/apothem/benchmarks/__init__.py +3 -0
- package/src/apothem/benchmarks/bench_agents.py +63 -0
- package/src/apothem/benchmarks/bench_hooks.py +93 -0
- package/src/apothem/benchmarks/bench_install.py +58 -0
- package/src/apothem/benchmarks/bench_tests.py +93 -0
- package/src/apothem/benchmarks/bench_validate_ecosystem.py +84 -0
- package/src/apothem/cli/README.md +33 -0
- package/src/apothem/cli/__init__.py +229 -0
- package/src/apothem/cli/_cmd_completion.py +88 -0
- package/src/apothem/cli/_cmd_diff.py +181 -0
- package/src/apothem/cli/_cmd_doctor.py +143 -0
- package/src/apothem/cli/_cmd_harnesses.py +167 -0
- package/src/apothem/cli/_cmd_install.py +327 -0
- package/src/apothem/cli/_cmd_migrate_workspace.py +143 -0
- package/src/apothem/cli/_cmd_profile.py +341 -0
- package/src/apothem/cli/_cmd_status.py +180 -0
- package/src/apothem/cli/_cmd_uninstall.py +215 -0
- package/src/apothem/cli/_cmd_update.py +397 -0
- package/src/apothem/cli/_cmd_verify.py +194 -0
- package/src/apothem/cli/_common_flags.py +90 -0
- package/src/apothem/cli/_epilogs.py +296 -0
- package/src/apothem/cli/_helpers.py +857 -0
- package/src/apothem/cli/_json_formatter.py +21 -0
- package/src/apothem/cli/_materialize.py +376 -0
- package/src/apothem/cli/completions/apothem.bash +30 -0
- package/src/apothem/cli/completions/apothem.fish +19 -0
- package/src/apothem/cli/completions/apothem.ps1 +27 -0
- package/src/apothem/cli/completions/apothem.zsh +42 -0
- package/src/apothem/cli/reference_export.py +126 -0
- package/src/apothem/commands/README.md +125 -0
- package/src/apothem/commands/a11y-audit.md +203 -0
- package/src/apothem/commands/architecture-review.md +194 -0
- package/src/apothem/commands/audit.md +165 -0
- package/src/apothem/commands/code-audit.md +218 -0
- package/src/apothem/commands/code-review.md +193 -0
- package/src/apothem/commands/dependency-audit.md +209 -0
- package/src/apothem/commands/docs-review.md +199 -0
- package/src/apothem/commands/elevate.md +285 -0
- package/src/apothem/commands/eval.md +149 -0
- package/src/apothem/commands/fortress.md +172 -0
- package/src/apothem/commands/freshify.md +168 -0
- package/src/apothem/commands/github-deploy-fresh.md +178 -0
- package/src/apothem/commands/github-deploy-next.md +167 -0
- package/src/apothem/commands/perf-audit.md +198 -0
- package/src/apothem/commands/plan-amend.md +104 -0
- package/src/apothem/commands/plan-audit.md +127 -0
- package/src/apothem/commands/plan-design.md +257 -0
- package/src/apothem/commands/plan-execute.md +495 -0
- package/src/apothem/commands/plan-generate.md +351 -0
- package/src/apothem/commands/plan-review.md +555 -0
- package/src/apothem/commands/plan-spec.md +359 -0
- package/src/apothem/commands/plan-status.md +222 -0
- package/src/apothem/commands/plan.md +173 -0
- package/src/apothem/commands/projectify.md +142 -0
- package/src/apothem/commands/release-readiness.md +142 -0
- package/src/apothem/commands/research-analysis.md +241 -0
- package/src/apothem/commands/research-design.md +231 -0
- package/src/apothem/commands/research-disseminate.md +225 -0
- package/src/apothem/commands/research-experiment.md +232 -0
- package/src/apothem/commands/research-ideate.md +213 -0
- package/src/apothem/commands/research-paper.md +252 -0
- package/src/apothem/commands/research-proposal.md +220 -0
- package/src/apothem/commands/research-publish.md +255 -0
- package/src/apothem/commands/research-review.md +251 -0
- package/src/apothem/commands/research-sources.md +266 -0
- package/src/apothem/commands/research-spec.md +255 -0
- package/src/apothem/commands/research-synthesis.md +233 -0
- package/src/apothem/commands/research-theory.md +218 -0
- package/src/apothem/commands/research.md +181 -0
- package/src/apothem/commands/security-audit.md +196 -0
- package/src/apothem/commands/supply-chain-audit.md +192 -0
- package/src/apothem/commands/test-suite.md +146 -0
- package/src/apothem/commands/threat-model-audit.md +199 -0
- package/src/apothem/commands/ux-review.md +202 -0
- package/src/apothem/commands/workflow.md +162 -0
- package/src/apothem/conformity/README.md +173 -0
- package/src/apothem/conformity/__init__.py +1 -0
- package/src/apothem/conformity/_grep_base.py +93 -0
- package/src/apothem/conformity/agent_capability_grep.py +306 -0
- package/src/apothem/conformity/agents_md_coverage_grep.py +382 -0
- package/src/apothem/conformity/agnosticism_grep.py +311 -0
- package/src/apothem/conformity/always_on_budget_grep.py +318 -0
- package/src/apothem/conformity/bare_except_grep.py +115 -0
- package/src/apothem/conformity/binding_reciprocity_grep.py +151 -0
- package/src/apothem/conformity/brand_mark_grep.py +272 -0
- package/src/apothem/conformity/commented_out_code_grep.py +176 -0
- package/src/apothem/conformity/completion_claim_grep.py +169 -0
- package/src/apothem/conformity/conventional_commit_grep.py +319 -0
- package/src/apothem/conformity/copilot_instructions_presence_grep.py +324 -0
- package/src/apothem/conformity/cross_platform_matrix_grep.py +297 -0
- package/src/apothem/conformity/determinism_grep.py +306 -0
- package/src/apothem/conformity/diagram_staleness_grep.py +154 -0
- package/src/apothem/conformity/dynamism_grep.py +284 -0
- package/src/apothem/conformity/editorconfig_presence_grep.py +281 -0
- package/src/apothem/conformity/file_header_grep.py +502 -0
- package/src/apothem/conformity/freshness_token_grep.py +233 -0
- package/src/apothem/conformity/frontmatter_grep.py +274 -0
- package/src/apothem/conformity/frontmatter_value_grep.py +386 -0
- package/src/apothem/conformity/gate.py +1386 -0
- package/src/apothem/conformity/gitattributes_presence_grep.py +238 -0
- package/src/apothem/conformity/harden_runner_grep.py +320 -0
- package/src/apothem/conformity/hedging_grep.py +129 -0
- package/src/apothem/conformity/license_author_consistency_grep.py +204 -0
- package/src/apothem/conformity/link_check.py +327 -0
- package/src/apothem/conformity/magic_number_grep.py +182 -0
- package/src/apothem/conformity/multi_surface_coherence_grep.py +620 -0
- package/src/apothem/conformity/naming_grep.py +224 -0
- package/src/apothem/conformity/no_global_plans_grep.py +339 -0
- package/src/apothem/conformity/no_toplevel_docs_grep.py +120 -0
- package/src/apothem/conformity/oidc_trusted_publishing_grep.py +291 -0
- package/src/apothem/conformity/option_annotation_grep.py +352 -0
- package/src/apothem/conformity/orphan_output_grep.py +206 -0
- package/src/apothem/conformity/permissions_minimum_scope_grep.py +299 -0
- package/src/apothem/conformity/plain_language_grep.py +559 -0
- package/src/apothem/conformity/plan_next_step_consistency_grep.py +450 -0
- package/src/apothem/conformity/plan_suite_structure_grep.py +534 -0
- package/src/apothem/conformity/plans_discipline_language_grep.py +245 -0
- package/src/apothem/conformity/production_ready_pr_grep.py +200 -0
- package/src/apothem/conformity/recommend_next_step_grep.py +250 -0
- package/src/apothem/conformity/redundancy_grep.py +401 -0
- package/src/apothem/conformity/reference_token_grep.py +230 -0
- package/src/apothem/conformity/registry_capability_consistency_grep.py +368 -0
- package/src/apothem/conformity/secret_leak_grep.py +193 -0
- package/src/apothem/conformity/semver_stability_grep.py +358 -0
- package/src/apothem/conformity/smoke_install_grep.py +194 -0
- package/src/apothem/conformity/static_version_grep.py +284 -0
- package/src/apothem/conformity/token_efficiency_grep.py +185 -0
- package/src/apothem/conformity/unpinned_action_grep.py +115 -0
- package/src/apothem/conformity/user_confirm_grep.py +74 -0
- package/src/apothem/conformity/workflow_concurrency_grep.py +283 -0
- package/src/apothem/harnesses/README.md +63 -0
- package/src/apothem/harnesses/__init__.py +16 -0
- package/src/apothem/harnesses/_shared/README.md +36 -0
- package/src/apothem/harnesses/_shared/__init__.py +12 -0
- package/src/apothem/harnesses/_shared/install_driver.py +281 -0
- package/src/apothem/harnesses/_shared/install_driver_apply.py +612 -0
- package/src/apothem/harnesses/_shared/install_driver_backup.py +535 -0
- package/src/apothem/harnesses/_shared/install_driver_converters.py +310 -0
- package/src/apothem/harnesses/_shared/install_driver_lifecycle.py +495 -0
- package/src/apothem/harnesses/_shared/install_driver_materialize.py +675 -0
- package/src/apothem/harnesses/_shared/install_driver_merge.py +656 -0
- package/src/apothem/harnesses/_shared/install_driver_pathsafety.py +137 -0
- package/src/apothem/harnesses/_shared/install_driver_planvalidation.py +240 -0
- package/src/apothem/harnesses/_shared/install_driver_removal.py +366 -0
- package/src/apothem/harnesses/_shared/install_driver_treeops.py +248 -0
- package/src/apothem/harnesses/_shared/install_driver_types.py +330 -0
- package/src/apothem/harnesses/_shared/wrapper_factories.py +448 -0
- package/src/apothem/harnesses/antigravity/STANDARD-CONVENTION-PIN.md +91 -0
- package/src/apothem/harnesses/antigravity/__init__.py +70 -0
- package/src/apothem/harnesses/antigravity/capabilities.yml +40 -0
- package/src/apothem/harnesses/antigravity/install.py +63 -0
- package/src/apothem/harnesses/antigravity/templates/GEMINI.md +40 -0
- package/src/apothem/harnesses/antigravity/templates/plugin.json +5 -0
- package/src/apothem/harnesses/antigravity/uninstall.py +22 -0
- package/src/apothem/harnesses/antigravity/update.py +10 -0
- package/src/apothem/harnesses/antigravity/verify.py +11 -0
- package/src/apothem/harnesses/claude_code/STANDARD-CONVENTION-PIN.md +65 -0
- package/src/apothem/harnesses/claude_code/__init__.py +107 -0
- package/src/apothem/harnesses/claude_code/capabilities.yml +42 -0
- package/src/apothem/harnesses/claude_code/install.py +147 -0
- package/src/apothem/harnesses/claude_code/templates/settings.json +351 -0
- package/src/apothem/harnesses/claude_code/uninstall.py +23 -0
- package/src/apothem/harnesses/claude_code/update.py +10 -0
- package/src/apothem/harnesses/claude_code/verify.py +11 -0
- package/src/apothem/harnesses/codebuddy/STANDARD-CONVENTION-PIN.md +74 -0
- package/src/apothem/harnesses/codebuddy/__init__.py +49 -0
- package/src/apothem/harnesses/codebuddy/capabilities.yml +34 -0
- package/src/apothem/harnesses/codebuddy/install.py +40 -0
- package/src/apothem/harnesses/codebuddy/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/codebuddy/uninstall.py +25 -0
- package/src/apothem/harnesses/codebuddy/update.py +10 -0
- package/src/apothem/harnesses/codebuddy/verify.py +11 -0
- package/src/apothem/harnesses/codex/STANDARD-CONVENTION-PIN.md +79 -0
- package/src/apothem/harnesses/codex/__init__.py +72 -0
- package/src/apothem/harnesses/codex/capabilities.yml +40 -0
- package/src/apothem/harnesses/codex/install.py +69 -0
- package/src/apothem/harnesses/codex/templates/AGENTS.md +40 -0
- package/src/apothem/harnesses/codex/templates/hooks.json +127 -0
- package/src/apothem/harnesses/codex/uninstall.py +23 -0
- package/src/apothem/harnesses/codex/update.py +10 -0
- package/src/apothem/harnesses/codex/verify.py +11 -0
- package/src/apothem/harnesses/cursor/STANDARD-CONVENTION-PIN.md +79 -0
- package/src/apothem/harnesses/cursor/__init__.py +48 -0
- package/src/apothem/harnesses/cursor/capabilities.yml +42 -0
- package/src/apothem/harnesses/cursor/install.py +38 -0
- package/src/apothem/harnesses/cursor/templates/apothem-rules.mdc +40 -0
- package/src/apothem/harnesses/cursor/uninstall.py +25 -0
- package/src/apothem/harnesses/cursor/update.py +10 -0
- package/src/apothem/harnesses/cursor/verify.py +11 -0
- package/src/apothem/harnesses/gemini_cli/STANDARD-CONVENTION-PIN.md +102 -0
- package/src/apothem/harnesses/gemini_cli/__init__.py +52 -0
- package/src/apothem/harnesses/gemini_cli/capabilities.yml +43 -0
- package/src/apothem/harnesses/gemini_cli/install.py +43 -0
- package/src/apothem/harnesses/gemini_cli/templates/GEMINI.md +38 -0
- package/src/apothem/harnesses/gemini_cli/uninstall.py +25 -0
- package/src/apothem/harnesses/gemini_cli/update.py +10 -0
- package/src/apothem/harnesses/gemini_cli/verify.py +11 -0
- package/src/apothem/harnesses/github_copilot/STANDARD-CONVENTION-PIN.md +84 -0
- package/src/apothem/harnesses/github_copilot/__init__.py +47 -0
- package/src/apothem/harnesses/github_copilot/capabilities.yml +42 -0
- package/src/apothem/harnesses/github_copilot/install.py +40 -0
- package/src/apothem/harnesses/github_copilot/templates/copilot-instructions.md +33 -0
- package/src/apothem/harnesses/github_copilot/uninstall.py +25 -0
- package/src/apothem/harnesses/github_copilot/update.py +10 -0
- package/src/apothem/harnesses/github_copilot/verify.py +11 -0
- package/src/apothem/harnesses/glm/STANDARD-CONVENTION-PIN.md +77 -0
- package/src/apothem/harnesses/glm/__init__.py +56 -0
- package/src/apothem/harnesses/glm/capabilities.yml +33 -0
- package/src/apothem/harnesses/glm/install.py +45 -0
- package/src/apothem/harnesses/glm/templates/glm.toml +58 -0
- package/src/apothem/harnesses/glm/uninstall.py +25 -0
- package/src/apothem/harnesses/glm/update.py +10 -0
- package/src/apothem/harnesses/glm/verify.py +11 -0
- package/src/apothem/harnesses/hermes/STANDARD-CONVENTION-PIN.md +57 -0
- package/src/apothem/harnesses/hermes/__init__.py +33 -0
- package/src/apothem/harnesses/hermes/capabilities.yml +36 -0
- package/src/apothem/harnesses/hermes/install.py +17 -0
- package/src/apothem/harnesses/hermes/materializer.py +35 -0
- package/src/apothem/harnesses/hermes/uninstall.py +33 -0
- package/src/apothem/harnesses/hermes/update.py +10 -0
- package/src/apothem/harnesses/hermes/verify.py +11 -0
- package/src/apothem/harnesses/kimi_code/STANDARD-CONVENTION-PIN.md +128 -0
- package/src/apothem/harnesses/kimi_code/__init__.py +59 -0
- package/src/apothem/harnesses/kimi_code/capabilities.yml +40 -0
- package/src/apothem/harnesses/kimi_code/install.py +42 -0
- package/src/apothem/harnesses/kimi_code/templates/AGENTS.md +43 -0
- package/src/apothem/harnesses/kimi_code/uninstall.py +27 -0
- package/src/apothem/harnesses/kimi_code/update.py +10 -0
- package/src/apothem/harnesses/kimi_code/verify.py +11 -0
- package/src/apothem/harnesses/kiro/STANDARD-CONVENTION-PIN.md +77 -0
- package/src/apothem/harnesses/kiro/__init__.py +49 -0
- package/src/apothem/harnesses/kiro/capabilities.yml +36 -0
- package/src/apothem/harnesses/kiro/install.py +39 -0
- package/src/apothem/harnesses/kiro/templates/apothem-rules.md +36 -0
- package/src/apothem/harnesses/kiro/uninstall.py +25 -0
- package/src/apothem/harnesses/kiro/update.py +10 -0
- package/src/apothem/harnesses/kiro/verify.py +11 -0
- package/src/apothem/harnesses/open_claw/STANDARD-CONVENTION-PIN.md +62 -0
- package/src/apothem/harnesses/open_claw/__init__.py +35 -0
- package/src/apothem/harnesses/open_claw/capabilities.yml +35 -0
- package/src/apothem/harnesses/open_claw/install.py +17 -0
- package/src/apothem/harnesses/open_claw/materializer.py +36 -0
- package/src/apothem/harnesses/open_claw/uninstall.py +32 -0
- package/src/apothem/harnesses/open_claw/update.py +10 -0
- package/src/apothem/harnesses/open_claw/verify.py +11 -0
- package/src/apothem/harnesses/opencode/STANDARD-CONVENTION-PIN.md +76 -0
- package/src/apothem/harnesses/opencode/__init__.py +35 -0
- package/src/apothem/harnesses/opencode/capabilities.yml +43 -0
- package/src/apothem/harnesses/opencode/install.py +17 -0
- package/src/apothem/harnesses/opencode/materializer.py +31 -0
- package/src/apothem/harnesses/opencode/uninstall.py +34 -0
- package/src/apothem/harnesses/opencode/update.py +10 -0
- package/src/apothem/harnesses/opencode/verify.py +11 -0
- package/src/apothem/harnesses/qwen_code/STANDARD-CONVENTION-PIN.md +87 -0
- package/src/apothem/harnesses/qwen_code/__init__.py +37 -0
- package/src/apothem/harnesses/qwen_code/capabilities.yml +43 -0
- package/src/apothem/harnesses/qwen_code/install.py +19 -0
- package/src/apothem/harnesses/qwen_code/materializer.py +174 -0
- package/src/apothem/harnesses/qwen_code/templates/QWEN.md +30 -0
- package/src/apothem/harnesses/qwen_code/uninstall.py +34 -0
- package/src/apothem/harnesses/qwen_code/update.py +10 -0
- package/src/apothem/harnesses/qwen_code/verify.py +11 -0
- package/src/apothem/harnesses/trae/STANDARD-CONVENTION-PIN.md +70 -0
- package/src/apothem/harnesses/trae/__init__.py +49 -0
- package/src/apothem/harnesses/trae/capabilities.yml +34 -0
- package/src/apothem/harnesses/trae/install.py +38 -0
- package/src/apothem/harnesses/trae/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/trae/uninstall.py +25 -0
- package/src/apothem/harnesses/trae/update.py +10 -0
- package/src/apothem/harnesses/trae/verify.py +11 -0
- package/src/apothem/harnesses/windsurf/STANDARD-CONVENTION-PIN.md +91 -0
- package/src/apothem/harnesses/windsurf/__init__.py +52 -0
- package/src/apothem/harnesses/windsurf/capabilities.yml +40 -0
- package/src/apothem/harnesses/windsurf/install.py +41 -0
- package/src/apothem/harnesses/windsurf/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/windsurf/uninstall.py +25 -0
- package/src/apothem/harnesses/windsurf/update.py +10 -0
- package/src/apothem/harnesses/windsurf/verify.py +11 -0
- package/src/apothem/harnesses/zed/STANDARD-CONVENTION-PIN.md +92 -0
- package/src/apothem/harnesses/zed/__init__.py +57 -0
- package/src/apothem/harnesses/zed/capabilities.yml +38 -0
- package/src/apothem/harnesses/zed/install.py +41 -0
- package/src/apothem/harnesses/zed/templates/apothem-rules.md +32 -0
- package/src/apothem/harnesses/zed/uninstall.py +28 -0
- package/src/apothem/harnesses/zed/update.py +10 -0
- package/src/apothem/harnesses/zed/verify.py +11 -0
- package/src/apothem/hooks/README.md +81 -0
- package/src/apothem/hooks/__init__.py +24 -0
- package/src/apothem/hooks/askuserquestion_validator.py +380 -0
- package/src/apothem/hooks/dispatch.py +296 -0
- package/src/apothem/hooks/emit_hook_context.py +444 -0
- package/src/apothem/hooks/hooks.json +318 -0
- package/src/apothem/hooks/lib/README.md +39 -0
- package/src/apothem/hooks/lib/__init__.py +18 -0
- package/src/apothem/hooks/lib/bootstrap.ps1 +129 -0
- package/src/apothem/hooks/lib/bootstrap.sh +103 -0
- package/src/apothem/hooks/lib/events.py +51 -0
- package/src/apothem/hooks/lib/find-pwsh.ps1 +78 -0
- package/src/apothem/hooks/lib/find-pwsh.sh +76 -0
- package/src/apothem/hooks/lib/find-python.ps1 +63 -0
- package/src/apothem/hooks/lib/find-python.sh +97 -0
- package/src/apothem/hooks/lib/log.py +43 -0
- package/src/apothem/hooks/lib/resolve_root.py +264 -0
- package/src/apothem/hooks/messages/postcompact.md +14 -0
- package/src/apothem/hooks/messages/posttooluse-proactive-compaction.md +46 -0
- package/src/apothem/hooks/messages/precompact.md +14 -0
- package/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md +65 -0
- package/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md +97 -0
- package/src/apothem/hooks/messages/pretooluse-bash.md +39 -0
- package/src/apothem/hooks/messages/pretooluse-conformity.md +70 -0
- package/src/apothem/hooks/messages/pretooluse-dependency-guard.md +21 -0
- package/src/apothem/hooks/messages/pretooluse-edit-header-guard.md +61 -0
- package/src/apothem/hooks/messages/pretooluse-edit.md +21 -0
- package/src/apothem/hooks/messages/pretooluse-eval-guard.md +39 -0
- package/src/apothem/hooks/messages/pretooluse-notebookedit.md +11 -0
- package/src/apothem/hooks/messages/pretooluse-write-header-guard.md +45 -0
- package/src/apothem/hooks/messages/pretooluse-write-plan-guard.md +72 -0
- package/src/apothem/hooks/messages/pretooluse-write.md +21 -0
- package/src/apothem/hooks/messages/sessionstart.md +15 -0
- package/src/apothem/hooks/messages/stop.md +27 -0
- package/src/apothem/hooks/proactive_compaction_tracker.py +327 -0
- package/src/apothem/hooks/session_start_bootstrap.py +472 -0
- package/src/apothem/lib/README.md +42 -0
- package/src/apothem/lib/__init__.py +13 -0
- package/src/apothem/lib/atomic_io.py +189 -0
- package/src/apothem/lib/auditor.py +687 -0
- package/src/apothem/lib/clean_slate.py +396 -0
- package/src/apothem/lib/contexts.py +352 -0
- package/src/apothem/lib/data_home.py +255 -0
- package/src/apothem/lib/frontmatter.py +101 -0
- package/src/apothem/lib/harness_materializer.py +213 -0
- package/src/apothem/lib/harness_protocol.py +59 -0
- package/src/apothem/lib/harness_registry.py +282 -0
- package/src/apothem/lib/harness_registry_data.py +843 -0
- package/src/apothem/lib/install_ledger.py +347 -0
- package/src/apothem/lib/learning.py +540 -0
- package/src/apothem/lib/memory.py +347 -0
- package/src/apothem/lib/parallel_sweep.py +234 -0
- package/src/apothem/lib/plan_tiers.py +200 -0
- package/src/apothem/lib/plugin_bootstrap.py +132 -0
- package/src/apothem/lib/plugin_tree.py +599 -0
- package/src/apothem/lib/profile.py +755 -0
- package/src/apothem/lib/profile_projection.py +198 -0
- package/src/apothem/lib/propagation-manifest.yaml +878 -0
- package/src/apothem/lib/propagation.py +220 -0
- package/src/apothem/lib/python_resolver.py +189 -0
- package/src/apothem/lib/reporter.py +62 -0
- package/src/apothem/lib/workspace_migration.py +323 -0
- package/src/apothem/output-styles/README.md +41 -0
- package/src/apothem/output-styles/concise-engineer.md +49 -0
- package/src/apothem/output-styles/default-architect.md +52 -0
- package/src/apothem/output-styles/default.md +113 -0
- package/src/apothem/output-styles/forensic-auditor.md +63 -0
- package/src/apothem/py.typed +0 -0
- package/src/apothem/rules/README.md +121 -0
- package/src/apothem/rules/agent-capability-discipline-matrix.md +89 -0
- package/src/apothem/rules/agent-capability-discipline.md +78 -0
- package/src/apothem/rules/agent-orchestration-patterns.md +144 -0
- package/src/apothem/rules/agent-orchestration.md +65 -0
- package/src/apothem/rules/agents-md-convention.md +86 -0
- package/src/apothem/rules/agile-sprints-elements.md +135 -0
- package/src/apothem/rules/agile-sprints.md +64 -0
- package/src/apothem/rules/agnostic-posture-checklist.md +47 -0
- package/src/apothem/rules/agnostic-posture.md +48 -0
- package/src/apothem/rules/authoritative-referencing-quotation.md +50 -0
- package/src/apothem/rules/authoritative-referencing.md +66 -0
- package/src/apothem/rules/authority-inquiry-categories.md +58 -0
- package/src/apothem/rules/authority-inquiry.md +54 -0
- package/src/apothem/rules/auto-memory-topic-files.md +86 -0
- package/src/apothem/rules/auto-memory.md +67 -0
- package/src/apothem/rules/bidirectional-binding.md +123 -0
- package/src/apothem/rules/canonical-layout-reporting-tiers.md +212 -0
- package/src/apothem/rules/canonical-layout.md +60 -0
- package/src/apothem/rules/clean-architecture-layers.md +186 -0
- package/src/apothem/rules/clean-room-generation-protocols.md +124 -0
- package/src/apothem/rules/clean-room-generation.md +59 -0
- package/src/apothem/rules/code-craft-conventions.md +101 -0
- package/src/apothem/rules/code-craft-markdown.md +138 -0
- package/src/apothem/rules/code-craft-python.md +154 -0
- package/src/apothem/rules/code-craft-shell.md +192 -0
- package/src/apothem/rules/cognitive-identity-techniques.md +180 -0
- package/src/apothem/rules/cognitive-identity.md +81 -0
- package/src/apothem/rules/context-management-budget.md +46 -0
- package/src/apothem/rules/context-management-protocol.md +161 -0
- package/src/apothem/rules/context-management-scratch.md +128 -0
- package/src/apothem/rules/context-management.md +85 -0
- package/src/apothem/rules/definitiveness-virtues.md +67 -0
- package/src/apothem/rules/definitiveness.md +58 -0
- package/src/apothem/rules/determinism.md +81 -0
- package/src/apothem/rules/disclosure-ledger-markers.md +58 -0
- package/src/apothem/rules/disclosure-ledger.md +52 -0
- package/src/apothem/rules/dynamism.md +38 -0
- package/src/apothem/rules/etc-extension.md +57 -0
- package/src/apothem/rules/expertise-posture-elements.md +68 -0
- package/src/apothem/rules/expertise-posture.md +54 -0
- package/src/apothem/rules/freshness-facade.md +64 -0
- package/src/apothem/rules/harness-adapter-shape-schemas.md +162 -0
- package/src/apothem/rules/harness-adapter-shape.md +42 -0
- package/src/apothem/rules/host-discovery-manifests.md +50 -0
- package/src/apothem/rules/host-discovery.md +56 -0
- package/src/apothem/rules/i18n-discipline-locale-cohorts.md +120 -0
- package/src/apothem/rules/i18n-discipline.md +70 -0
- package/src/apothem/rules/interactive-questions-canonical-shapes.md +590 -0
- package/src/apothem/rules/interactive-questions-detail.md +41 -0
- package/src/apothem/rules/interactive-questions-sweep-matchers.md +184 -0
- package/src/apothem/rules/interactive-questions.md +89 -0
- package/src/apothem/rules/large-file-generation.md +112 -0
- package/src/apothem/rules/large-file-reading.md +59 -0
- package/src/apothem/rules/living-docs.md +85 -0
- package/src/apothem/rules/multi-agent-workflow.md +57 -0
- package/src/apothem/rules/operational-mandates-expanded.md +78 -0
- package/src/apothem/rules/operational-mandates.md +88 -0
- package/src/apothem/rules/option-annotation-form.md +60 -0
- package/src/apothem/rules/option-annotation.md +45 -0
- package/src/apothem/rules/own-voice-reimplementation.md +86 -0
- package/src/apothem/rules/performance-discipline.md +91 -0
- package/src/apothem/rules/persistent-conventions-vigilance-checklist.md +54 -0
- package/src/apothem/rules/persistent-conventions-vigilance.md +61 -0
- package/src/apothem/rules/plain-language.md +56 -0
- package/src/apothem/rules/planning-techniques.md +130 -0
- package/src/apothem/rules/pre-emission-gate-bars.md +86 -0
- package/src/apothem/rules/pre-emission-gate.md +54 -0
- package/src/apothem/rules/production-ready-prs-surfaces.md +162 -0
- package/src/apothem/rules/production-ready-prs.md +83 -0
- package/src/apothem/rules/propagation.md +63 -0
- package/src/apothem/rules/recommend-next-step.md +106 -0
- package/src/apothem/rules/refactoring-discipline.md +76 -0
- package/src/apothem/rules/session-closure.md +44 -0
- package/src/apothem/rules/sota-elevation-exemplars.md +76 -0
- package/src/apothem/rules/sota-elevation.md +52 -0
- package/src/apothem/rules/source-accessibility.md +58 -0
- package/src/apothem/rules/surgical-manipulation.md +48 -0
- package/src/apothem/rules/systemic-participation-relations.md +108 -0
- package/src/apothem/rules/systemic-participation.md +70 -0
- package/src/apothem/rules/ten-dimension-check-dimensions.md +52 -0
- package/src/apothem/rules/ten-dimension-check.md +59 -0
- package/src/apothem/rules/token-budget-discipline.md +81 -0
- package/src/apothem/rules/token-efficiency-rewrite-protocol.md +79 -0
- package/src/apothem/rules/token-efficiency-rewrite.md +77 -0
- package/src/apothem/rules/tool-use-discipline.md +48 -0
- package/src/apothem/rules/visual-leverage.md +102 -0
- package/src/apothem/schemas/NOTICE.md +9 -0
- package/src/apothem/schemas/README.md +104 -0
- package/src/apothem/schemas/__init__.py +176 -0
- package/src/apothem/schemas/advisory-finding.schema.json +111 -0
- package/src/apothem/schemas/agent.schema.json +106 -0
- package/src/apothem/schemas/authorship-header.txt +1 -0
- package/src/apothem/schemas/cohort-manifest.yaml +248 -0
- package/src/apothem/schemas/cohort-metadata-vocabulary.yaml +168 -0
- package/src/apothem/schemas/cohort.schema.json +113 -0
- package/src/apothem/schemas/command.schema.json +68 -0
- package/src/apothem/schemas/compatibility-matrix.yaml +432 -0
- package/src/apothem/schemas/context-fragment.schema.json +64 -0
- package/src/apothem/schemas/freshness-token-denylist.txt +51 -0
- package/src/apothem/schemas/handoff-manifest.yaml +353 -0
- package/src/apothem/schemas/header-exceptions.txt +141 -0
- package/src/apothem/schemas/header-visibility.yaml +39 -0
- package/src/apothem/schemas/learning-signal.schema.json +46 -0
- package/src/apothem/schemas/memory-record.schema.json +61 -0
- package/src/apothem/schemas/output-style.schema.json +40 -0
- package/src/apothem/schemas/plan.schema.json +51 -0
- package/src/apothem/schemas/plugin.schema.json +83 -0
- package/src/apothem/schemas/profile.example.yaml +70 -0
- package/src/apothem/schemas/profile.minimal.yaml +6 -0
- package/src/apothem/schemas/profile.schema.json +396 -0
- package/src/apothem/schemas/reference-token-denylist.txt +25 -0
- package/src/apothem/schemas/skill.schema.json +75 -0
- package/src/apothem/skills/README.md +93 -0
- package/src/apothem/skills/dependency-upgrade/SKILL.md +105 -0
- package/src/apothem/skills/dev-toolkit/SKILL.md +120 -0
- package/src/apothem/skills/diagram-authoring/SKILL.md +113 -0
- package/src/apothem/skills/document-authoring/SKILL.md +118 -0
- package/src/apothem/skills/ecosystem-audit/SKILL.md +108 -0
- package/src/apothem/skills/ecosystem-audit/references/audit-fortress.md +85 -0
- package/src/apothem/skills/ecosystem-audit/references/procedure.md +162 -0
- package/src/apothem/skills/eval-harness/SKILL.md +88 -0
- package/src/apothem/skills/incident-runbook/SKILL.md +92 -0
- package/src/apothem/skills/multi-source-research/SKILL.md +90 -0
- package/src/apothem/skills/plan-suite/SKILL.md +118 -0
- package/src/apothem/skills/plan-suite/master_template.md +1324 -0
- package/src/apothem/skills/projectify/SKILL.md +117 -0
- package/src/apothem/skills/prompt-engineering/SKILL.md +122 -0
- package/src/apothem/skills/refactor-extract/SKILL.md +85 -0
- package/src/apothem/skills/research-suite/SKILL.md +170 -0
- package/src/apothem/skills/research-suite/references/directory-structure.md +47 -0
- package/src/apothem/skills/research-suite/references/lifecycle.md +67 -0
- package/src/apothem/skills/research-suite/references/principal-investigator-framework.md +37 -0
- package/src/apothem/skills/research-suite/references/rigor-mandates.md +30 -0
- package/src/apothem/skills/research-suite/research_template.md +476 -0
- package/src/apothem/skills/secret-rotation/SKILL.md +87 -0
- package/src/apothem/skills/source-synthesis/SKILL.md +92 -0
- package/src/apothem/skills/surgical-guard/SKILL.md +118 -0
- package/src/apothem/skills/test-authoring/SKILL.md +85 -0
- package/src/apothem/skills/vuln-triage/SKILL.md +91 -0
- package/src/apothem/skills/workflow/SKILL.md +139 -0
- package/src/apothem/statuslines/README.md +26 -0
- package/src/apothem/statuslines/__init__.py +20 -0
- package/src/apothem/statuslines/conformity.json +5 -0
- package/src/apothem/statuslines/render.py +334 -0
- package/src/apothem/statuslines/statusline.md +50 -0
- package/src/apothem/templates/README.md +43 -0
- package/src/apothem/templates/agents-md-template.md +80 -0
- package/src/apothem/templates/consideration-log.md +39 -0
- package/src/apothem/templates/expertise-gap-log.md +56 -0
- package/src/apothem/templates/master-index-template.md +93 -0
- package/src/apothem/templates/potency-map.md +53 -0
- package/src/apothem/templates/preservation-audit.md +60 -0
- package/src/apothem/templates/question-resolution-audit.md +52 -0
- package/src/apothem/templates/trace-matrix-template.md +77 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "host-discovery"
|
|
3
|
+
description: "Discover host-project conventions before emitting any artifact — language, formatter, linter, layout, naming, idioms, sibling-file patterns. Honor discoveries; surface silence as an authoritative inquiry per the canonical channel."
|
|
4
|
+
pathFilter: ""
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
9
|
+
|
|
10
|
+
# Rule: Host-Project Agnosticism & Convention Discovery
|
|
11
|
+
|
|
12
|
+
## What this rule enforces
|
|
13
|
+
|
|
14
|
+
This rule binds **M1 — Host-Project Agnosticism & Convention Discovery** (and the discovery half of **M5 — Authority Principle**). Whatever the ecosystem produces in a host project is shaped by what that project already is. Every convention — stack, language, framework, toolchain, formatter, linter, test framework, docs generator, CI platform, branch strategy, commit convention, layout, naming, dependency-pinning policy, release-signing mechanism, versioning scheme, line endings, indentation, quote style, license, copyright header — is **discovered** from the host's ratified source-of-truth (manifests, lock files, config files, sibling files of comparable kind, convention documents) and **honored**. Where the host is silent on a convention the agent must adopt to act, the silence is surfaced as an authoritative inquiry per `rules/authority-inquiry.md` with the recommended option annotated per `rules/option-annotation.md` — never resolved by a silent internal default.
|
|
15
|
+
|
|
16
|
+
## Pre-conditions
|
|
17
|
+
|
|
18
|
+
Applies whenever any host-project artifact is authored, modified, retrofitted, extended, or removed. Trivial work (single-file edit ≤ 5 lines AND no public-API change AND no behavioral shift, per the trivial-vs-non-trivial threshold) is exempt from the discovery surface but still honors idioms visible at the touch site. Ecosystem-internal authoring inside the apothem source repo is governed by `CLAUDE.md` user-scope conventions, not this outward-discovery rule.
|
|
19
|
+
|
|
20
|
+
## Required behavior
|
|
21
|
+
|
|
22
|
+
### 1. Discover before authoring
|
|
23
|
+
|
|
24
|
+
Before any artifact is written or edited, the agent MUST walk the host's ratified source-of-truth files for the artifact's class. (Companion Sub-Rule Anchor) See `rules/host-discovery-manifests.md` §1 for the per-language manifest catalog (Python / TypeScript-JavaScript / Rust / Go / Shell / CI / Docs).
|
|
25
|
+
|
|
26
|
+
### 2. Honor discovered conventions
|
|
27
|
+
|
|
28
|
+
The artifact MUST be indistinguishable from one a long-tenured contributor of the host project would have written. When editing, the agent MUST preserve the surrounding idioms even where it would idiomatically choose otherwise. When creating a file class the host lacks, the agent MUST surface the choice as an inquiry per `rules/authority-inquiry.md` — never silently install an agent-internal default. The host's own `lint` / `format` / `test` / `type-check` commands MUST pass the artifact unmodified.
|
|
29
|
+
|
|
30
|
+
### 3. Surface silence
|
|
31
|
+
|
|
32
|
+
Where the host is silent on a convention the agent must adopt to proceed, the agent MUST route the choice through the canonical inquiry surface at `rules/authority-inquiry.md` with the recommended option annotated per `rules/option-annotation.md`. Required inquiries (identity, scope direction, security, naming-of-public-surfaces) block emission until answered. Optional inquiries fall back to the recommended option and record the fallback as a ledger finding.
|
|
33
|
+
|
|
34
|
+
### 4. Discovery record
|
|
35
|
+
|
|
36
|
+
Every discovery and every inquiry-driven choice MUST be recorded with provenance in the artifact's working trace. (Companion Sub-Rule Anchor) See `rules/host-discovery-manifests.md` §2 for the discovery-record provenance schema.
|
|
37
|
+
|
|
38
|
+
## Disclosure surface
|
|
39
|
+
|
|
40
|
+
The discovery record and any inquiry-driven choices are disclosed per `rules/disclosure-ledger.md`:
|
|
41
|
+
|
|
42
|
+
- `[Discovery — source: <path>; value: <discovered>; honored]` for every discovered convention applied.
|
|
43
|
+
- `[Inquiry — id: <inquiry-id>; outcome: <user-choice|fallback-to-recommended>]` for every inquiry-resolved choice.
|
|
44
|
+
- `[Default — applied: <auto-decision>; class: <carve-out class per `authority-inquiry.md`>]` for the carve-out class (pure validity, pure rigor, universally-safe security, pure formatting normalization, internal reference repair).
|
|
45
|
+
|
|
46
|
+
## Failure tells
|
|
47
|
+
|
|
48
|
+
(Companion Sub-Rule Anchor) See `rules/host-discovery-manifests.md` §3 for the failure-tells enumeration (Python / Markdown / pytest / shell / CI / commit / package.json / MCP / file-class drift).
|
|
49
|
+
|
|
50
|
+
## Bindings (§0.j five-direction)
|
|
51
|
+
|
|
52
|
+
- **Drives →** Every host-project artifact emission across every ecosystem surface (commands, skills, agents, hooks). The discovery sub-phase that opens every `commands/*.md` artifact-emitting workflow per the fifteen-mandate registry row M1. The discover-don't-assume preamble of every `skills/*/SKILL.md` artifact-emitting procedure. The pre-write idiom-divergence checks at `conformity/` mechanical greps.
|
|
53
|
+
- **Satisfies →** the fifteen-mandate registry row **M1 — Host-Project Agnosticism**. `rules/authority-inquiry.md` — the discovery half closes the data side that the inquiry surface complements.
|
|
54
|
+
- **Established by ↑** the fifteen-mandate registry (ratifies M1). The host's ratified source-of-truth files (the discovery's primary surface).
|
|
55
|
+
- **Gated by ←** `CLAUDE.md` always-loaded preamble. The §8.1 trivial-vs-non-trivial threshold (trivial work is exempt from the discovery surface).
|
|
56
|
+
- **Cross-bound with ↔** `rules/host-discovery-manifests.md` (path-filtered companion sub-rule carrying the §1 per-language manifest catalog, §4 discovery-record schema, and Failure-tells enumeration). `rules/authority-inquiry.md` (M5 inquiry half — when discovery encounters silence, route through the inquiry surface). `rules/disclosure-ledger.md` (M2 — every discovery and every inquiry outcome is recorded in the ledger). `rules/option-annotation.md` (M7 — every multi-option inquiry carries the recommended marker). `rules/operational-mandates.md` §CM-2 Zero Assumptions (host-discovery is the outward-projection form of CM-2's inward-facing inquiry discipline). `rules/dynamism.md` (sibling discipline; dynamic source-of-truth surfaces are M1-discovered before rendering is wired). `rules/harness-adapter-shape.md` (sibling discipline; per-harness discovery is the M1 walk for adapter conventions). `rules/i18n-discipline.md` (sibling discipline; locale cohort discovered, not invented).
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "i18n-discipline-locale-cohorts"
|
|
3
|
+
description: "Path-filtered companion sub-rule to i18n-discipline.md — carries the Modern Dev Cohort selection rationale + per-locale reach data, the RTL CSS-token catalog, and the hreflang link-tag shape + canonical-URL discipline. Demand-loaded on site / docs / locale-glossary / i18n-config touches."
|
|
4
|
+
pathFilter: "**/site/**, **/docs/**, **/_inputs/locale-glossary-*.md, **/next.config.*"
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
9
|
+
|
|
10
|
+
# Rule: i18n Discipline — Locale Cohorts (Companion Sub-Rule)
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Carry the operational depth of the i18n discipline the parent rule `rules/i18n-discipline.md` anchors. Path-filtered: loads when the assistant edits site content, documentation pages, per-locale glossary files, or the host i18n config that registers locales. The parent retains the always-on directives (cohort, framework i18n, review gate, glossary, RTL, hreflang summaries); this companion carries the cohort rationale (§1), the RTL CSS-token catalog (§2), and the hreflang link-tag shape (§3).
|
|
15
|
+
|
|
16
|
+
## Obligations
|
|
17
|
+
|
|
18
|
+
### 1. Modern Dev Cohort — Selection Rationale and Amendment Protocol
|
|
19
|
+
|
|
20
|
+
The Modern Dev Cohort is twelve locales — **EN, ZH-CN, ES, PT-BR, FR, DE, JA, KO, RU, ID, AR, HI** — each chosen against a concrete driver:
|
|
21
|
+
|
|
22
|
+
| Locale | Code | Driver class (per `rules/interactive-questions-canonical-shapes.md` §3.2.1) |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| English | EN | Class 6 observed-state — source locale; ~70% of Stack Overflow questions, ~63% of npm package descriptions |
|
|
25
|
+
| Mandarin (Simplified) | ZH-CN | Class 6 — largest developer population (GitHub state-of-the-octoverse); largest dev-tooling translation gap |
|
|
26
|
+
| Spanish | ES | Class 6 — second-largest dev language by Stack Overflow surveys; pan-American + Iberian reach |
|
|
27
|
+
| Portuguese (Brazilian) | PT-BR | Class 6 — Brazil is a top-5 developer market; PT-PT readers find PT-BR comprehensible (asymmetric reach) |
|
|
28
|
+
| French | FR | Class 6 — francophone Africa + EU; high developer concentration in Paris / Montréal hubs |
|
|
29
|
+
| German | DE | Class 6 — DACH developer density; strong open-source contribution per-capita |
|
|
30
|
+
| Japanese | JA | Class 6 — high-context language; high localization expectation; mature dev community |
|
|
31
|
+
| Korean | KO | Class 6 — Seoul tech hub; high translation-quality expectation |
|
|
32
|
+
| Russian | RU | Class 6 — CIS developer reach; significant open-source contribution |
|
|
33
|
+
| Indonesian | ID | Class 6 — fastest-growing dev population in Southeast Asia |
|
|
34
|
+
| Arabic | AR | Class 6 — MENA reach + RTL representation; the cohort's sole RTL locale |
|
|
35
|
+
| Hindi | HI | Class 6 — Indian subcontinent reach; Devanagari script representation |
|
|
36
|
+
|
|
37
|
+
**Amendment protocol.** Adding or removing a cohort locale MUST route through the structured-inquiry channel per `rules/authority-inquiry.md`, citing a concrete driver (locale-specific reach data, host-project audience evidence, or a ratified locked decision). Silent cohort expansion is non-conformant — long-lived ratifications never auto-expand. Outcomes land in the disclosure ledger as `[I18n — cohort-amendment: …]`.
|
|
38
|
+
|
|
39
|
+
**Exclusions and why.** Italian, Polish, Turkish, Vietnamese, Thai, Dutch, Swedish are common dev locales but excluded from the default against the twelve-locale ship-cost ceiling. A host with measurable audience evidence for an excluded locale adds it via the amendment protocol; the cohort never silently grows.
|
|
40
|
+
|
|
41
|
+
### 2. RTL CSS-Token Catalog
|
|
42
|
+
|
|
43
|
+
Arabic pages render right-to-left. Shared theme CSS MUST use **logical properties** exclusively; physical properties leak when one stylesheet serves both LTR and RTL.
|
|
44
|
+
|
|
45
|
+
| Physical (forbidden in shared stylesheets) | Logical (required) |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `margin-left` | `margin-inline-start` |
|
|
48
|
+
| `margin-right` | `margin-inline-end` |
|
|
49
|
+
| `padding-left` | `padding-inline-start` |
|
|
50
|
+
| `padding-right` | `padding-inline-end` |
|
|
51
|
+
| `border-left` | `border-inline-start` |
|
|
52
|
+
| `border-right` | `border-inline-end` |
|
|
53
|
+
| `left: <n>` (positioning) | `inset-inline-start: <n>` |
|
|
54
|
+
| `right: <n>` | `inset-inline-end: <n>` |
|
|
55
|
+
| `text-align: left` | `text-align: start` |
|
|
56
|
+
| `text-align: right` | `text-align: end` |
|
|
57
|
+
| `float: left` / `float: right` | `float: inline-start` / `float: inline-end` |
|
|
58
|
+
|
|
59
|
+
**Bidirectional content.** A mixed-direction string (e.g., an English code snippet inside an Arabic paragraph) carries a `<bdi>` wrapper around the foreign-direction substring. Unicode bidi controls (`LRI` U+2066, `RLI` U+2067, `PDI` U+2069) are used where HTML wrapping is unavailable (Markdown alt text, JSON-embedded UI strings).
|
|
60
|
+
|
|
61
|
+
**Icon mirroring.** Directional icons (arrows, back / forward, breadcrumb chevrons) are mirrored via `transform: scaleX(-1)` scoped to `[dir="rtl"]` selectors; non-directional icons (gears, search lenses, profile silhouettes) are NOT mirrored.
|
|
62
|
+
|
|
63
|
+
**Failure tells.** A `margin-left: 1rem` in a stylesheet served to AR pages (RTL leak). A `<` chevron pointing the wrong way on an AR breadcrumb (un-mirrored directional icon). An English code snippet inside an Arabic paragraph rendering as visually-reversed letters (missing `<bdi>` wrapper or LRI/PDI markers).
|
|
64
|
+
|
|
65
|
+
### 3. hreflang Link-Tag Shape and Canonical-URL Discipline
|
|
66
|
+
|
|
67
|
+
Every translated page emits an `hreflang` link-tag set in its `<head>` covering every cohort locale plus `x-default`. The canonical shape for a Modern-Dev-Cohort page at slug `/<slug>`:
|
|
68
|
+
|
|
69
|
+
```html
|
|
70
|
+
<link rel="alternate" hreflang="en" href="https://<host>/<slug>/" />
|
|
71
|
+
<link rel="alternate" hreflang="zh-CN" href="https://<host>/zh-cn/<slug>/" />
|
|
72
|
+
<link rel="alternate" hreflang="es" href="https://<host>/es/<slug>/" />
|
|
73
|
+
<link rel="alternate" hreflang="pt-BR" href="https://<host>/pt-br/<slug>/" />
|
|
74
|
+
<link rel="alternate" hreflang="fr" href="https://<host>/fr/<slug>/" />
|
|
75
|
+
<link rel="alternate" hreflang="de" href="https://<host>/de/<slug>/" />
|
|
76
|
+
<link rel="alternate" hreflang="ja" href="https://<host>/ja/<slug>/" />
|
|
77
|
+
<link rel="alternate" hreflang="ko" href="https://<host>/ko/<slug>/" />
|
|
78
|
+
<link rel="alternate" hreflang="ru" href="https://<host>/ru/<slug>/" />
|
|
79
|
+
<link rel="alternate" hreflang="id" href="https://<host>/id/<slug>/" />
|
|
80
|
+
<link rel="alternate" hreflang="ar" href="https://<host>/ar/<slug>/" dir="rtl" />
|
|
81
|
+
<link rel="alternate" hreflang="hi" href="https://<host>/hi/<slug>/" />
|
|
82
|
+
<link rel="alternate" hreflang="x-default" href="https://<host>/<slug>/" />
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Per-page invariants.**
|
|
86
|
+
|
|
87
|
+
- `<html lang="...">` matches the page's locale code (`lang="en"`, `lang="zh-CN"`, `lang="ar"`, …).
|
|
88
|
+
- AR pages additionally carry `<html dir="rtl">`.
|
|
89
|
+
- The `<link rel="canonical">` is the page's own absolute URL — never points across locales. An AR page canonicalizes to the AR URL, not the EN URL.
|
|
90
|
+
- `x-default` points to the source-locale (EN) URL — the fallback for visitors whose `Accept-Language` matches no cohort entry.
|
|
91
|
+
- Locale codes follow BCP-47 (`zh-CN`, not `zh_cn`; `pt-BR` in the `hreflang` attribute, though the URL path uses kebab-case `/pt-br/`).
|
|
92
|
+
|
|
93
|
+
**Symmetry invariant.** The hreflang set is **identical** across every locale's version of the page — the EN, ZH-CN, and AR pages each list every locale. Asymmetric hreflang (a locale omitting some peers) breaks Google's cross-locale clustering and is a finding.
|
|
94
|
+
|
|
95
|
+
**Missing-translation case.** When a page is not yet translated into a cohort locale, that locale's `hreflang` tag is **omitted**, not pointed at the EN fallback. Omission communicates accurately that no translation exists; pointing the omitted locale at EN would lie to search engines and degrade cross-locale ranking.
|
|
96
|
+
|
|
97
|
+
**Failure tells.** An AR page whose `<link rel="canonical">` points to the EN URL (cross-locale canonical leak). Asymmetric hreflang sets (the EN page lists twelve peers but the ZH-CN page lists six). Locale codes in `_` form rather than BCP-47 `-` form (`zh_CN`). Missing `dir="rtl"` on the AR `<html>`. Missing `x-default`.
|
|
98
|
+
|
|
99
|
+
### 4. Banner-Free Facade Policy
|
|
100
|
+
|
|
101
|
+
The shipped translated surface is **current-version-only** per `rules/freshness-facade.md`: every cohort locale presents as a complete, current translation, and no page carries a deferral banner. The policy:
|
|
102
|
+
|
|
103
|
+
- **The seed is the shipped form.** Machine-seeded pages ship as-is. Human review, where reviewers exist, raises quality in place — it never gates a page behind a `[Machine-seeded — pending review]` banner, a `pending` / `partial` status badge, or any deferral narrative.
|
|
104
|
+
- **Internal metadata, not a shipped badge.** Per-page seed state is carried by the `machineTranslated` frontmatter flag (internal review-tracking metadata read by tooling, e.g. `site/source.config.ts`), never surfaced to the visitor as a status label. The locale registry (`site/lib/i18n.ts`) carries no per-locale lifecycle status field.
|
|
105
|
+
- **Fallback is the mechanism, not a banner.** A cohort locale that has not yet authored a page falls back **silently** to the EN source through the loader's `fallbackLanguage`. The visitor reads the EN page at the locale's URL; no on-page banner announces the fallback. The hreflang set still **omits** the unauthored locale per §3's missing-translation case, so search engines see the gap honestly while the visitor sees a clean page.
|
|
106
|
+
- **Coverage gaps surface to maintainers, not visitors.** Production-readiness (per `rules/production-ready-prs.md`) requires the full authored page set per cohort locale. A coverage gap is a finding recorded via `rules/disclosure-ledger.md` (the `[I18n — locale: <code>; pages-translated: <N>/<total>; status: <complete | coverage-gap>]` marker), surfaced to the maintainer — never rendered as a shipped banner.
|
|
107
|
+
|
|
108
|
+
**Failure tells.** A shipped translated page carrying a visible `[Machine-seeded — pending review]` / `pending` / `partial` deferral banner. A per-locale status badge rendered to the visitor. A `contentStatus` / lifecycle-status field re-introduced into the locale registry. A fallback page announcing "showing English instead" on-page rather than falling back silently.
|
|
109
|
+
|
|
110
|
+
## Enforcement
|
|
111
|
+
|
|
112
|
+
Path-filtered (the four glob patterns in this rule's `pathFilter` field — `**/site/**`, `**/docs/**`, `**/_inputs/locale-glossary-*.md`, `**/next.config.*`), demand-loaded companion to `rules/i18n-discipline.md`. The parent carries the always-on directives (cohort, framework i18n, machine-seed + optional review, glossary, RTL, hreflang summaries); this companion carries the cohort-selection rationale + amendment protocol (§1), the RTL CSS-token catalog (§2), the hreflang link-tag shape + canonical-URL discipline (§3), and the banner-free facade policy (§4).
|
|
113
|
+
|
|
114
|
+
## Bindings (§0.j five-direction)
|
|
115
|
+
|
|
116
|
+
- **Drives →** Every locale-cohort amendment routing through the canonical inquiry channel. Every translated page's hreflang link-tag emission. Every theme CSS file's logical-property discipline on the RTL-serving rulesets. Every per-locale glossary file's path conforming to `_inputs/locale-glossary-<locale>.md`.
|
|
117
|
+
- **Satisfies →** `rules/i18n-discipline.md` §1 + §3 + §5 + §6 anchors (the parent rule's pointers to this companion's full cohort rationale, banner-free facade policy, RTL token catalog, and hreflang shape). The Modern Dev Cohort locale baseline with per-locale rationale; the current-version-only translated facade.
|
|
118
|
+
- **Established by ↑** `rules/i18n-discipline.md` (parent-rule anchor). Operator-ratified locale coverage. The BCP-47 language-tag specification (the upstream standard for locale codes). The CSS Logical Properties Level 1 specification (the upstream standard for logical properties).
|
|
119
|
+
- **Gated by ←** The path-filter (the four glob patterns) — this rule demand-loads only on site / docs / locale-glossary / i18n-config touches. `rules/i18n-discipline.md` always-on baseline (parent rule must be live for the anchors to surface).
|
|
120
|
+
- **Cross-bound with ↔** `rules/i18n-discipline.md` (parent rule; §1 / §3 / §5 / §6 anchors bind this companion). `rules/host-discovery.md` (M1 — cohort discovery walks the host's existing translated corpus). `rules/authority-inquiry.md` (M5 — cohort amendments route through the structured-inquiry channel). `rules/option-annotation.md` (M7 — cohort options carry concrete-driver rationale per §3.2.1). `rules/disclosure-ledger.md` (M2 — cohort amendments + per-locale completion outcomes recorded). `rules/production-ready-prs.md` (M15 — full authored-page-set coverage per cohort locale gates production-ready). `rules/freshness-facade.md` (the §4 banner-free facade is current-version-only — no machine-seeded / pending / partial deferral banner).
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "i18n-discipline"
|
|
3
|
+
description: "Locale-cohort selection, framework i18n integration, machine-seed translation with optional human review, per-locale glossary, RTL discipline, and hreflang / lang attribute discipline for every host-project translated surface."
|
|
4
|
+
pathFilter: ""
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
9
|
+
|
|
10
|
+
# Rule: Internationalization (i18n) Discipline
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Govern every translated surface — site pages, docs, marketing copy, error strings — across the host project. Translation is a production-ready criterion: a surface ships in every cohort locale or surfaces the gap as an inquiry; it never silently English-only-drifts.
|
|
15
|
+
|
|
16
|
+
## Obligations
|
|
17
|
+
|
|
18
|
+
### 1. Locale-Cohort Discipline
|
|
19
|
+
|
|
20
|
+
The **Modern Dev Cohort** is twelve locales: **EN, ZH-CN, ES, PT-BR, FR, DE, JA, KO, RU, ID, AR, HI** (EN source, eleven translation targets).
|
|
21
|
+
|
|
22
|
+
Cohort discovery walks the host's translated corpus (`site/content/docs/<locale>/`, the host i18n config's locale registrations) per `rules/host-discovery.md`. A host-ratified cohort wins. Where the host is silent, the Modern Dev Cohort is the default, surfaced via `rules/authority-inquiry.md` with options annotated per `rules/option-annotation.md`. Cohort amendments route through the structured-inquiry channel — never invented, never silently expanded.
|
|
23
|
+
|
|
24
|
+
(Companion Sub-Rule Anchor) See `rules/i18n-discipline-locale-cohorts.md` §1 for per-locale selection rationale and amendment protocol.
|
|
25
|
+
|
|
26
|
+
### 2. Framework i18n Integration
|
|
27
|
+
|
|
28
|
+
Translated sites register every cohort locale with the host's i18n framework — the framework's locale-registration surface (e.g., a Next.js i18n module, a Docusaurus `i18n` config, or the host's equivalent) — with the language switcher enabled and per-page frontmatter declaring `lang` and (for RTL) `dir: rtl`. Routing is `/<locale>/<slug>`; the source locale sits at `/` as the framework's default locale.
|
|
29
|
+
|
|
30
|
+
### 3. Machine-Seed + Optional Human Review
|
|
31
|
+
|
|
32
|
+
Initial translations are **machine-seeded** (DeepL preferred; GPT-4 fallback) and the seed is the shipped form. Human review is **encouraged** but **not** a gating banner; seed state is internal metadata (the `machineTranslated` flag), never a visible badge. The shipped facade is **current-version-only** per `rules/freshness-facade.md`: every locale presents as a complete translation with no `[Machine-seeded — pending review]` / `pending` / `partial` banner, and an unauthored page falls back silently to EN. A coverage gap surfaces as a finding per `rules/production-ready-prs.md`, never a banner.
|
|
33
|
+
|
|
34
|
+
(Companion Sub-Rule Anchor) See `rules/i18n-discipline-locale-cohorts.md` §4 for the banner-free facade policy and the fallback-vs-banner distinction.
|
|
35
|
+
|
|
36
|
+
### 4. Per-Locale Glossary Discipline
|
|
37
|
+
|
|
38
|
+
Each cohort locale maintains a glossary at `_inputs/locale-glossary-<locale>.md` mapping source terms to the locale's idiom. The glossary is authoritative; reviewers honor it; machine-seed prompts cite it. Cross-glossary drift — the same source term mapped to two target terms across pages — is a finding.
|
|
39
|
+
|
|
40
|
+
### 5. RTL Discipline
|
|
41
|
+
|
|
42
|
+
Arabic (AR) is the cohort's sole RTL locale. AR pages carry `dir="rtl"` at `<html>`; theme CSS uses logical properties (`margin-inline-start` over `margin-left`); bidirectional content uses `<bdi>` / Unicode `LRI` / `PDI` markers.
|
|
43
|
+
|
|
44
|
+
(Companion Sub-Rule Anchor) See `rules/i18n-discipline-locale-cohorts.md` §2 for the RTL CSS-token catalog.
|
|
45
|
+
|
|
46
|
+
### 6. hreflang / `lang` Attribute Discipline
|
|
47
|
+
|
|
48
|
+
Every translated page emits an `hreflang` link-tag set covering every cohort locale plus `x-default` (pointing to the EN root). Each page's `<html lang="...">` matches its locale code. Per-locale canonical URLs are absolute, permalinked, cohort-consistent — never pointing across locales.
|
|
49
|
+
|
|
50
|
+
(Companion Sub-Rule Anchor) See `rules/i18n-discipline-locale-cohorts.md` §3 for the hreflang shape and canonical-URL discipline.
|
|
51
|
+
|
|
52
|
+
## Disclosure surface
|
|
53
|
+
|
|
54
|
+
Translation outcomes recorded in the ledger per `rules/disclosure-ledger.md`:
|
|
55
|
+
|
|
56
|
+
- `[I18n — locale: <code>; pages-translated: <N>/<total>; status: <complete | coverage-gap>]` per release.
|
|
57
|
+
- `[I18n — glossary-drift: <term>; locale: <code>; resolution: <chosen-form>]` per glossary reconciliation.
|
|
58
|
+
- `[I18n — cohort-amendment: <added | removed>: <locale>; inquiry-id: <id>; rationale: <driver>]` per cohort change.
|
|
59
|
+
|
|
60
|
+
## Failure tells
|
|
61
|
+
|
|
62
|
+
A site shipping EN-only while the host's i18n config declares twelve locales. A shipped translated page carrying a `[Machine-seeded — pending review]` / `pending` / `partial` deferral banner. Hardcoded `margin-left` in theme CSS used by AR pages. A page with `<html lang="en">` served at `/zh-cn/`. Missing `hreflang` tags. Glossary terms invented per-page rather than centralized.
|
|
63
|
+
|
|
64
|
+
## Bindings (§0.j five-direction)
|
|
65
|
+
|
|
66
|
+
- **Drives →** Every translated page across the host's site / docs / marketing surfaces. Every host i18n-config locale registration. The per-locale glossary. The current-version-only translated facade (no deferral banner).
|
|
67
|
+
- **Satisfies →** The Modern Dev Cohort locale baseline; i18n-discipline always-on coverage; the host's production-ready criterion for translated surfaces; the current-version-only facade for translated surfaces.
|
|
68
|
+
- **Established by ↑** Operator-ratified locale coverage and the banner-free clean-facade decision; the host's i18n configuration surface; `rules/production-ready-prs.md` §5 visibility-surface gap-surfacing.
|
|
69
|
+
- **Gated by ←** The trivial-vs-non-trivial threshold (EN-only projects skip the cohort discipline until i18n is introduced). The host's ratified i18n framework.
|
|
70
|
+
- **Cross-bound with ↔** `rules/i18n-discipline-locale-cohorts.md` (companion sub-rule). `rules/host-discovery.md` (M1 — cohort discovered, not invented). `rules/authority-inquiry.md` (M5 — cohort amendments via the structured-inquiry channel). `rules/disclosure-ledger.md` (M2 — per-locale outcomes recorded). `rules/production-ready-prs.md` (M15 — full authored-page-set coverage per cohort locale). `rules/freshness-facade.md` (the shipped translated facade is current-version-only — no machine-seeded / pending / partial deferral banner). `rules/option-annotation.md` (M7 — amendment inquiries carry Recommended + driver).
|