head

Release head

  • Merge pull request #142 from alwaldend/t3code/convert-infra-diagrams

    Extract infrastructure diagrams into project-owned Mermaid sources

  • Merge pull request #135 from alwaldend/t3code/reduce-mermaid-webp-size

    Reduce default Mermaid WebP resolution

  • Merge pull request #127 from alwaldend/t3code/move-leetcode-submissions

    Move LeetCode submissions into the simeonwarren user tree

  • Merge pull request #126 from alwaldend/t3code/review-agents-skills

    Correct agent skill safety and workflow instructions

  • Merge pull request #125 from alwaldend/t3code/propose-mlops-fastapi-health

    Add the MLOps recommender service and reproducible model training

  • Merge pull request #123 from alwaldend/t3code/add-xurl-cli

    Fix X Article uploads, payload artifacts and blog covers

  • Merge pull request #122 from alwaldend/t3code/x-article-development-story

    Publish the X Article story and harden its upload workflow

  • Merge pull request #121 from alwaldend/t3code/add-x-article-upload-skill

    Support X Article banners and dark blog diagrams

  • Merge pull request #120 from alwaldend/t3code/implement-x-article-uploader

    Add the X Article uploader with a WebP diagram render rule

  • Merge pull request #119 from alwaldend/t3code/article-upload-markdown-import-api

    Propose the X Article uploader as a new project

  • Merge pull request #115 from alwaldend/t3code/website-release-bundle

    Build portable website releases for SSH publication

  • Merge pull request #103 from alwaldend/t3code/theme-mermaid-diagram-styling

    Render site diagrams with native Mermaid themes

  • Merge pull request #101 from alwaldend/t3code/infra-download-static-server

    Plan static hosting and SSH release publication

  • Merge pull request #100 from alwaldend/t3code/chatgpt-flat-monochrome-design-style

    Unify site theme and repair documentation navigation

  • Merge pull request #99 from alwaldend/t3code/move-agents-project-to-tools

    Move agent tooling and binary dependencies to their owning trees

  • Merge pull request #92 from alwaldend/t3code/polish-mermaid-diagram-styling

    Render hermetic Mermaid diagrams and publish the migration post

  • Merge pull request #95 from alwaldend/t3code/consolidate-project-landing-pages

    Move project landings into the main site

  • Merge pull request #94 from alwaldend/t3code/fix-hugo-theme-light-dark-accent

    Restore light and dark site canvases and set the shared accent

  • Manage forge resources with hermetic Terraform rules

    Centralize organization, repository, and named access configuration in infra/repos. Adopt existing GitHub resources, protect master defaults while retaining Pages publication on pages, and preserve existing repository identities. Manage GitLab one-time imports, the F-Droid metadata fork, and default-branch protections through Vault-backed authentication. Forgejo consumes the same catalog. Ongoing repository synchronization is deferred.

    Retire the eleven Bazel rule landing sites through their owning Terraform workflows, removing their DNS records, Pages repositories, and landing configuration. Move all twelve existing standalone rule modules into tools/ and retain their public interfaces and documentation on the main site.

    Add tools/rules_terraform with verified provider downloads, packed mirrors in runfiles, and reusable Terraform execution rules. Enforce one version per provider source at an extensible resolution boundary. Migrate every Terraform consumer to thirteen shared provider pins in third_party/terraform. Execution and command maps belong to rules_terraform; consumers explicitly select generic AL wrappers for authentication and Vault injection. Remove tools/terraform and all 43 checked-in Terraform provider locks. Validate installed providers against the declared archives before execution.

    Validation covers all fourteen workspace builds, all thirteen standalone test suites, Terraform consumers, offline real-provider regressions, rendered documentation, formatting, and semantic lint. The full root test run has 295 passing tests and one skip; its only failure is the historical secret scan, reduced to four pre-existing synthetic fixture matches. Earlier live imports and the exact landing retirement scope have verified postconditions; the Terraform rules migration uses only offline implementation checks.

    OpenSpec-Change: infra/repos/openspec/changes/archive/2026-09-13-adopt-shared-repository-catalog OpenSpec-Change: infra/src/openspec/changes/archive/2026-09-13-retire-bazel-rule-landings OpenSpec-Change: tools/rules_terraform/openspec/changes/archive/2026-09-14-add-hermetic-terraform-rules OpenSpec-Change: tools/rules_terraform/openspec/changes/archive/2026-09-14-correct-terraform-ownership

    LLM-disclaimer: This commit was generated by an LLM.

  • Publish the DNS evolution article and update blog workflow

    Publish the author’s account of moving DNS management from a central DNSControl configuration to project-owned Terraform records, with examples and directory layouts. Include the author’s clarifications and approved wording corrections, and remove the draft flag for publication.

    Tag both blog posts using existing site topics. Require relevant tags and iterative reviews in the blog skill: report findings before validation and delivery, repeat after changes, and finish delivery when the review is clear or the author ends it. Cover both behaviors in the existing evaluation cases.

    Validation: local and release Hugo builds, site_test, skill validation and offline Promptfoo configuration test, skill discovery, Buildifier, repository quality, and semantic lint for the affected blog and skill packages.

    LLM-disclaimer: This commit was generated by an LLM.

  • Deploy project DNS through Terraform modules

    Move DNS ownership into each project’s Terraform state using shared modules. Load dnsconfig.json files at runtime, reject conflicting domain ownership, and render their records as a table. Add missing project AppRoles and scoped DNS policies, and document grouping related Terraform resources in modules.

    Deploy all 45 owners sequentially: adopt 155 existing records and create 13 missing OpenHands records. Preserve every pre-existing provider record and verify no-op follow-up plans and DNS answers. Add DNS-scoped plan/show/apply wrappers with a saved-plan guard for roots that also manage services. Allow bounded aggregate path inventories large enough to deliver this migration while retaining truncation refusal in the delivery tool.

    Validate runtime ownership, provider imports and preservation with isolated fixtures, Terraform formatting, wrapper builds, repository quality checks, semantic lint, and project documentation/specification builds.

    OpenSpec-Change: infra/dns/openspec/changes/archive/2026-09-13-migrate-project-dns-to-terraform

    LLM-disclaimer: This commit was generated by an LLM.

  • Record the site hostname decision for alwaldend.com

    Record the evaluated options for the apex site’s landing, documentation, and blog sections: one hostname with one build (retained), separate hostnames served from separate GitHub Pages repositories, and one hostname with independently built and merged section outputs. The generated documentation tree is a projection of the repository’s own directory structure across 471 packaged README files, and an earlier commit already combined the misc, docs, and projects sites, so splitting the hostnames would move where the projection is served without decoupling it from its source.

    Separate the shared-build failure coupling from the hostname question: the recorded fallback keeps one published tree while splitting the build graph, if panicking on any packaged README warning starts blocking delivery.

    Record the search-engine evidence from primary sources. Google’s crawling-and-indexing FAQ states that from an indexing and ranking perspective Google has no preference, and the office-hours answer recorded here addresses the same question. The record explicitly does not claim that subdirectories preserve link equity that a subdomain would forfeit, and it cites a third vendor video by title only because its spoken content could not be retrieved.

    This change adds no site behavior, build target, configuration, DNS record, or Terraform resource.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/archive/2026-09-12-record-site-hostname-decision

    LLM-disclaimer: This commit was generated by an LLM.

  • Fix Android review feedback

    Add a shared androidPlugins version catalog so both Android apps declare the AGP, Kotlin, Compose, and protobuf plugin versions once, and derive their versions from it instead of duplicating literals per root Gradle file.

    Align the launcher and ingester app versions with the repository versioning contract: development builds use 0.0.0-dev with versionCode 1 in both the Gradle default config and the Bazel manifest_values.

    Ignore the whole materialized .agents/skills directory in Prettier because every entry is either a source-tree symlink or a byte-pinned external archive copy.

    Apply the ingester’s themed surface background to the main content surface so the status bar area follows the system theme, not a default white surface.

    Token: z-ai-glm-flash-latest

    LLM-disclaimer: This commit was generated by an LLM.

  • Add a blog section, a shared site canvas, and standalone nested modules

    Publish the Docsy blog section on the apex site with its content package, navigation entry, RSS feed, and draft-safe release flags. The release build excludes drafts so a post stays unpublished from its front matter alone.

    Move the reusable project-site procedure to a generic repo-hugo skill that also documents the Hugo theme layout, and add an alwaldend-blog skill that publishes supplied content verbatim and reviews it afterward. Enforce one implementation and one copy of each fact in the root policy, and refine the skill locality rule to prefer local ownership only when it genuinely fits.

    Share one black theme between the landing shell and the apex site from a single SCSS source, and let docs_filegroup preserve source paths so packages holding identically named files stop colliding.

    Repair every nested Bazel workspace: rules_openspec declared six unused, versionless sibling dependencies whose local_path_override entries never applied outside the root module, which broke standalone resolution for all nested modules. Drop those dependencies, ignore the two nested module directories that lacked an ignore entry, add the missing build_test coverage, and extend the full-repository check to all twelve nested workspaces.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/archive/2026-09-12-add-docsy-blog-section OpenSpec-Change: projects/hugo_landing/openspec/changes/archive/2026-09-12-shared-site-canvas OpenSpec-Change: projects/rules_docs/openspec/changes/archive/2026-09-12-nested-spec-path-collision OpenSpec-Change: infra/src/openspec/changes/archive/2026-09-12-fix-nested-workspace-module-resolution

    LLM-disclaimer: This commit was generated by an LLM.

  • Remove the goal component, the agent control tower, and the site link test

    Delete projects/goal entirely: its CLI, API package, filesystem store, landing site, disabled skill sources, documentation pages, diagrams, Bazel targets, project-registry entry, and committed DNS record. The goal tool was deprecated by the 2026-09-08 migration to the pinned OpenSpec CLI, which is in active use, and the repository policy already told agents not to create goal records.

    Delete tools/agents entirely. It carried repository-internal control contracts, seven catalog compilers, an offline context capsule, and typed admission/control/plan/evidence libraries. The goal tool was their only consumer; no CI or AGENTS.md invocation read the catalogs. Relocate the generic skill-discovery declaration to .agents/BUILD.bazel beside the directory it generates, and repoint the 29 skill visibility labels from //tools/agents:skill_discovery to //.agents:skill_discovery. Skill content, link targets, and the 27 existing symlinks are unchanged. A BUILD.bazel inside .agents/skills/ was rejected because the generated updater rejects a non-symlink there.

    Reduce projects/agents to its skills: delete the architecture, current-state, and roadmap documents and the docs package they fed. Documentation describing agent-system composition now belongs with the component that owns the behavior.

    Remove //projects/alwaldend.com/test/site:site_test. It has never passed since 894494f4: it fails on unmodified HEAD with 330 missing-file findings because it treats repository source paths and the published URL space as one namespace. Repository-only targets such as BUILD.bazel and playbook YAML are deliberately not packaged, so those links can never resolve in generated output.

    Record the removals as three OpenSpec changes: remove-deprecated-goal-component and remove-generated-site-link-test under infra/src and projects/alwaldend.com, and remove-goal-tool-and-contract-tower under projects/agents.

    The removed bytes remain retrievable from git history at the parent of this commit; the changes neither copy nor restate them.

    Address review feedback before publication:

    Point the hugo_landing site example at the surviving //projects/agents:docs target. The copied example referenced //projects/agents/docs:docs, which this change deletes, so the snippet failed label resolution.

    Point the new specification links at their real paths. The repository change referenced migration.md one directory too shallow, and the Reimu continuation requirement referenced the process contract from beneath the change directory instead of the project root; neither path existed.

    Rewrite projects/renders/assets/reimu_fumo/PROCESS.md so its required stage gates no longer depend on the removed goal tool. That contract was the authoritative process for the still-open Reimu work, and it required goal-tool checkpoints, portable goal plans, and goal state to start, repair, reset, and close attempts. Those mechanics now record into the project’s OpenSpec change and its durable evidence, so every gate stays executable. Acceptance criteria and the blocked continuation state are unchanged. The continuation requirement is recorded in the change spec and its rationale in the change design.

    OpenSpec-Change: infra/src/openspec/changes/remove-deprecated-goal-component OpenSpec-Change: projects/agents/openspec/changes/remove-goal-tool-and-contract-tower OpenSpec-Change: projects/alwaldend.com/openspec/changes/remove-generated-site-link-test OpenSpec-Change: projects/renders/openspec/changes/reimu-fumo-finish

    LLM-disclaimer: This commit was generated by an LLM.

  • Simplify OpenSpec workspace globs

    Collapse OpenSpec source globs to specs and changes, drop redundant package visibility blocks already covered by REPO.bazel, and regenerate the affected catalogs.

    LLM-disclaimer: This commit was generated by an LLM.

  • Publish project sites and reproducible infrastructure diagrams

    Build and deploy all 30 remaining project sites with the standard Docsy header, project descriptions and a linked documentation directory. Omit the repeated page title and generated language heading. Remove the unused cgit and xray_manager projects and retire their site resources.

    Add a repeatable GitHub Pages publisher, staged Terraform bootstrap and direct GitHub Pages DNS records. Preserve repeated publication when pages is the remote default branch, and include Rules ISO in the main documentation. Document site onboarding in a registered, validated skill. Keep AL introduction short with useful links and preserve its lifecycle details in a dedicated documentation page.

    Render all 15 existing infrastructure Drawio pages with pinned Drawio and Chrome inputs, sandboxed export actions, an update target and freshness checks, and include the maintained diagrams in infra/arch documentation. Paint an opaque white canvas to preserve readability in dark themes.

    Validation covers project and apex builds, rendered pages, publisher tests, diagram repeatability and freshness, DNS configuration, Terraform formatting, semantic lint and repository quality.

    Goal-Ref: build-and-deploy-every-project-landing-page-a782b800 Attempt-ID: attempt-00941092c164

    LLM-disclaimer: This commit was generated by an LLM.

  • Wait for AL secret cleanup and plugin shutdown

    Roll back partial plugin startup, drain requests before releasing resources, and wait for plugin and command processes to exit. Stop independent plugins concurrently while preserving dependency order inside each plugin.

    Revoke invocation-owned credentials, remove temporary secret files, and verify Forgejo and Harbor session cleanup. Preserve the user’s existing Vault login. Enforce Vault OIDC origins and no_auth, redact sensitive errors, and restrict config dumps to owner-only files. Add the AppRole SecretID cleanup permission.

    Cover normal exit, cancellation, failed startup, credential revocation, and transport cleanup with synthetic unit and real command/plugin regression tests.

    Clarify that required formatting-only repairs need no separate approval, and fix the existing blank-line formatting failure in the GitHub AL wrapper.

    Goal-Ref: fix-al-secret-lifecycle-and-plugin-shutdown-3137c0b0 Attempt-ID: attempt-0c1353676e2f

    LLM-disclaimer: This commit was generated by an LLM.

  • Keep Bazel dependencies lazy and generate the root module

    Declare pinned InfiniTime sources and the Hedron extractor through use_repo_rule, retain recursive firmware submodules, and use the official contrib_rules_jvm 0.32.0 release. Keep default toolchain registration convenient for consumers.

    Move root tool implementations into owning packages while preserving compatibility labels, visibility, manual tags, Python paths, Terraform working directories, pnpm dependency pins, and documentation archive layout. Guard the load-free root BUILD with a parser-based quality test. Generate root MODULE.bazel directly from owning include files, with an update command and freshness/integration tests.

    Cache hermetic agent tests, preserve lint analysis across modes, and build only lint outputs in lint mode. Allow normal agent lockfile updates while retaining strict CI checks. Limit host Bazel scheduling to eight jobs and half its CPUs, with matching checked-in host configuration.

    Fix DNSControl command ordering, JSON manifest loading, record filename suffixes, and credential-file wiring through existing Vault environment injection. Add an offline config test. Correct the Git wrapper shebang for direct execution and refresh derived catalogs affected by the Bazel changes.

    Validation covers compatibility builds, firmware, documentation outputs, generator freshness, DNS configuration, and a live DNS preview without applying changes. The repository-wide audit also identifies pre-existing test and coverage gaps.

    Goal-Ref: avoid-unrelated-bazel-dependency-downloads-638e8329 Attempt-ID: attempt-106ffd5ccaeb

    LLM-disclaimer: This commit was generated by an LLM.

  • Repair site navigation and simplify page layout

    Show one homepage panel with vertically stacked GitHub and Docs rows using the name: URL format, hiding the protocol and trailing slash in the link text. Center the panel and cap its width at 40rem while allowing it to shrink on mobile. Move it slightly lower on desktop and brighten the footer link. Restore the project assets mount so custom styles load. Reduce the footer to its content height with compact padding. Size the homepage against the visible viewport so mobile browser controls do not hide its footer. Remove the separate Projects page and its header link, while keeping project documentation under Docs. Remove the introductory homepage copy and visible title.

    Resolve Markdown links and images from their source locations, package missing documentation and book covers, correct source links, and scope anchors and release controls in combined print pages. Restore the archive-root CNAME explicitly during deployment so replacing the site preserves the custom domain.

    Validate generated HTML for missing internal files and fragments, duplicate IDs, image alternatives, and the homepage, Misc source-link, and Goal diagram regressions. Check the production build, repository quality, affected-target semantic lint, desktop and mobile homepage rendering, and deployment output.

    Goal-Ref: out/site-fix/goals/fix-local-alwaldend-com-layout-and-links-a2e69a4e Attempt-ID: attempt-165dd5be7d71

    LLM-disclaimer: This commit was generated by an LLM.

  • Extract DNSControl setup into rules_dnscontrol

    Extract the DNSControl setup into rules_dnscontrol, generate its Bazel dependency bundle from project-owned record files, and update the DNS guidance. Move Hugo rules and the worker to role-based package paths, and give each non-nested project a locally owned Hugo landing target that reuses the shared README-to-landing macro.

    Clean all landing and Pages DNS records so GitHub Pages serves each project subdomain directly without Cloudflare proxying. Improve the main site with a three-panel home layout, complete project links, documentation explore links, and current deployment guidance.

    All affected root-workspace landing, DNS, and site targets pass, along with the nested rules_hugo tests, Buildifier, and repository quality checks.

    LLM-disclaimer: This commit was generated by an LLM.

  • Improve the Hugo site and fix the persistent worker

    Extract the Hugo build rules into a standalone nested module projects/rules_hugo and add a Go-based persistent Hugo worker with a Dart Sass toolchain, then fix the worker’s empty-destination defect, polish the rules, add per-project landing pages and DNS declarations, and improve the site deploy.

    • rules_hugo: standalone nested module with MODULE.bazel, main/bzl rules, tests, and README; no root-workspace labels.
    • hugo_worker: persistent worker that resolves execroot-relative paths through the work directory and probes DART_SASS_BINARY, so the site destination is populated with HTML and Sass-compiled CSS.
    • sass: Dart Sass 1.103.1 toolchain wired into the site build.
    • alwaldend.com: Hugo 0.165.0, Docsy 0.17.0, Bootstrap 5.3.8, Font Awesome 7.3.1, module mounts, and the site build switched to the worker.
    • Landing pages: content/projects/_index.md links every project to its docs page; a Projects menu entry is added and the content filegroup is wired.
    • DNS: projects/alwaldend.com/dnsconfig.json declares no records (no new subdomains) and is wired into infra/dns/dnsconfig.js.
    • Deploy: the genrule clones the pages branch that GitHub Pages serves, clears the previous checkout, writes .nojekyll, stages deletions, skips no-op deploys, and pushes HEAD:pages without a force push; the README deploy section is updated.
    • Content: rename the reserved sites taxonomy to websites so the alwaldend.com term renders, and fix main/bzl docs prefix collisions across nested modules.
    • Review fixes: document the extension-based toolchain registration in the rules_hugo README, sync the full-repo-check eval rubric to nine nested workspaces and twenty commands, and drop the worker’s unsupported outs attribute.
    • Validation: site build produces 3051 HTML pages and Sass CSS; worker, terraform, buildifier, and nested rules_hugo tests pass; git diff –check is clean.

    LLM-disclaimer: This commit was generated by an LLM.

  • Complete Phase 1 agent system controls

    Close the registered agent-reachable universe with owner-local operation declarations, a report-only completeness checker, shared task-run contracts, task/run-isolated Cordis scratch, explicit Terraform mutations, and bounded Bazel diagnostics. Record numeric resource ceilings and accepted durable-goal evidence for the exact candidate.

    Integrate the non-render agent tooling and Blender toolchain changes from PR 24 while retaining the old Blender data package whose move destination is excluded. Direct repository agents to prefer Cordis over shell for supported inspection and to consider bounded Cordis handlers for recurring gaps.

    Verification:

    • affected Bazel build: 74 targets passed
    • affected Bazel tests: 23 of 23 passed
    • Phase 1 registered-universe report: valid
    • goal validation: valid
    • git diff –check HEAD: passed

    LLM-disclaimer: This commit was generated by an LLM.

  • docs: define the repository agent system

    Make the repository legible as one coherent agent-operated system while preserving one mutation authority per fact.

    • add revision-bound current state, target architecture, and phased roadmap
    • route root and agent entry points to the canonical model and durable goal
    • normalize repository-tree policy and the public-information boundary
    • clarify task-private secret scratch and non-obvious tool narration
    • correct question and secret skill contracts and stale operator examples
    • render source-compatible Markdown links correctly in the documentation site
    • retain the complete audit, decision, validation, and acceptance record

    Validated with focused skill and Buildifier tests, affected Bazel builds, the full Hugo site, source and rendered link checks, exact label queries, repository-pinned formatting, and goal-record validation.

    LLM-disclaimer: This commit was generated by an LLM.

  • Complete repository quality coverage
  • Add hermetic repository-wide formatting and linting

    Integrate upstream formatters for the repository’s meaningful tracked source and configuration file types through Bazel, and add Buildifier, Ruff, and ShellCheck lint aspects for correctness-oriented repository-wide checks.

    Pin all new external tools through Bzlmod or the existing pnpm lock, add thin cache/runfiles adapters where required, expose format and check targets, and wire the checks into the pre-commit workflow. Format the existing tree and fix the correctness defects uncovered by the new checks. Preserve generated sources and exact-content fixtures that are not safely rewritable, and clarify that ordinary infrastructure build output is safe to display.

    Validation:

    • all 21 repository quality and compatibility formatter tests pass
    • Buildifier test passes
    • lint aspects analyze all 4,629 ordinary root targets without findings
    • the complete 18-command root and nested full-repository audit was exercised; remaining failures are documented environment or pre-existing test limits

    LLM-disclaimer: This commit was generated by an LLM.

  • Add global repository versioning

    Introduce a Bazel-built Go tool that calculates the repository’s global SemVer-compatible ISO-week calendar versions, creates guarded nightly tags and weekly release branches atomically, advances release patches by first-parent commit, and emits deterministic Bazel workspace-status keys.

    Route release stamping through the tool and add a packaged, discoverable versioning skill with offline Promptfoo validation. Cover ISO week boundaries, SemVer formatting, branch and dirty-tree guards, release patch calculation, tag integrity, and stamping output with focused tests.

    Provide a clean-checkout bootstrap that builds the Go tool before it launches the stamped Bazel command. Bind ref transactions to the inspected commit, neutralize Git replace/graft/routing inputs, make dry runs validate namespace collisions, validate every published patch tag against its exact first-parent position, reject ambiguous or inconsistent tag states, and require explicit context for detached release calculations. Route detached release-tag selection through those same history-integrity checks. Keep development status cache-safe by emitting Git identity as volatile data while making immutable nightly and release identities stable.

    Add a repository-delivery integration regression proving that a failed aggregate whitespace check identifies the offending path exactly once.

    Verified with:

    • bazel_agent test //tools/versioning/… //tools/repo_delivery/main/go:go_test //:write_skill_links_test //:buildifier_test
    • bazel_agent build //tools/versioning/… //tools/repo_delivery/…
    • tools/versioning/cmd/versioning/versioning.sh bazel – build –config=release //tools/versioning/cmd/versioning
    • real Git integration tests covering ref transactions, SHA-256 repositories, environment isolation, detached contexts, tag ordering, and namespace collisions

    LLM-disclaimer: This commit was generated by an LLM.

  • Add standalone documentation rules

    Move docs_filegroup into a reusable rules_docs nested Bzlmod workspace and migrate every root and nested consumer to it. Add a module-aware Gazelle language that creates docs targets only for existing README packages while preserving manual mappings.

    Wire the workspace into module resolution, documentation aggregation, and the ten-command full-repo-check. Add the bazel-nested-module skill so future nested workspaces follow the repository’s rc, lockfile, docs, toolchain, Gazelle, and validation conventions.

    Keep reviewed Gazelle dependency canonicalization, while protecting the hand-maintained Go proto, Python resource, Android, embedded-site, and skill runner definitions that generic language plugins would otherwise break.

    This commit was generated by an LLM.

  • Keep embedded site server in target configuration

    This commit was generated by an LLM.

  • Fix Bazel build caching and tool configuration

    This commit was generated by an LLM.

  • Remove redundant documentation mappings

    Inline sources from eight layout-neutral pkg_files wrappers and migrate the remaining legacy Vial docs producer to docs_filegroup. Keep only mappings that perform required renames.\n\nThis commit was generated by an LLM.

  • Complete docs filegroup migration

    Pass ordinary documentation sources directly and isolate generated or renamed outputs in semantic pkg_files dependencies. Remove the obsolete renames and strip_prefix surface from docs_filegroup.\n\nThis commit was generated by an LLM.

  • Make release generation hermetic

    Add the missing AL and Kustomization release targets and give release actions a declared bare Git snapshot instead of access to the workspace repository.\n\nThis commit was generated by an LLM.

  • Migrate documentation packaging to docs_filegroup

    Preserve custom prefixes, renames, strip prefixes, and standalone workspace behavior.\n\nThis commit was generated by an LLM.

  • Make Qt and Maven dependencies hermetic

    Align protobuf with the Android build tools and refresh generated locks.\n\nThis commit was generated by an LLM.

  • Make Android SDK setup reproducible

    This commit was generated by an LLM.

  • Add agent-friendly Bazel config

    This commit was generated by an LLM.

  • Use an image from the marketplace, update some locks, add CODEOWNERS
  • Finish opencode deploy
  • Add //third_party/org_fedora_cloud, fix alwaldend.com roles
  • Set up unikernel deploy
  • Refactor flux manifests a bit, add //tools/ops
  • Add a server to //projects/alwaldend.com
  • Add OIDC for k3s, add OIDC fetcher to injector
  • Add drawio-desktop, add //infra/arch, update opencode restrictions
  • Finish forgejo_login, add org to forgejo tf, remove cl1
  • Add //third_party/org_kernel_headers, rename all deps files to include
  • Add //third_party/org_nmap_nmap
  • Fix ssh key signing
  • Add ssh key signing to injector, remove more FP from injector
  • Finish the lifecycle manager, intergrate it
  • Continue working on the lifecycle manager
  • Add a lifecycle manager
  • Add WaitCtx to fp.WaitGroupE
  • Split startups and shutdowns, add timeouts to shutdowns
  • Improve plugin clients and servers
  • Improve plugin concurrency, remove FP from tf_backend
  • Migrate all state to Vault
  • Finish rewriting the injector into a gRPC plugin
  • Set up convertation between protobuf json and regular json
  • Continue rewriting the secret injector to a plugin
  • Continue rewriting the injector to a plugin
  • Continue rewriting the vault injector to a plugin
  • Add //tools/vault/injector, start migrating resource_handler to it
  • Add pipes with error and panic handling, add some more FP stuff
  • Fix plugins broken after the refactor, remove main from bazelrc, move FP updates
  • Refactor FP to use recursive generics, add some iterator handling
  • Add more FP stuff, add plugin configs to al.lua, migrate pve_login and tf_backend to new configs
  • Move //tools/al to //projects/al, add Result and Pipe to fp
  • Automate root token generation, split the main vault policy into separate ones
  • Set up cert authentication
  • Add //tools/ykman
  • Add //tools/al, remove //tools/secrets, set up proper approle workflow
  • Setup Vault token helper using gnome-keyring
  • Disable mTLS of the Vault instance, add unsealing information, setup //tools/vault
  • Fix some Js and Python CVEs
  • Add some information about SSL
  • Add new pgp key, rename //data/gpg to //data/pgp, add some info about ssh and pgp
  • Add data to //projects/alwaldend.com, add //data/gpg
  • Use write_source_files for git_hooks
  • Add lvol role, setup LVM volumes on bm3
  • Remove //tools/docs, remove .github
  • Finalize rules_template refactoring
  • Update dns
  • Add rules_distroless, add some qubes os info
  • Remove al_go_cross_binary, update the setup guide a bit
  • Update the setup guide, update android tools, update leetcode, update books
  • Update the repo setup doc a bit
  • Add //tools/word_lists, update DNS and glossary
  • Update leetcode
  • Add build_test tests
  • Fix urllib vulnerabilities
  • Add editing, encryption, decryption
  • Start adding secret rules, add badges to books
  • Move all the logig out of the screen to the controller
  • Add deploy to dockerhub, add //tools/oras
  • Remove last modification footer
  • Add missing features to the Pomodoro app, update project readmes, add github pages
  • Update infinitime patch, start adding trufflehog rules
  • Add hugo lock support, add proper hugo toolchain support, improve the ansible lock
  • Move all remaining code to main
  • Move a portion of tool code to main
  • Move the registry to //projects/bazel_registry
  • Add minisign rules
  • Remove sites taxonomy, start adding xray_manager
  • Fix release page rendering
  • Move to a light nvim theme, add full git info to releases
  • Add release_page generation, remove redundant release templates
  • Fix nvim library paths
  • Parallelize git info retrieval
  • Move links to the config, use list groups
  • Remove contracts tree
  • Add changelogs
  • Allow docs to put content outside of docs, refactor git to just use .git directly
  • Add the footer back, add hugo env information
  • Move release items to a list group, add item counter
  • Add cross-compilation, move leetcode downloader contracts out of //contracts
  • Refactor release templates into partials, add release cards
  • Add RSS links, rewrite links shortcode to html, improve release tables
  • Add file size to releases, add round_float partial
  • Write release tool in go, start adding it to projects, add py proto generation
  • Add release rules, add gzip rules, add several other tools, remove autoscrool deps from the root
  • Add dev_shell rules, add make_install_binary, flatten sh rules, add dotfiles/bin
  • Add //tools/make_install, start moving dotfiles to it
  • Add label_link shortcode, add todo page
  • Move book data to data/books
  • Add tools/rfc
  • Add bzl snippets to proto docs, add targets for ansible playbooks
  • Remove the footer from the docs
  • Add dnscontrol rules
  • Move book data to the books page, add lazy loading, save some thumbnails locally
  • Make tables more compact
  • Disable inline partials, add last modified section
  • Tweak tables again
  • Improve tables on home and books pages
  • Improve tables
  • Do not use nested tables in docs/misc/books
  • Fix book rendering, add arm CI for some reason
  • Add git image, split root MODULE.bazel
  • Add more taxonomies, remove docs tree, move alwaldend.com to projects
  • Initial commit
  • Update vulnerable Go dependencies
  • Add spellcheck skill

    This commit was generated by an LLM.

  • Consolidate agent policy into owning skills

    Reduce the root AGENTS.md from 255 lines to 141 by keeping repository-wide constraints visible and moving execution detail to the skill that owns it.

    Make initial reads task-dependent, replace the absolute one-copy rule with one authoritative source, simplify the retry rule to its principle, and fix the generated-file delivery ambiguity. Add a single “When to load a skill” routing table ordered by task phase.

    Add the repo-workspace skill so worktree isolation and task-scratch placement are established before the first write rather than when repo-delivery loads. Transfer commit-subject and trailer conventions into a repo-delivery reference and the Go and Bazel-native automation rules into repo-bazel. Reconcile the git-rebase-remote and repo-delivery drift so a task-owned rewrite may change ancestry while preserving every previously remote commit’s reachable progress.

    OpenSpec-Change: infra/src/openspec/changes/consolidate-agent-policy-into-skills

    LLM-disclaimer: This commit was generated by an LLM.

  • Restore light and dark site canvases and set the shared accent

    The shared Docsy canvas set the same Bootstrap dark palette and the same black page background on :root, [data-bs-theme="light"], and [data-bs-theme="dark"], so the light/dark toggle changed nothing. The site also rendered Bootstrap’s stock blue instead of its intended accent.

    Split the shared palette so light mode uses a pure white canvas with the light-mode palette and dark mode uses a pure black canvas with the dark-mode palette, and keep the pre-stylesheet paint and footer on the active mode. Assign $primary to #7c3aed before Bootstrap compiles, so links, buttons, badges, focus rings, and the dark-mode link tint all derive from one value rather than from a site-local copy.

    Both files stay in the reusable shell; the apex site consumes them through the existing declared exports and no longer carries the footer’s own blue.

    OpenSpec-Change: projects/hugo_landing/openspec/changes/restore-light-dark-canvas-and-accent

    LLM-disclaimer: This commit was generated by an LLM.

  • Record the removal of the unowned goal DNS record

    The goal-landing repository, its catalog entry, and projects/goal/dnsconfig.json were deleted by fe25efac, but goal.alwaldend.com survived as a public CNAME to alwaldend.github.io. No dnsconfig.json declared it and no Terraform state contained it, so no owner could plan its deletion through the declared flow and it was not part of the 19 project roots this change retired.

    It was removed by a direct Cloudflare API delete, scoped to that one record in the public zone, under the explicit instruction to remove it. The record now returns no answer from either public resolver and its HTTPS request no longer completes a TLS handshake. A full comparison of the live zone against every declared global record finds no other undeclared name.

    Update the retirement evidence to record the removal and why the record was unmanaged, and drop the claim that it was left in place.

  • Record the completed per-project landing teardown

    The retired project landings were torn down on 2026-09-20, after the apex deployment began serving their replacements. Every former route was verified first: /projects/, /projects//, /docs/projects//, and the taxonomy term pages returned 200 on both the apex and the staging hostname.

    The GitHub root destroyed 120 resources across 20 landing repositories. Its 20 github_branch instances were removed from state first because GitHub refuses to delete a repository’s default branch through the branch API, and deleting the repository removes the branch anyway. The GitLab root destroyed its 20 landing projects under a plan scoped to those projects so the unrelated www-staging mirror creation stayed out, and the 20 branch protections left pointing at deleted projects were removed from state.

    Each retired DNS root was operated from revision 83dfca7f in a task-owned worktree, because this change removed the roots and their Vault-backed states have no owning target in the delivered tree. Every root planned exactly one cloudflare_dns_record destroy and all 19 applied with no errors. None of the former 19 hostnames resolve now.

    The prevent_destroy guards on shared repositories, branches, collaborators, organization settings, the GitLab group, and memberships were relaxed only for the orphaned landing instances and restored immediately; verification plans for both forge roots and the shared DNS root report no changes.

    goal.alwaldend.com still resolves and returns 404. It is declared in no dnsconfig.json, appears in no Terraform state, and has no catalog entry, so it is the pre-existing drift this change already recorded and was left untouched rather than folded into the retirement.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/consolidate-project-landings-into-apex

    LLM-disclaimer: This commit was generated by an LLM.

  • Record the project index requirement and close staging verification

    Add the documentation-axis requirement to the site-staging spec and mark the deploy and validation tasks complete. Record the lifecycle-ordering idea as a deferred task rather than leaving it unstated.

  • Center the project index on the documentation axis

    The section index resolved layouts/projects/list.html inside the default baseof, whose bare

    gave it no grid column and no padding offset from the .td-main main rule, so it rendered full width at 48px with a 128px heading.

    Give the section its own projects_index type with a baseof that keeps the documentation row and column but omits both asides. The index now starts at 88px and centers at 259px with a 771px column, matching /docs/ and /blog/ exactly.

  • Render the project index in the documentation column

    The index rendered in the layout’s root wrapper, so its text spanned the full page width instead of the column the documentation and blog pages use. That made it read as a stray full-width list rather than a page of the site.

    Lay the index out like a documentation list page: the documentation column (col-12 col-md-9 col-xl-8 ps-md-5) inside a row, the section description as a lead, and the theme’s section-index entries separated by a panel line. The documentation sidebars are deliberately absent, so the list stays a plain single-column page.

    LLM-disclaimer: This commit was generated by an LLM.

  • Lay the project index out as a single-column section list

    The card grid read as a separate component next to the rest of the site. The /projects/ index now uses the same section list as the documentation index: one entry per project under the Projects heading, separated by panel lines, each entry carrying its description, status, and tags. The entries stay in alphabetical order.

    Wrap the list in a section so the theme’s first-section offset applies; without it the Projects heading rendered underneath the fixed navbar.

    LLM-disclaimer: This commit was generated by an LLM.

  • Add a staging publication and refine the project index

    Verify the project landing replacement on its own hostname before the apex changes and before any per-project resource is retired, and make the landing index useful to a visitor.

    www-staging.alwaldend.com gets a checked-in DNS declaration and a catalog repository, and the apex site gains a staging build that renders the same packaged source with the staging base URL plus a deployment command that publishes it. The publication command now takes its repository and branch as arguments, so staging and production share one publisher, and a repository whose publication branch does not exist yet is created as an orphan instead of failing on clone. A new repository receives a default branch at creation so the managed ruleset can protect it while site content publishes to a separate branch, and GitHub Pages configuration is deferred for a repository until its publication branch exists.

    The /projects/ index no longer opens with explanatory prose, lists landings alphabetically, and shows each project’s status and tags as links to their taxonomy term pages.

    Deploy the staging site, verify the landing, documentation, and taxonomy routes there, then deploy the accepted output to the apex and verify the same routes. The per-project hostnames, DNS records, and landing repositories remain in place until their retirement is requested.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/site-staging-environment

    LLM-disclaimer: This commit was generated by an LLM.

  • Move project landings into the main site

    Publish every registered project’s visitor-facing landing page at /projects// from the main site instead of a dedicated subdomain, and retire the per-project Pages repository, CNAME, and Terraform DNS stage that existed only to serve one page derived from the project README.

    Each project owns its landing content in projects//site/content/ as pure content: no layouts, styles, or build rules. The main site packages those directories into content/projects// from the registry in projects/projects.bzl, so membership is declared once. The landing is a short hand-written page for visitors while the README keeps its /docs/projects// URL for repository reference documentation, and landing front matter now feeds the statuses, languages, and tags taxonomies.

    Merge the reusable hugo_landing project into the main site: its shared canvas and accent styles and its landing page rules move into the apex tree, and its landing macro, generated configuration, standalone publisher, and repository-relative rewrite layouts are removed. The theme keeps owning the taxonomy and term layouts, which are richer than the heading-only versions the reusable project carried. Remove the now-unused apex deploy_project.sh and deploy_all.sh landing publishers with it.

    Retire the per-project publication and DNS ownership: the project landing targets and the landing deployment command, each landing project’s dnsconfig.json and Terraform root, the build plumbing that served only those stages, and the landing repository and Pages membership in the repository catalog. The apex Terraform root is retained because it also declares VM resources, and no Vault configuration is changed.

    Replace the provider-snapshot zone files with generated declaration pages, one per destination view, that project the checked-in declarations and are verified for freshness by the DNS offline check. The DNS linter, both destination pages, the apex site, the skills projection, and the repository quality suite pass, and the whole repository builds.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/consolidate-project-landings-into-apex

    LLM-disclaimer: This commit was generated by an LLM.

  • Propose native Nexus deployment on XCP-ng

    Add an owner-local OpenSpec proposal, design, capability deltas, and implementation checklist for native Nexus 3 and PostgreSQL on one VM. Define PyPI, npm, and Docker Hub proxies with Vault-backed configuration and separate provisioning, Ansible, service Terraform, and Traefik ownership.

    This change contains planning artifacts only. Implementation and live deployment remain outside this handoff. Register the planning workspace for strict repository validation and document component ownership. Link a collection-owned PostgreSQL proposal that defines the reusable role’s initialization, authentication, ownership, extension, and compatibility contracts with their own acceptance tasks.

    OpenSpec-Change: infra/nexus/openspec/changes/add-nexus-deployment

    LLM-disclaimer: This commit was generated by an LLM.

  • Add shared CI tooling and reusable runner roles

    Extract the tools/ and projects/ changes from #88 into a prerequisite PR. Include skill discovery, the runner 13.1.0 pin, and the existing repository CI specifications and evidence. The CI skill starts from the shared tools and reads workflow and deployment sources only when present in the checked-out tree.

    Provide the shared Bazel CI entry point and local Node action, Android installer packaging, CI Bazel configuration, reusable runner/SDK/Vault time roles, and Forgejo login configuration overrides. Deployment configuration and workflow activation remain in #88, which will be based on this branch.

    The workflow and infrastructure consumers belong to that dependent PR. Merge this prerequisite before #88.

    Validation covers repository quality, affected semantic lint, CI/action/login unit tests, SDK and Ansible packaging, and the representative nested workspace.

    OpenSpec-Change: infra/src/openspec/changes/archive/2026-09-20-repository-ci-entrypoint OpenSpec-Change: infra/src/openspec/changes/archive/2026-09-20-thin-repository-ci

    LLM-disclaimer: This commit was generated by an LLM.

  • Move agent tooling and binary dependencies to their owning trees

    Move repository-wide agent skills from projects/agents to tools/agents, update skill discovery and documentation, and remove the product landing registration.

    Place all 24 main-module binary toolchain dependencies under upstream-named third_party packages while keeping first-party wrappers and configuration under tools. Preserve dependency pins and standalone Bazel module independence. Update the layout and dependency skills to document this ownership policy.

    LLM-disclaimer: This commit was generated by an LLM.

  • Unify site theme and repair documentation navigation

    Give the homepage, documentation, projects, and blog a shared monochrome light/dark theme with quiet controls, thin scrollbars, compact tags, and an Al favicon outlined in Architects Daughter. The homepage panel shows primary links and permanently visible indented projects with their destinations. Tree highlights cover whole rows while expansion controls remain independent.

    Derive missing documentation titles and ancestor sections during site packaging so OpenSpec pages have readable navigation, breadcrumbs, search results, and print headings. Preserve original Markdown and anchors. Support keyboard tree toggling, readable deep indentation, bounded scrolling, and visible active rows. Repair the blank 404 view, tag-index spacing, expanded release contrast, print callouts, and narrow book tables.

    Record the requested testing policy in AGENTS.md. Verify representative pages and collapsed/expanded navigation in a real browser across both color modes and desktop/mobile viewports, preserving repeatable scripts and screenshots. Run the site build test, repository quality checks, and affected target lint.

    OpenSpec-Change: projects/alwaldend.com/openspec/changes/archive/2026-09-24-repair-documentation-navigation

    LLM-disclaimer: This commit was generated by an LLM.

  • Plan static hosting and SSH release publication

    Capture one Traefik/Nginx VM per environment with public and local DNS, public release files, and symlink-selected archived websites.

    Link owner plans for the Nginx role, Vault AppRole, release-tool SSH deployment, and reusable downloads listings in the main website. Specify 100 GB of content storage per VM, no backups, and existing-release selection through redeployment. All new implementation tasks remain unchecked.

    Preserve the existing www HTTPS redirect and reconcile the active landing plan so archiving it cannot restore the former Pages publication workflow.

    Validation: strict OpenSpec validation for the five new changes and the reconciled landing plan, formatting, and local document-link checks. Repository delivery gates run on the commit.

    OpenSpec-Change: infra/download/openspec/changes/add-static-hosting

    LLM-disclaimer: This commit was generated by an LLM.

  • Add configurable random pixel icon generator

    Add a Go CLI that writes PNG patterns with configurable canvas dimensions, background, palette, initial density, cell size, and square or circle shapes. Select compact groups (default), winding strands, replication, or persistent tips through –clusterization-algorithm. Compact and strands preserve sampled cell count; replication gives each cell one chance to add two empty adjacent children, which can reproduce in turn. Parents remain visible and adjacency includes diagonals.

    Configure replication direction inheritance, forward bias, crowding avoidance, and sideways branching. Optional smooth regional fields vary reproduction and seeding, with adjustable scale and separate strengths. Normalized local seeding probabilities preserve average initial density. Zero controls reproduce prior output, and zero base reproduction probability always prevents births. Use only the Go standard library, with bounded grid and queue memory and no full-resolution field buffer.

    Tips extend one cell along a gradually curving heading, with occasional shorter side branches. Forks divide a bounded growth budget, and collisions and edges stop tips. Density controls roots and clusterization scales growth length. Sparse individual-pixel renders show curved stems and open gaps.

    Preserve existing output files and remove incomplete writes. Include executable-level checks with replayable PNG artifacts, usage documentation, the project landing page, and completed OpenSpec capabilities. Fix an existing defaults-page reference that blocked the shared site build.

    Validation covers geometry, palette, replay, default and boundary options, compact contacts, strand morphology, paired reproduction, retained parents, growth controls, regional density/contrast, connected tip growth, single-child extension, constrained canvases, and output failures. Prior PNGs match byte-for-byte, nine example commands replay exactly, and controlled comparison renders include representative visual inspection. Maximum-size regional and tip generation complete with bounded memory. Repository quality, affected lint, OpenSpec checks, and the shared Hugo site are checked against the delivery candidate.

    OpenSpec-Change: projects/icon_generator/openspec/changes/archive/2026-09-27-grow-persistent-tips

    LLM-disclaimer: This commit was generated by an LLM.

  • Update book drop chapters

    Record drop points for eight books in the books catalogue.

    Move four existing entries to the requested chapter: Mask of Humanity (C366 to C367), The Tower of Infinite Evil (C127 to C172), Re:Cursed (C176 to C217), and Hell Difficulty Tutorial (C841 to C891).

    Add the four books that were absent, each at its requested drop point: Exemplary (C30), REND (B4C5.1), Erind x Deen Alternate Reality Spin-Off of REND (C94), and Father of Monstrosity (C9 (IX)). Register the three new author keys (wupwup, temple, dosei) in authors.toml.

    LLM-disclaimer: This commit was generated by an LLM.

  • Propose the X Article uploader as a new project

    Blog posts live as Markdown under the site content tree, but X Articles has no Markdown import: its draft endpoint accepts only a DraftJS content_state, and publication is a separate authenticated call. Republishing a post by hand means recreating its structure, inline styles, links, and code blocks in X’s editor.

    Record the planning artifacts for projects/x_article_uploader, which compiles a post into a content_state document and can create and publish it. Conversion stays offline, deterministic, and credential-free; publication is the only path that uploads media and calls the API, so a draft can be reviewed before anything becomes a post.

    Write the three capability specs, the design, and the task list. The design records the measured reasons the converter parses Markdown instead of scraping Hugo-rendered HTML: only seven render hooks exist, with no paragraph, list item, or emphasis hook, and hooks expose no offsets for the inline ranges that DraftJS requires. Headings map by clamping, since X exposes three levels, code fences and tables are preserved as markdown entities because X has no table construct, footnotes become a trailing section, and images become skeletons that publication resolves by uploading media.

    Address the review by stating the input model explicitly: a source post is front matter plus body, the parsed title is carried to draft creation because content_state cannot hold it, and a missing title fails conversion. Correct the entity schema inventory, which had listed url as an accepted field without noting it is documented for link entities, and record that the media endpoints accept no SVG type while all six current image references are SVG, so the converter reports those images instead of emitting entities that cannot resolve. Discover the covered posts from the content tree so diagrams-in-ac-era is no longer omitted, and reorder the tasks so behavior coverage and failure cases are written before the implementation they check.

    Name the approved Markdown parser, github.com/yuin/goldmark, and record why the already-present rsc.io/markdown is not a substitute: its table support is marked TODO and it parses no footnotes, while a current post has an 11-row table and a footnote. Give the end-to-end check a per-post expected outcome, because a post whose images the upload endpoints reject must fail with the named diagnostic rather than satisfy the mapping contract. Add the raster-only image policy for posts from now on, with a WebP raster render path for Mermaid diagrams and authoring guidance that states it, since no SVG image can be uploaded.

    Carry the artifact the publisher actually needs and the requirements the second review found missing. The draft artifact records each unresolved image’s source locator beside the document, because the API entity data object rejects additional properties and cannot hold a path, and publication resolves the bytes from that locator without re-parsing Markdown. Inline ranges are measured in UTF-16 code units, since a byte or rune offset selects the wrong characters after a supplementary character. Plan the uploader’s al.lua, al_config target, and injector wiring, and give the raster policy, the raster render rule, and the uploader’s Vault identity their own owner changes: projects/alwaldend.com/openspec/changes/add-raster-blog-images, tools/mermaid/openspec/changes/add-raster-diagram-renders, and infra/vault/openspec/changes/add-x-article-uploader-credentials. Register the new tools/mermaid workspace for validation.

    Extend the locator contract and the reuse state the third review asked for. Each locator records the post package its relative path resolves against, so a moved artifact still identifies its base, and a digest of the bytes as they were at conversion time, so the publisher has the value it tests the current bytes against. Publication keeps the digest-to-media_id mapping in its own cache under the task’s ignored output directory, since a digest alone cannot recover an identifier from an earlier process and the reviewed artifact must stay unchanged. Register both new workspaces, this project’s and tools/mermaid’s, in the repository validation map.

    Map the last constructs the fourth review found unstated: an inline-code span keeps its literal text with the lost code styling reported as a continuing diagnostic, a thematic break becomes an atomic block with a divider entity because X exposes divider for exactly that purpose, and conversion diagnostics now distinguish constructs whose content would be lost, which fail, from formatting that cannot be reproduced, which does not. Bind each locator to the entity it resolves by entity key so publication attaches a media_id by identity rather than by position. Give the Vault owner change its own implementation tasks and make the uploader carry it out, reorder the raster group so its end-to-end check precedes the render path, have the publisher’s coverage task state its success cases before implementation, and drop the duplicated missing-credential requirement from the Vault spec so each fact keeps one owner. Give those new mappings the rest of their chain rather than leaving the requirements unowned: a design decision recording why inline code keeps its text while a thematic break becomes a divider, converter tasks 4.11 and 4.12 that implement them and bind each locator’s entity key, and a behavioral-tests contract that names the continuing diagnostic as part of a conforming post’s recorded outcome instead of only the failing one.

    OpenSpec-Change: projects/x_article_uploader/openspec/changes/add-x-article-uploader Also-Changed: projects/alwaldend.com/openspec/changes/add-raster-blog-images, tools/mermaid/openspec/changes/add-raster-diagram-renders, infra/vault/openspec/changes/add-x-article-uploader-credentials, infra/src/openspec/validation/BUILD.bazel

    LLM-disclaimer: This commit was generated by an LLM.

  • Add the X Article uploader with a WebP diagram render rule

    Add projects/x_article_uploader, a Go project that compiles a blog post’s Markdown into a DraftJS content_state document offline and creates an X Article draft from it under an injected OAuth 1.0a user-context credential. Conversion and draft creation are separate operations, and draft creation is the only operation that performs network calls. The converter parses front matter for the title, maps block and inline constructs onto the Articles vocabulary, resolves images to media uploads through digest-keyed locators, and reports each construct it cannot represent. The converter derives an omitted post package from an explicit –workspace and opens the directory through a descriptor-anchored handle on it, so a symlinked post directory that escapes the workspace is refused rather than recorded, and reads the post’s images through that descriptor-anchored handle – whether the package was derived or supplied – accepted by comparing the identity of the directory it opened, so a package retargeted between the check and the read cannot redirect a read. The post’s source text is read through that same handle, so a source symlink cannot supply one post’s Markdown while the artifact records another package’s images, and ordinary prose resolves Markdown escapes and character references the way a renderer presents them. An image caption is built node by node, so it resolves the same encodings in its non-raw content while a raw span such as a code span inside it keeps its literal source instead of having its backslashes stripped. A list item is emitted as one list-item block carrying all of its paragraphs, including a paragraph that resumes after a nested list, with the item’s own block constructs following it in source order rather than one block per paragraph. A heading inside a block quote stays quoted content in a blockquote block instead of becoming an ordinary heading, with the lost level reported; quote ancestry is tracked through a nested list so a quoted heading inside a list item cannot escape the quote either.

    Emit the exact wire shape the Articles draft endpoint accepts rather than the canonical DraftJS spelling: each block names its ranges inline_style_ranges and entity_ranges and carries no depth, and entities is a mapping of {key, value} entries whose value carries type, mutability, and data. The endpoint’s schema sets additionalProperties: false, so the camelCase range names, a depth field, and a flat DraftJS entity list are each rejected before the content is read. The end-to-end check asserts the emitted field names against the raw JSON, so a renamed field fails the check rather than being ignored by a struct decoder. The uploader creates drafts only: it calls no publish endpoint and exposes no publish flag or method, so no invocation of the tool can make an article public and a draft becomes public only through a separate review step. The library, command, and test file are named for draft creation rather than publication.

    The credential lives inside the uploader’s own AppRole subtree, the same shape every other component uses, so the shared vault_approle module’s own-subtree policy grants the read without a bespoke module or namespace. The uploader’s al.lua names the mount and the logical path directly, exactly as every other component’s injected reference does, so there is no second declaration to keep in step and only a reference, never a value, is checked in.

    Add tools/mermaid’s mermaid_webp rule, which renders the maintained SVG and has the pinned browser encode it to WebP, so a post with a diagram can be drafted to an endpoint that accepts no SVG. Update the Mermaid and blog authoring guidance with the raster rule and the accepted media types.

    Add the uploader’s Vault AppRole, least-privilege policy, and injected credential reference, and register the project and both owner workspaces.

    OpenSpec-Change: projects/x_article_uploader/openspec/changes/add-x-article-uploader

    LLM-disclaimer: This commit was generated by an LLM.

  • Support X Article banners and dark blog diagrams

    Use the first frontmatter images entry as the X Article banner while keeping body images inline. Validate all image sources before requests, upload media separately, and reuse one unexpired media ID for identical banner/body bytes. Verify the optional cover_media payload with local HTTP end-to-end tests.

    Render the demonstration diagram in the native dark site theme with modest margins. Show Markdown conversion, separate media upload or cache reuse, attachment of media IDs, and Article draft creation. Reuse bundled raster images in Open Graph and large Twitter cards, and backfill the other post with an opening diagram. Encourage images in the blog authoring skill.

    Add and register the project-owned x-article-upload skill with the offline conversion and Vault-injected draft workflow, both X limits, and the expired Vault bootstrap-token failure mode. Validate rendering, social metadata, conversion, media reuse, asset freshness, and skill configuration. No live X request or site deployment is performed; the demonstration post stays a draft.

    OpenSpec-Change: projects/x_article_uploader/openspec/changes/archive/2026-10-01-add-x-article-uploader

    LLM-disclaimer: This commit was generated by an LLM.

  • Publish the X Article story and harden its upload workflow

    Publish the reviewed development story and render blog front matter images before article text and in print output. Remove redundant opening Markdown images from the two illustrated posts. Keep the first selected image as the X Article banner and preserve every image explicitly written in Markdown. Document the shared image metadata and encourage its use for every post.

    Retain rate-limit headers on failed X requests and report their reset times and conservative retry boundaries. Keep retries manual and distinguish historical quota observations from the latest response. Reject HTTP redirects without following them so draft and media POSTs cannot be replayed by a redirect response, and prevent automatic replay of consumed POST bodies.

    Recover expired Vault certificates through a host-limited Ansible tag that stops before reload on certificate errors. Preserve the Vault node identity, use its canonical connection hostname, and include that name in the certificate. Document temporary Vault TLS bypass, repository SSH CA trust, and verification after renewal. The authorized renewal succeeded with normal TLS restored.

    Validate static images before network requests and wait for media processing with signed, bounded status checks. Scope cached media to the endpoint and OAuth credential context, account for upload time and expiry, and refuse identifiers that expire while other images upload. Emit mutable Markdown entities and replace byte counting with an explicitly approximate weighted budget, preserving the original Markdown source.

    Validation: uploader conversion and HTTP E2E tests, site browser and skill checks, repository quality and semantic lint; packaged Ansible syntax and task selection; strict OpenSpec validation and live certificate/hostname verification.

    OpenSpec-Change: projects/x_article_uploader/openspec/changes/archive/2026-10-02-omit-opening-banner-images OpenSpec-Change: projects/x_article_uploader/openspec/changes/archive/2026-10-02-preserve-api-rate-limit-headers OpenSpec-Change: infra/vault/openspec/changes/archive/2026-10-02-recover-expired-server-certificate OpenSpec-Change: projects/x_article_uploader/openspec/changes/archive/2026-10-02-enforce-article-upload-contract OpenSpec-Change: projects/alwaldend.com/openspec/changes/archive/2026-10-03-render-blog-frontmatter-images OpenSpec-Change: projects/x_article_uploader/openspec/changes/archive/2026-10-03-preserve-explicit-body-images

    LLM-disclaimer: This commit was generated by an LLM.

  • Fix X Article uploads, payload artifacts and blog covers

    The full article failed with HTTP 503 because X currently rejects header-three, although its published schema permits it. Clamp third-level and deeper Markdown headings to header-two while preserving their text. A controlled full-post upload succeeded with only that block type changed; the converter now reproduces the accepted payload. Update the existing conversion checks and mapping contract.

    Use 5:2 image files for both existing blog headers, matching X Article cover display. Add optional aspect-ratio padding to the hermetic Mermaid WebP renderer, preserve each diagram’s complete content and theme, and arrange the upload pipeline for the wider canvas. Validate intrinsic and displayed dimensions, content placement, backgrounds, and unchanged default raster behavior. Encourage optional WebP headers in images with a 5:2 canvas in the blog skill, and cover the guidance in its existing offline evaluation configuration.

    Add the official xurl v1.3.4 CLI through a checksum-pinned Linux x86-64 toolchain and repository wrapper for independent API diagnostics.

    Nest X request fields under payload and retain local media locators alongside it. Report diagnostics only to stderr, fail command conversion on warnings by default, and allow an explicit warnings-as-errors override. Reject legacy flat artifacts before upload and attach resolved banner IDs inside the payload. Validate the CLI contract with executable E2E cases and update its specification and upload guidance.

    Expand the blog explanation with example X payload and offline artifact JSON, clarify Hugo render-hook limitations and media resolution, and align its heading showcase with the upload fix. Preserve the reviewed author wording.

    Define blog article deployment as verified site deployment followed by an unpublished X Article draft upload, unless the user narrows the scope.

    OpenSpec-Change: projects/x_article_uploader/openspec/changes/wrap-article-payload

    LLM-disclaimer: This commit was generated by an LLM.

  • Keep local download DNS on the IPv4 endpoint

    RouterOS forwards AAAA queries upstream when only a local A record exists. During the XCP-ng-only deployment, this sent IPv6 clients to GitHub Pages instead of the new local host. Add the documented dc1-only ::ffff override and explain why it is required while preserving public DNS.

    Validation covers DNS declarations, affected-package lint, repository quality, and a reviewed Terraform plan containing only the local AAAA record.

    LLM-disclaimer: This commit was generated by an LLM.

  • Add MLOps placeholder and repository change workflows

    Add mlops_2026 as an MLOps course placeholder with its course link and owner-local specification. Add FastAPI and uvicorn[standard], keep shared Python settings at root, and move dependency metadata and the lock to tools/py.

    Register repo-python under tools/py with mandatory type hints, and keep the repo-openspec integration skill under tools/openspec, routing generic workflow steps to the pinned upstream skills. Require review-agent for all change reviews, pinned to an immutable OpenAI Codex source archive with integrity and licensing. Generate its unchanged instructions and invocation metadata through Bazel skill discovery; remove the local review substitute.

    Require OpenSpec for every repository change in AGENTS.md and apply that policy through repo-workspace and openspec. Add and archive owner-local records for this PR, identifying their retrospective creation and validation limits.

    Validation: repository quality, dependency and Gazelle consistency, Python checker consumers, skill discovery and eval configuration, OpenSpec current and archived specifications, documentation builds, and affected semantic lint.

    OpenSpec-Change: infra/src/openspec/changes/archive/2026-10-04-organize-python-course-development

    LLM-disclaimer: This commit was generated by an LLM.

  • Add the MLOps recommender service and reproducible model training

    Serve typed health and versioned recommendations with bounded query counts, per-app model lifecycles, and default OpenAPI documentation. Package pinned course data and the sandbox-trained model.pkl through Bazel runfiles.

    Add the client HTTP and runtime/training Mermaid diagram and enforce namespaced imports in tracked first-party Python with the existing pinned ast-grep tool. Update the Python skill and preserve existing consumer exports during import migration. Shared changes are recorded in infra/src/openspec/changes/archive/2026-10-04-add-mlops-training-dependencies.

    Complete failure E2E for missing CSVs, corrupt models, and unsuccessful training without published output. Provide a dark 5:2 WebP preview of the build-rendered SVG documentation diagram. Show the requested high-level training and serving paths: Bazel dependency fetch to training to model.pkl; FastAPI to Model to the packaged file. Center container caption plates on borders in the shared site Mermaid theme, verified by native light/dark nested-container E2E measurements. Review completion is recorded in projects/mlops_2026/openspec/changes/archive/2026-10-04-complete-recommender-failure-verification.

    Validation: HTTP and model E2E, dependency/manifest consistency, OpenSpec, offline skill validation, repository quality, semantic lint, Autoscroll build, Blender audit, and Ansible packaging. Verify the rendered diagram and real Superman (It’s Not Easy) recommendations through the running service.

    OpenSpec-Change: projects/mlops_2026/openspec/changes/archive/2026-10-04-add-fastapi-health-app

    LLM-disclaimer: This commit was generated by an LLM.

  • Correct agent skill safety and workflow instructions

    Diagnose Android installation errors before removing application data and deploy persistent Codex configuration through the owning Ansible workflow. Preserve implementation authority across required OpenSpec planning.

    Correct Bazel runner syntax, the generated blog output path, and Hugo draft guidance. Extend the Android, Codex migration, and OpenSpec eval scenarios. Validate skill packaging, offline evaluation configurations, discovery, repository quality, and affected-target lint; offline checks do not establish model behavior.

    OpenSpec-Change: tools/agents/openspec/changes/correct-agent-skill-procedures

    LLM-disclaimer: This commit was generated by an LLM.

  • Simplify guarded review delivery

    GitHub review epochs can advance during read-only inventory collection. Treat that pre-resolution failure as recoverable, preserving the original unexpired reply receipt. Include first-page thread comments in the inventory query while retaining complete pagination and shared request, node, and byte limits.

    Add review address to verify an exact validated published candidate, derive provider guards, post a reasoned reply once, and resolve with its saved receipt. A durable attempt checkpoint prevents automatic reposting after interruption or unknown outcomes. Share publication and validation verification with existing commands; update the delivery guidance and offline skill evaluation case.

    Validate real-Git delivery fixtures with deterministic forge failures, package lint, repository quality and buildifier, OpenSpec validation, skill packaging, and offline Promptfoo configuration validation. Fixtures produce a verifiable resolved-review JSON artifact; no new external dependencies are added.

    OpenSpec-Change: tools/repo_delivery/openspec/changes/simplify-review-delivery

    LLM-disclaimer: This commit was generated by an LLM.

  • Add work1 3x-ui node

    Configure work1 through the shared Terraform node module and Ansible inventory, using its njal.la IPv4/IPv6 addresses and existing Vault credential references. Use the njalla1 relay selection with an active Frankfurt replacement for its retired Düsseldorf relay, and document bootstrap prerequisites. Architecture documentation is delivered separately in PR #141.

    OpenSpec-Change: infra/threexui/openspec/changes/add-work1-node

    LLM-disclaimer: This commit was generated by an LLM.

  • Expose Anki services through the CLI

    Generate service and method commands from all 25 compiled Anki schemas, with protobuf JSON/TOML input and output and no per-method wrappers. Route execution and validation through one shared App operation supporting managed offline paths, borrowed connections and explicit TCP/Unix servers.

    Use the linked server through the same executable. Preserve caller-owned resources and make managed archive write-back explicit, enabled by the CLI and existing application workflows independently of request outcomes. Bound incomplete input by cancellation and timeout, and preserve linked Unix server lifetime across client disconnections.

    Verify installed execution, payloads, persistence, native connection ownership and package boundaries through end-to-end workflows.

    OpenSpec-Change: projects/anki_as_code/openspec/changes/add-grpc-api-cli

    LLM-disclaimer: This commit was generated by an LLM.

  • al