Agile Development in 2026: Scrum, Kanban, and When to Use Each
A practical guide to agile frameworks — Scrum sprints, Kanban flow, XP, and Lean — with comparison tables, ceremonies, and honest advice on what actually works for software teams.
Master SemVer for libraries and apps — pre-releases, caret vs tilde ranges, breaking-change discipline, and a release workflow that keeps dependents sane.
By codefunc
Version numbers are a contract. When you publish 2.4.1, consumers infer compatibility from three integers — not from your changelog prose. Get SemVer wrong and lockfiles drift, CI breaks on "minor" upgrades, and teams stop trusting ^ ranges. This guide covers the rules that matter for JavaScript packages and any API that claims semantic versions.
Bottom line: MAJOR.MINOR.PATCH means breaking / feature / fix. Pre-releases sort before the stable tag. Prefer caret ranges for apps you control; pin or review majors carefully. Use a SemVer Calculator when bumping or checking range membership instead of guessing.
Given version MAJOR.MINOR.PATCH:
| Part | Bump when | Example |
|---|---|---|
| MAJOR | Incompatible API change | Rename export, remove endpoint, change default behavior |
| MINOR | Backward-compatible feature | New optional param, new endpoint, new export |
| PATCH | Backward-compatible bug fix | Crash fix, typo in docs bundled with package, perf with same API |
1.0.0 → 1.0.1 patch (bugfix)
1.0.1 → 1.1.0 minor (new feature)
1.1.0 → 2.0.0 major (breaking)
Try these transitions in the SemVer Calculator to confirm the next version before you tag.
If your "minor" removes a public function, you lied. Dependents who trusted ^1.0.0 will break. That erodes trust faster than a honest major bump.
SemVer allows labels after the patch number:
1.2.3-alpha.1
1.2.3-beta.2
1.2.3-rc.1
1.2.3+build.45
| Form | Meaning |
|---|---|
1.2.3-alpha.1 |
Pre-release; sorts before 1.2.3 |
1.2.3+build.45 |
Build metadata; ignored for precedence |
Ordering examples:
1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-beta < 1.0.0-rc.1 < 1.0.0 < 1.0.1
npm and most registries treat pre-releases as opt-in. npm install pkg will not grab 2.0.0-beta when 1.9.0 is the latest stable unless the user asks for a tag or exact version.
Do not leave production apps on *-alpha without a deliberate decision.
npm-style ranges appear in package.json:
| Range | Allows | Example matches for ^1.2.3 |
|---|---|---|
^1.2.3 (caret) |
Compatible with 1.x ≥ 1.2.3 | 1.2.3, 1.9.0 — not 2.0.0 |
~1.2.3 (tilde) |
Patch-level on 1.2.x | 1.2.3, 1.2.9 — not 1.3.0 |
1.2.3 |
Exact | Only 1.2.3 |
>=1.2.3 <2.0.0 |
Explicit range | Same idea as caret for 1.x |
Special case: ^0.2.3 only allows changes that do not modify the leftmost non-zero digit — so 0.y.z is treated as unstable. Many teams pin 0.x packages more tightly.
Verify membership with a SemVer Calculator before you widen a range in a shared library.
| Project type | Suggested default |
|---|---|
| Application | Caret on most deps; lockfile committed |
| Internal library | Caret on deps; peerDeps for frameworks |
| Security-critical | Exact pins + automated bump PRs |
| 0.x dependencies | Tilde or exact until 1.0 |
Always commit package-lock.json / pnpm-lock.yaml / yarn.lock for apps. Ranges declare intent; lockfiles declare reality.
Public API includes anything consumers reasonably depend on:
Usually not breaking if undocumented:
_internal modules (if truly unexported)When unsure, bump major. A clean major beats a silent landmine.
Before choosing the bump:
git diff v1.4.2...HEAD).package.json, OpenAPI, or JSON Schema files makes the contract change obvious.Example changelog-driven mapping:
| Change | Bump |
|---|---|
Fix null crash in parse() |
PATCH |
Add optional timeout option |
MINOR |
Rename parse → parseInput |
MAJOR |
| Drop Node 18 support | MAJOR |
fix:, feat:, feat!: / BREAKING CHANGE:changeset / release-please computes the next versionvX.Y.Z and publishnpm publishpackage.json matches intended SemVer bumpBump packages independently. A patch in @org/utils should not force a major of @org/cli unless the CLI's public behavior changed. Tools like Changesets track per-package bumps so you do not version the whole repo as one blob.
| Mistake | Fix |
|---|---|
| Marketing majors ("2.0 because redesign") with no API break | Use minor or keep major honest |
| Shipping breaks as minor "because migration is small" | Still major |
Forgetting 0.x caret rules |
Pin or read npm range docs |
| Publishing without a changelog | Consumers cannot plan upgrades |
| Yanking versions from the registry | Prefer deprecate + patch |
Treat SemVer as a compatibility contract, not a marketing dial. Bump MAJOR for breaks, MINOR for features, PATCH for fixes; use pre-releases for risky majors. Prefer caret ranges with a committed lockfile, verify bumps and range matches with a SemVer Calculator, and inspect config or schema deltas with JSON Diff before you publish.
A practical guide to agile frameworks — Scrum sprints, Kanban flow, XP, and Lean — with comparison tables, ceremonies, and honest advice on what actually works for software teams.
A practical guide to Git for frontend developers — branching strategies, commit conventions, pull request workflows, and the commands you'll use daily on product teams.
Understand Unix file permissions end to end — the user/group/other model, octal math, symbolic notation, common permission sets, and the security mistakes that cause 403s and leaked keys.
Find a developer tool