1 - Anki go protos

1.1 - Anki Go Protobuf Integration Specification

Make all protobuf schemas from the pinned upstream Anki source available to Go applications through reproducible repository builds.

Sources: dependency ownership, schema catalog, binding generation, and consumer aliases.

The dependency integration SHALL generate Go messages and declared gRPC clients for every upstream Anki proto, retaining upstream import paths and the existing immutable source pin.

  • WHEN an application imports the pinned tags or i18n schema package
  • THEN its generated messages, descriptors and declared clients compile and can be used against the native backend

Schema targets SHALL retain repository-internal consumer visibility.

  • WHEN anki_as_code links all pinned schema packages
  • THEN its build succeeds through the dependency package’s declared aliases

2 - Go mod version

2.1 - go-mod-version Specification

Keep tracked go.mod files on the Go version configured for tools/go_mod.

Sources: tool README, tool BUILD, and archive.

The repository SHALL provide a tools/go_mod command that discovers every tracked go.mod file and sets its go directive to the version configured in the tool’s BUILD file. The command MUST offer an update mode and a check mode.

  • WHEN a user runs the update target
  • THEN every tracked go.mod file whose go directive differs from the configured version is rewritten to that version
  • AND files already on the configured version remain unchanged
  • WHEN the check test runs
  • THEN it fails if any tracked go.mod file has a go directive different from the configured version
  • AND it passes when every tracked go.mod file matches

The go.mod version check MUST run as part of //:repo_quality_test so a version mismatch fails repository quality.

  • WHEN a go.mod file’s go directive differs from the configured version
  • THEN //:repo_quality_test fails

3 - Python import validation

3.1 - python-import-validation Specification

Enforce module namespace imports in tracked first-party Python source through repository quality.

The repository quality suite SHALL reject individual symbol imports in tracked first-party Python source using the existing pinned syntax linter, except direct public re-exports listed in explicit __all__ in __init__.py. Wildcard imports SHALL remain forbidden. Module imports and qualified member access SHALL be accepted, including importing a verified module with from package.path import module. Long module paths SHALL use this form. Downloaded external source SHALL remain outside this first-party check. The Python skill SHALL describe the convention and its owning validation target.

  • WHEN tracked Python imports individual members outside explicit package re-exports or uses a star from-import
  • THEN repository quality fails with a namespaced-import diagnostic
  • WHEN source imports modules, including verified module from-imports, or includes from-import text only in comments or strings
  • THEN the import check passes
  • WHEN existing first-party imports are migrated to the enforced convention
  • THEN their module references and supported package exports remain usable
  • WHEN __init__.py imports direct symbols and lists their bound names in explicit __all__
  • THEN the import check accepts those exports, including relative imports

4 - Repository

4.1 - Repository Evolution Specification

Define how the alwaldend/src monorepo evolves its shared structure, build system and development workflows. Component behavior is specified in each owner’s local OpenSpec workspace. This baseline was inspected at source revision 550d7e79b1f5fdbc2b6017b75178471d6914082f on 2026-09-08 and incorporates the OpenSpec migration delivered with this specification. Changes in infra/src record repository evolution; they do not collect unrelated component work or claim runtime health or deployed infrastructure.

Sources: repository map, agent policy, root build, project boundary, infrastructure boundary, tool boundary, OpenSpec workflow, workspace procedure, and goal migration record.

The repository MUST keep component purpose and publication boundaries in the nearest owner README, executable and dependency structure in BUILD and MODULE files, and agent policy in the applicable AGENTS.md chain. Specifications SHALL describe component requirements with links to these owners.

  • WHEN a change affects a project, tool or infrastructure component
  • THEN its owning documents and Bazel workspace determine the affected paths and supported consumers
  • AND a repository-wide catalog or specification does not grant broader publication or execution authority

Repository agent build and test operations MUST use al bazel in the owning workspace with pinned dependencies and the repository’s shared agent configuration. Generated dependency and catalog files MUST be updated through their owning generator.

Every nested module that declares MODULE.bazel MUST declare only dependencies its own sources use, with a resolvable version or an override that applies when that module is the root. Every nested module directory MUST appear in the root .bazelignore so root target expansion does not cross the workspace boundary. Each nested workspace MUST build and test standalone.

  • WHEN an implementation adds an external build input
  • THEN its owner records an immutable version and integrity information
  • AND applicable generated locks and package checks validate the declared dependency through the pinned build workflow
  • WHEN a nested Bazel workspace is built or tested on its own
  • THEN its module graph resolves without depending on root-only overrides
  • AND the workspace builds and tests through its shared configuration
  • WHEN the root workspace expands targets beneath a nested module directory
  • THEN the nested workspace is excluded by the root ignore list
  • AND root expansion neither loads nor silently omits that module

Repository modifications MUST use a dedicated feature branch and linked worktree. The repository SHALL own that procedure in a al-workspace skill that runs before the first mutation or task-scratch write, so isolation and scratch placement are established before al-delivery is loaded. Task scratch MUST remain under ignored out/<task>/ in the applicable workspace, and configurable temporary and cache locations SHALL point there. Delivery SHALL exclude disposable build outputs and include required generator-maintained files updated through their owning workflow. Acceptance SHALL identify the candidate and relevant checks and representative output before delivery.

  • WHEN an authorized implementation is ready for delivery
  • THEN task-owned changes pass applicable formatting, quality and semantic checks and are committed and published through the repository procedure
  • AND unrelated edits, scratch and protected data are excluded
  • WHEN a task will modify repository files or write task-owned scratch
  • THEN the agent verifies the feature worktree and branch before the first write
  • AND task-owned scratch and configurable temporary locations stay under the ignored out/<task>/ directory
  • WHEN the delivery procedure stages the candidate
  • THEN disposable build outputs are excluded
  • AND required generator-maintained files are included after their owning workflow regenerates them

Persistent infrastructure configuration MUST be defined in checked-in owning infrastructure code. Infrastructure operations MUST require the user’s exact operation and scope authorization; an implementation validation request SHALL NOT authorize live deployment.

  • WHEN an agent adds or updates an infra component specification
  • THEN it inspects source and runs applicable offline checks
  • AND it does not infer deployed state or execute live apply or deployment from the existence of the specification

Each direct project in projects/ and infra/ SHALL keep its baseline specifications and maintained changes in its own openspec/ workspace. infra/src/openspec SHALL describe evolution of the repository itself, including shared structure, build system and development workflows. The repository root SHALL NOT collect component specifications or change records. Every repository change MUST use an OpenSpec change in its owning workspace, including trivial edits, documentation, configuration, and dependency changes. A matching active change SHALL be reused when available, and artifacts SHALL remain proportional to scope. Read-only questions and reviews do not require a change record. Maintained work SHALL preserve outcome, decisions, tasks and requirement deltas. Existing task authority MUST survive workflow transitions.

  • WHEN a change affects a project’s supported behavior
  • THEN its specifications and change artifacts remain in that project’s openspec/ directory
  • AND the pinned CLI and context routing select that owner workspace
  • WHEN a change affects the monorepo’s shared structure or development workflow
  • THEN infra/src/openspec records its repository requirements and evolution
  • AND component contracts remain with their respective owners
  • WHEN an agent resumes a named OpenSpec change
  • THEN it reads that owner’s change artifacts, candidate, evidence and next action
  • AND unfinished or blocked acceptance remains explicit until evidence supports completion
  • WHEN a project has its own Bazel module
  • THEN repository OpenSpec validation still checks its declared local workspace
  • AND a successful repository check does not omit that project’s requirements
  • WHEN an agent makes a one-line repository correction
  • THEN it selects or creates a matching owner-local OpenSpec change before editing, with small artifacts and skip_specs if behavior is unchanged
  • AND the record adds no approval gate to already authorized work
  • WHEN the task only inspects a bounded change set and reports findings
  • THEN no new OpenSpec change is required for that review
  • AND the review itself does not authorize implementation or publication

The repository MUST NOT carry a goal tool, goal store, or goal skill, and MUST NOT reintroduce a goal record format as a maintained work channel. Maintained work SHALL use the owning component’s OpenSpec workspace. The change SHALL identify the removed component.

  • WHEN an agent needs durable intent, tasks, or continuation state
  • THEN it uses the owning component’s openspec/ workspace through the pinned CLI
  • AND no goal command, skill, or store is available or documented as an active channel
  • WHEN a reader needs a file from the removed goal component
  • THEN the change and migration record name the removed tree
  • AND the reader retrieves the file from git history at the removal commit’s parent

Bazel rules MUST NOT embed templated executable content in rule source. A rule that needs an executable MUST reference an ordinary checked-in script and supply its inputs as declared arguments or data files. Every public rule set MUST generate stardoc documentation for its public .bzl entry points, and the repository’s main documentation output MUST include that generated documentation.

  • WHEN an implementation needs a rule to run a script
  • THEN the script is checked in as a normal file with its own target and receives data through arguments or a declared data file
  • AND generated shell or program text does not live in the .bzl source
  • WHEN a project publishes a public Bazel rule or macro
  • THEN it declares stardoc coverage for the declaring file
  • AND the generated pages appear in the repository documentation build

First-party standalone Bazel rule modules SHALL live under tools/<module>/. Their relocation MUST preserve module names, supported public rule and macro interfaces, standalone workspace resolution, generated rule documentation, and owner-local specifications. Repository consumers and discovery mechanisms MUST resolve their new source locations through the owning declarations.

  • WHEN a root or nested workspace loads a relocated rule module through its supported module name and public rule interface
  • THEN the module resolves from its new tool-owned location
  • AND its supported build behavior remains available without changing the public module identity
  • WHEN repository documentation, skill discovery, or OpenSpec validation traverses the relocated modules
  • THEN it selects the modules’ new owner paths
  • AND generated rule documentation and existing component specifications remain included in their declared outputs and checks

The relocated rule modules SHALL have no dedicated project landing-site configuration. After authorized retirement, their selected landing repository and DNS declarations MUST be absent from the owning infrastructure, and shared-catalog consumers MUST exclude those retired repositories. Retirement MUST preserve unrelated repositories, sites, access grants, and authentication resources.

  • WHEN the catalog is projected for GitHub or GitLab after rule-landing retirement
  • THEN the retired landing repositories are absent
  • AND remaining repositories retain their catalog identities, names, and configured access behavior
  • WHEN the owning declarative workflows execute the user’s explicitly authorized retirement scope
  • THEN the selected Pages repository and matching DNS record are removed
  • AND the reviewed plans and postconditions show no unrelated deletion or replacement

Repository CI workflows MUST be maximally thin wrappers. Executable logic SHALL be implemented in bazel run targets or committed scripts; workflow YAML SHALL contain only declarative orchestration and short command invocations. The discoverable repo-ci skill SHALL document this rule and link owning sources.

  • WHEN a workflow requires resource checks, authentication, parsing, loops, or other executable behavior
  • THEN that behavior resides in a committed implementation invoked by the workflow, preferably through bazel run
  • AND inline programs, heredocs, and composite-action YAML do not substitute for the implementation
  • WHEN an agent discovers the repository skills for CI work
  • THEN repo-ci explains the workflow and command boundaries, authentication constraints, and applicable offline and live validation entry points

Requirement: Shared repository CI entry point

Every repository CI workflow SHALL use the local tools/ci/action action after checkout. The action SHALL launch bazel run --config=ci //tools/ci without a shell and propagate its failure. The entry point SHALL build and test all normal targets in the root and nested Bazel workspaces, continuing to attempt both phases and remaining workspaces after a failure and returning failure if any command fails. It SHALL discover nested workspace boundaries from the root .bazelignore and MODULE.bazel files. Runner infrastructure acceptance probes SHALL NOT be part of normal CI.

  • WHEN a repository CI workflow runs
  • THEN the shared command builds and tests each workspace with the CI profile
  • AND normal Bazel exclusions for manual and incompatible targets apply
  • WHEN one workspace’s build phase fails
  • THEN its test phase and the remaining workspaces are still attempted
  • AND the entry point reports failure

The root AGENTS.md SHALL keep repository-wide constraints visible: fact ownership, infrastructure and approval authority, mandatory delivery, worktree isolation, protection of unrelated work, confidentiality, and naming and communication standards. Execution detail SHALL live with the skill that owns it, and the root document SHALL route to that skill through one compact “When to load a skill” table ordered by task phase. Each routing entry SHALL name the trigger and the skill without restating the skill’s procedure.

Initial reads SHALL depend on the task: applicable policy and the owning README first, and BUILD or MODULE declarations only when implementation or validation depends on them.

  • WHEN an agent begins work in a subtree
  • THEN it reads the applicable AGENTS.md chain and the owning README.md
  • AND it inspects BUILD or MODULE declarations only when the task depends on them
  • AND it loads the skill whose routing trigger matches the current phase
  • WHEN a repository-wide procedure changes
  • THEN the change belongs with the skill that owns it, not in the root policy
  • AND the root document retains only the routing entry and any repository-wide constraint

Each fact SHALL have one authoritative source. Independently maintained duplicates SHALL be treated as defects even when the original is hard to reach; the owner SHALL be extended or parameterized instead of copied. Generated projections, fixtures, and concise summaries that identify their source are projections rather than duplicates.

  • WHEN a checked-in generated file, fixture, or summary restates a fact owned elsewhere
  • THEN it identifies its source and regeneration workflow
  • AND it is not treated as an independently maintained duplicate