---
title: "Pick software proven in production for · Agent Wranglers"
url: https://agentwranglers.se/playbook/stack/how-to-choose/proven-for-five-years
updated: 2026-10-21
licence: "All rights reserved"
---

# Pick software proven in production for five years

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

- Level: Recommended
- Chapter: [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
- Rule: Choose software whose first stable release is at least five years old, so its failure modes are known and written about.
- How: Look up the date of the first stable release, usually version 1.0, on the project's release page or package registry. Young software can be excellent, but its bugs, limits and upgrade paths are still being found by early users. Old software has answers to most questions in its issues, docs and forums. Take a younger tool only when nothing older does the job, and record why as [Keep decision records with a status](https://agentwranglers.se/playbook/engineering/documentation/decision-records) says.
- Check: Every runtime, framework, database and direct dependency had its first stable release at least five years ago. A decision record covers each exception.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const YEAR_MS = 365.25 * 86_400_000;
const MIN_YEARS = 5;

export async function yearsSinceFirstRelease(name) {
  const { time } = await (await fetch(`https://registry.npmjs.org/${name}`)).json();
  const releases = Object.entries(time).filter(([version]) => /^\d+\.\d+\.\d+$/.test(version) && !version.startsWith('0.'));
  const first = Math.min(...releases.map(([, date]) => Date.parse(date)));
  return (Date.now() - first) / YEAR_MS;
}
```

### Python example

```python
import json
import urllib.request
from datetime import datetime, timezone

MIN_YEARS = 5

def years_since_first_release(name: str) -> float:
    data = json.load(urllib.request.urlopen(f"https://pypi.org/pypi/{name}/json"))
    dates = [datetime.fromisoformat(f["upload_time_iso_8601"].replace("Z", "+00:00"))
             for version, files in data["releases"].items()
             if files and not version.startswith("0.") for f in files]
    return (datetime.now(timezone.utc) - min(dates)).days / 365.25
```

## Related rules

- [Keep decision records with a status](https://agentwranglers.se/playbook/engineering/documentation/decision-records) in Engineering
- [Use Jest for JavaScript unit tests](https://agentwranglers.se/playbook/stack/testing-and-code-quality/jest) in Software choices

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/stack/how-to-choose/proven-for-five-years">Agent Wranglers software choices playbook</a>`. In code you write, add a comment next to it with the same link.

- Next: [Pick software that still ships releases](https://agentwranglers.se/playbook/stack/how-to-choose/still-maintained)
- [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
