Skip to Content
Approach

Why the same fixes keep showing up

Two different Odoo versions, two different industries, three engineers moving between them — and the same root cause kept recurring: several parts of a system quietly disagreeing about the same fact. Payroll disagreeing with attendance. Tax logic scattered instead of centralized. A security secret stored somewhere a bad actor could also reach.

Our answer is never a fourth opinion. It's collapsing the disagreement into one definition everyone calls.

That's why our security hardening looks the same on both platforms even though we built it a year apart, independently: a recovery secret that lives in the database protects nothing from a database administrator. Both platforms keep it in the server config instead — a house pattern, not a coincidence.

Method

How we work a problem

The order we work in, whatever the symptom — payroll, VAT or a dashboard.

01

Start from the symptom

Every case study here opens with the sentence a client actually brought us. "Payroll is off by half a day" is a better starting point than a requirements document.

02

Find where the system disagrees with itself

The bug is rarely the arithmetic. It's usually several parts of the system quietly holding different opinions about the same fact.

03

Collapse it into one definition

One day classifier. One tax category. One stock move. Everything else reads from it, so there is nothing left to drift.

04

Guard it, then prove it

Put the rule where it can't be walked around, keep the off switch out of reach, and back it with tests — the payroll classifier shipped with 19.

House patterns

Eight rules the case studies have in common

Each one links to the case studies where it did the work.

One definition everyone calls

When several parts of a system each decide the same fact, they eventually disagree. We don't add a fourth opinion — we collapse the disagreement into one definition and make everything else read from it.

On MAFA, attendance sources were four portal settings and three hardcoded lists in the backend, which could offer one employee different options on different screens. Both screens now ask the same server-side method.

Seen in

The model fills the form; a person approves it

AI earns its place where a person can check the output. Our models never write to the database directly: they draft, and someone signs off.

The CRM assistant on the aviation platform only runs when a user asks for it, against a provider the client configures.

Seen in

Enforce the rule where it can't be walked around

A rule that only lives on a screen can be bypassed by an import, a script or a busy person. We put it in the model: constraints, gates on stage changes, access checks on every data path.

On MAFA, an advisor role excludes payroll journal entries at both the entry and the line level, so they are filtered out of every query — not just hidden from a menu.

Seen in

When the data is ambiguous, refuse to guess

Carry forward automatically when the facts are clean; stop and make a person decide when they aren't. An unnoticed gap silently misstates a filed return — a warning makes someone look.

Seen in

Make the next change a setting, not a deployment

A new logo is a setting. A new tax treatment is a category on the tax. A new operating company gets its document sequences automatically. The next change shouldn't need a developer.

On the aviation platform, adding an operating company provisions its sales order and payslip numbering with no configuration at all.

Seen in

Have a system that disagrees with itself?

Tell us what's broken. Chances are we've already fixed a version of it.