Skip to content

Work Log - 2026-04-26 - Python 3.14 Maintenance

🎯 Focus

  • OpsDev.nz docs site restructure for GitLab Pages
  • Python 3.14 module maintenance review
  • Prototype the worklog tool for standardisation

βœ… Completed

Docs Site Restructure

Restructured the public opsdev.nz repo for cleaner GitLab Pages + Zensical setup:

  • Moved website/docs/ β†’ docs/ at repo root for easier navigation
  • Moved zensical.toml to repo root; set site_dir = "public/"
  • Simplified CI pages job β€” just zensical build, no cd/mv gymnastics
  • Updated .gitignore to track public/ as build output
  • Updated README with collective-zero/RAMP context
  • Added docs/worklog/ section to the site
  • Updated oc_opsdevnz submodule to latest main

Python 3.14 Module Review

Reviewed all three OpsDev.nz Python modules for 3.14 compatibility:

Module Risk Key Actions
op_opsdevnz (v0.1.4) Low Add test coverage for env.py, octodns_hooks.py, CLI
octodns_metaname (v0.1.1) Low–Medium Fix duplicate __all__, version string mismatch, remove blank tests/__init__.py
oc_opsdevnz (v0.1.1) Low Add tooling config, fix missing Path import in test, add CLI tests

No critical 3.14 blockers found β€” no finally block issues (PEP 765), no deprecated APIs in active use.

Worklog Tool Prototype

Created scripts/worklog.py β€” a configurable worklog generator that:

  • Reads per-project config from worklog.toml (no hidden files)
  • Supports year, year-month, and flat directory structures
  • Generates frontmatter with date, author, tags
  • Configurable section headers per project
  • --list to browse existing entries, --init to scaffold config

πŸ”§ In Progress

  • fix/oc-opsdevnz-tooling branch β€” add ruff/pytest config, fix missing Path import
  • fix/op-opsdevnz-tests branch β€” add missing test coverage

🧠 Notes

Worklog Tool Vision

I've been developing and refining a worklog pattern across various consulting projects over the years β€” always some variation of a dated, frontmatter-tagged log of what was done. Each project had slightly different templates, directory structures, and section headers, but the core concept was always the same. Now it's time to standardise on it as an OpsDev.nz project.

The plan is to evolve this prototype into a proper published module (worklog-opsdevnz), so any new project β€” private or public β€” can just install it and start logging. The worklog.toml we have here becomes the default template, and projects can override sections, structure, and tags to suit their needs.

Site Migration

Over the past few days we migrated the OpsDev.nz public site from MkDocs to Zensical. Zensical is an actively maintained MkDocs-compatible static site generator. The migration gave us a chance to clean up the directory structure, simplify the CI pipeline, and add the worklog section.

DevOpsDays Wellington 2027

We've been reaching out to a few people about organising DevOpsDays Wellington 2027 and I think we're going to do it. My current contract is ending in a few weeks, so I'll have some time, and it makes sense to launch OpsDev.nz as "Collective Zero" to pilot our setup, build some infrastructure, and make our presence known β€” just as any corporate sponsor might do by organising a conference.

We're following the DevOpsDays.nz framework and looking for two other people from different organisations to help get things rolling and start communicating with the global DevOpsDays organisers. The full proposal is now live on the site at /devopsdays-2027/proposal/.

CI Pipeline

The pages job now auto-deploys on merge to main when docs change. The ruff lint job caught a few issues in scripts/metaname_register.py (import sorting, from exc in exception handling) β€” fixed and passing.

Zensical Navigation

Spent time investigating the best way to handle navigation for the worklog section. Zensical supports explicit nav (listing every page in zensical.toml) or auto-discovery from the folder structure. Explicit nav doesn't scale for daily worklog entries, so we switched to auto-discovery. The trade-off is that section labels are derived from folder names with title-case formatting β€” so dns-as-code/ renders as "Dns As Code" rather than "DNS as Code". Zensical has no documented mechanism for overriding section labels while keeping auto-navigation. We're living with it for now and may file a feature request.

⏳ Next

Tomorrow's Plan (2026-04-27)

  1. oc_opsdevnz tooling β€” Add [tool.ruff] and [tool.pytest.ini_options] to pyproject.toml, fix missing from pathlib import Path in test_operations.py
  2. op_opsdevnz tests β€” Add basic tests for env.py and octodns_hooks.py
  3. DevOpsDays Wellington 2027 β€” Draft outreach message for recruiting two co-organisers from different organisations
  4. Python 3.14 prep β€” Update requires-python to >=3.14 in octodns-metaname and op_opsdevnz pyproject.toml files (once tests pass)

Longer-Term

  • Formalise worklog.py into a proper module with tests and packaging
  • Contact DevOpsDays global core organisers to express interest
  • File Zensical feature request for custom section labels in auto-navigation
  • Planning for mid-May sprint on "RAMP" project

πŸ“ Session Notes

Completed today:

  • octodns-metaname cleanup committed and pushed to main (duplicate __all__ removed, __version__ fixed to 0.1.1, blank tests/__init__.py deleted)
  • Debugged submodule remote URL β€” was configured with HTTPS instead of SSH; switched to git@github.com:startmeup-nz/octodns-metaname.git so SSH signing works

Tooling used:

  • AI model: Qwen3.6-plus via OpenCode Go
  • Tokens used: ~181k
  • Estimated cost: ~$1.10