Automated VM provisioning, Puppet installation, certificate management, node classification and initial configuration.
Bottomline Technologies · DevOps Engineer Lead 2015–2016
~95%
Fewer deployment errors
Standardized Linux configuration, middleware, security baselines and Puppet-driven provisioning workflows.
Bottomline Technologies · DevOps Engineer Lead 2015–2016
6
Applications migrated to Azure
Led planning and execution across approximately 18–21 services and 4–6 environments, meeting target release dates.
IntegraConnect · Cloud Modernization Lead 2016–2021
01 / SELECTED WORK
Built to be examined.
Runnable demonstrations. Clear tradeoffs. Evidence you can inspect.
FEATURED PROJECT01 — AZURE PLATFORM FOUNDATION
AI review with engineering guardrails.
A local language model selects Terraform review questions from a fixed catalogue. Python validates every response against the plan evidence; a deterministic policy keeps control of the decision.
The case study follows two real model failures through stricter prompts and response schemas, then preserves the measured local results.
Read the engineering case study Readiness / acceptance evidence
The problem
A repository copy can look complete while branches, tag objects or required ownership information differ. A migration needs explicit acceptance evidence and a way to represent what is still unknown.
What I built
An offline Python assessment tool, a read-only Azure DevOps collector and a disposable local Git rehearsal. Reports connect findings to evidence, accountable roles and next actions.
Decisions & tradeoffs
Compare annotated-tag objects separately from their target commits, and retain unknowns when collection cannot establish a fact. Keep the rehearsal local so it is repeatable without credentials.
Observed result
The altered rehearsal copy exposed one missing ref, one unexpected ref and two mismatches, including a changed tag annotation. Windows and Linux produced identical release ZIPs; each extracted package passed 50 tests.
What remains outside the check
Matching refs is one acceptance check. LFS, permissions and platform metadata need separate verification. The collector’s live mode has not been exercised against a real organization.
Check signed artifact provenance before promotion, then verify service recovery over HTTP. The case study documents a verifier failure, the fix and release evidence.
29 testsplus a real-signature check and signed-build rehearsal
Recovery runs on disposable loopback services. No production deployment is claimed.
These are independent portfolio demonstrations. Azure configuration is mock-tested, and infrastructure rehearsals use disposable local resources. The AI results establish contract compliance on a small synthetic corpus; broader model quality and reviewer time savings remain unmeasured.
02 / ARCHITECTURE EXPLORER
See how the pieces fit.
Explore the boundaries. Inspect the decisions behind them.
Choose a view, then a component to read its purpose, design tradeoff and source code.
Reserve the first /20 from the base /16 for the hub. Root-managed peerings connect it to Team A and, when enabled, Team B.
Tradeoff
This hub demonstrates network structure. It does not provide a firewall, gateway or shared-service workload; peering alone does not approve application access.
Give Team A its own network and workload subnet while retaining the existing module.spoke address. An optional tag override records the team owner.
Tradeoff
Keeping the original Terraform address avoids an unnecessary state-address migration. Team ownership remains tagging rather than a separate access-control boundary.
Enable a second spoke only when team_b is configured. A stable team_b key identifies the module and its two peerings; a validated allocation index reserves its /20.
Tradeoff
Separating instance identity from the address slot preserves stable Terraform addresses. Changing the allocation can still cause network changes and requires plan review.
Build each VNet, a /24 workload subnet from its /20 allocation, an NSG and the subnet association. A priority-4096 deny rule explicitly blocks all inbound traffic.
Tradeoff
Future workloads need narrowly scoped allow rules with lower priority numbers. Outbound traffic still uses Azure defaults; this module does not implement egress filtering.
The plan feeds policy → report and bounded evidence → local model → response validation → report. The model path cannot change the policy decision; invalid responses stop the review with exit 2.
COMPONENT NOTES
Saved plan JSON
Purpose
Read saved-plan JSON locally, validate the consumed fields and preserve a hash of the input bytes. The AI review accepts at most 20 resource objects without truncation.
Tradeoff
The contract rejects unsupported actions and malformed plans. This is action-level evidence, so a passing check does not establish that a change is safe or authenticate the input.
Send generated evidence IDs, mode, actions, category and unknown-value status, plus the question catalogue and per-resource constraints. Addresses, before/after values, variables and arbitrary plan strings stay out of the request.
Tradeoff
Limiting the outbound evidence makes the contract inspectable. It deliberately prevents the model from performing attribute-level or dependency analysis.
Classify known action combinations and flag deletion, replacement, incomplete plans and deferred changes for human review. Carry that result unchanged into the final report.
Tradeoff
An explicit rule is repeatable and testable. The no_destructive_changes result only describes this policy; it is not deployment approval or a full risk assessment.
Call the installed Qwen model through the loopback Ollama API using a schema keyed by every evidence ID. Each resource gets its own allowed and required question IDs.
Tradeoff
A small local model can still return omissions or irrelevant questions. Constrained generation narrows those failures but does not replace application validation.
Join accepted findings to the local evidence map, render catalogue text and save JSON and Markdown in a fresh directory. Exit 1 means human review is required; exit 0 means this policy found no destructive changes.
Tradeoff
The saved report preserves an inspectable result, not authorization to apply Terraform. Its hashes identify bytes without proving who produced them.
Require every evidence ID exactly once, unchanged category and unknown flags, one to four distinct allowed questions, and every required question. Reject extra fields and missing coverage before rendering.
Tradeoff
Failing closed makes a bad answer visible and can require another attempt. The validator does not silently fill omissions, repair facts or establish broader model quality.
A manually dispatched main-branch release builds and attests the package. The promotion gate checks those bytes against an independently approved source commit.
Package → attestation → retained release files → provenance gate. The gate also requires the approved commit; only successful verification allows the local active/previous state to change.
COMPONENT NOTES
Reproducible package
Purpose
Create an allowlisted ZIP with fixed member metadata and a SHA-256 sidecar. The release job requires passing test and CodeQL jobs, workflow_dispatch and the main ref before it builds.
Tradeoff
A small package is easy to inspect and reproduce. A checksum detects changed bytes but does not authenticate their origin; signing is a separate step.
Use the release job’s GitHub Actions identity to attest the exact ZIP digest. Signing permissions are scoped to that release job; pull requests cannot reach it.
Tradeoff
Provenance binds an artifact to a build identity. It does not certify that the application is free of defects or suitable for every environment.
Supply the expected commit independently of the package. The verifier requires the manifest, source digest and signer digest to agree with it under the fixed repository/workflow/main identity.
Tradeoff
The operator must choose the intended build. Reading an expected commit from the untrusted package would remove this independent acceptance check.
Keep the signed bytes and copy the original attestation bundle to provenance.jsonl. The release workflow also retains the verifier’s demonstration evidence alongside them.
Tradeoff
Co-locating files makes later inspection easier, but JSON claims alone are not signature proof. Verification still depends on the GitHub CLI and its trust checks.
Call the full provenance gate before atomically changing local state. Public CLI rollback reauthorizes the retained previous package with its own approved commit and provenance.
Tradeoff
This records a local release choice. It does not deploy a service, switch live traffic or provide a transaction against a hostile filesystem.
Check the hash and ZIP structure, match the approved commit, then call gh attestation verify. Require the exact workflow/main certificate identity, GitHub OIDC issuer, source and signer digests, SLSA v1 predicate and a hosted runner. Rehash after the external verifier.
Tradeoff
Rejected signatures, missing tooling, timeouts and verifier failures all block promotion. The real-CLI regression check covers a boundary that mocked wrapper tests previously missed.
Owned worker → HTTP probes → monitor. The harness reacts to the alert by executing the runbook; recovery checks and monitor transitions are retained as evidence. The monitoring class never performs rollback.
COMPONENT NOTES
Owned local worker
Purpose
Run verified fixture packages as disposable loopback workers. The harness deliberately configures the candidate to return HTTP 503, after confirming its version and failed health response.
Tradeoff
The fault is injected behavior, not an application defect. Sequential workers use different local ports and do not measure traffic during startup or shutdown gaps.
Request /health on the owned loopback endpoint, bypass inherited proxies and measure through the response-body read. HTTP errors, transport failures and invalid bodies remain unsuccessful observations.
Tradeoff
Keeping failed requests in the denominator exposes fast failures. The sample excludes readiness/version checks and worker-transition gaps, so it is not a production SLO.
After observing the alert, stop the owned candidate, reverify the previous package with the local checksum helper, restore it and confirm its expected identity before starting the replacement worker.
Tradeoff
This explicit rehearsal action is separate from the monitor. It tests local package recovery; persistent data, production traffic and signature verification are outside this lab.
Evaluate a rolling five-request window. Two consecutive windows with at least 60% errors or p95 of at least 500 ms fire one alert; two full zero-error windows below the latency threshold clear it.
Tradeoff
Short windows keep the lab quick and repeatable. They are demonstration thresholds, not tuned production objectives; the class emits state transitions without paging or changing releases.
Require the restored 1.0.0 package identity, healthy /health and /version responses, twelve successful measured requests and a cleared alert. Check health/version again before declaring recovery verified.
Tradeoff
Multiple checks provide more evidence than a successful restart. This remains one local rehearsal and does not establish aggregate MTTR or production recovery targets.
Save samples.jsonl, incident.json, incident.md and a final metrics.prom snapshot in a fresh directory. Retain policy, timeline, phase metrics and source/file hashes; stop all owned workers and remove temporary state.
Tradeoff
The capture is unsigned: hashes identify bytes without authenticating execution. A saved Prometheus-text snapshot is inspectable evidence, not live monitoring infrastructure.
One plan. Four resources. A review you can inspect.
Captured September 11, 2026 Local Qwen 2.5 3B · Synthetic plan
Replacement order changes the review question. Step through the saved findings, then inspect the decision. The guided walkthrough uses an edited presentation timeline; the original recording is available separately.
Walk through the saved review
GUIDED
STEP 1 OF 6
One plan. Four resources.
An edited walkthrough of the saved synthetic plan and review. Each resource has its own action order and review questions.
WALKTHROUGH: one local Ollama attempt; synthetic Terraform evidence.
The model selects questions; Python owns the review decision.
R001: create -> delete
R002: no-op
R003: delete
R004: delete -> create
The saved findings and original transcript are available below.
The 30-second guided walkthrough is an edited reading sequence. Original recording preserves all 60.375 seconds, including the model’s wait and buffered CLI output. The measured review time remains 60.203 seconds. Neither view autoplays.
The response covered all four resources. Exit 1 is the expected review decision for this destructive plan. The report is advisory and does not authorize an apply.
This is one saved run, separate from the 12-case evaluation. The unsigned capture and matching file hashes establish internal consistency; they do not independently attest execution. Azure deployment, broad model quality and reviewer time savings are outside the measured scope. Read the capture notes and reproduction details.
A recorded local rehearsal follows an injected HTTP 503 failure through an alert, an explicit recovery runbook and twelve healthy recovery requests. The dedicated case study brings the incident timeline, source and evidence together.
20+ years across software engineering, infrastructure and enterprise delivery. I bring application context to platform work—and a practical focus on what makes a team’s day better.
How I work
Make changes reproducible. Give failures useful explanations. Keep credentials away from untrusted code. Document recovery before it is needed.
Outside engineering, I’m a songwriter and fiction writer. Structure and imagination have a place in both kinds of work.
2023 — 2026
Senior DevOps Consultant
Xebia
Designed Terraform automation and Azure Landing Zone deployments. Migrated TFS, Azure DevOps and Bitbucket repositories, implemented GitHub Advanced Security, and developed agentic solutions in GitHub.
2021 — 2023
DevOps / Platform Engineering Consultant
Cognizant
Led platform modernization, delivery automation and developer enablement. Mentored a remote team of five technical resources.
2016 — 2021
Software Architect / Cloud Modernization Lead
IntegraConnect
Led Azure modernization for healthcare applications, infrastructure automation, observability and disaster recovery planning.
Led and mentored a remote team of five technical resources, coordinating delivery across distributed workstreams. Provided hands-on architecture guidance and technical training for cloud delivery, Infrastructure as Code and automated deployments.
Designed and implemented Terraform automation and Azure Landing Zone deployments to standardize provisioning. Integrated GitHub Advanced Security into developer workflows and led migrations from TFS and Azure DevOps to GitHub.
Led Azure migration planning and execution for six applications across multiple services and environments, meeting target release dates. Designed, tested and documented disaster recovery procedures aligned with recovery time and data-loss objectives.
I’m looking for Senior DevOps and Platform Engineering opportunities where I can improve cloud delivery, build useful automation and help teams do their best work.