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.tomlto repo root; setsite_dir = "public/" - Simplified CI pages job β just
zensical build, nocd/mvgymnastics - Updated
.gitignoreto trackpublic/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, andflatdirectory structures - Generates frontmatter with date, author, tags
- Configurable section headers per project
--listto browse existing entries,--initto scaffold config
π§ In Progress¶
fix/oc-opsdevnz-toolingbranch β add ruff/pytest config, fix missingPathimportfix/op-opsdevnz-testsbranch β 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)¶
oc_opsdevnztooling β Add[tool.ruff]and[tool.pytest.ini_options]to pyproject.toml, fix missingfrom pathlib import Pathintest_operations.pyop_opsdevnztests β Add basic tests forenv.pyandoctodns_hooks.py- DevOpsDays Wellington 2027 β Draft outreach message for recruiting two co-organisers from different organisations
- Python 3.14 prep β Update
requires-pythonto>=3.14inoctodns-metanameandop_opsdevnzpyproject.toml files (once tests pass)
Longer-Term¶
- Formalise
worklog.pyinto 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-metanamecleanup committed and pushed tomain(duplicate__all__removed,__version__fixed to 0.1.1, blanktests/__init__.pydeleted)- Debugged submodule remote URL β was configured with HTTPS instead of SSH; switched to
git@github.com:startmeup-nz/octodns-metaname.gitso SSH signing works
Tooling used:
- AI model: Qwen3.6-plus via OpenCode Go
- Tokens used: ~181k
- Estimated cost: ~$1.10