Loading...
Loading...
Use this skill when creating new files that represent architectural decisions — data models, infrastructure configs, auth boundaries, API contracts, CI/CD pipelines, or event systems. Flags irreversible decisions and forces a discussion about trade-offs before committing.
npx skill4agent add jamditis/claude-skills-journalism one-way-doorschema.prismaschema.graphql*.sqlmigration*models.pymodels.tsentities.pyentities.tsdocker-compose*Dockerfile*.tfterraform*pulumi*cdk*cloudformation*k8s*kubernetes*helm*auth.tsauth.jsauth.pyfirestore.rulesstorage.rules*.rulesrbac*permissions*security*openapi*swagger**.proto*.graphqlapi-schema*routes.tsroutes.jsroutes.pyevents.tseventbus.tseventemitter.pyeventhandler.pypubsub*queue*kafka*rabbit*.github/.gitlab/.circleci/Jenkinsfile.travis.ymlcloudbuild*package.jsonCargo.tomlgo.modrequirements.txtpyproject.tomlGemfilefirebase.json.firebasercfirestore.indexes*.envCLAUDE.md### One-way door check
Before creating new files that represent architectural decisions, ask: "Which of these decisions would be difficult to reverse?" One-way doors include data models, service communication patterns, auth boundaries, tenancy models, and infrastructure configs. These create gravity — once traffic, users, or other code depends on them, changing course gets expensive. If a decision is a one-way door, pause and discuss the trade-offs before committing. Two-way doors (UI components, utilities, styling) can be decided quickly and changed later.settings.json{
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "/path/to/one-way-door-check.sh"
}
]
}
]
}
}#!/bin/sh
# One-way door check hook (PreToolUse:Write)
# Flags architectural decisions that are hard to reverse.
INPUT=$(cat)
[ -z "$INPUT" ] && exit 0
# Extract the file path from tool_input
FILE_PATH=$(echo "$INPUT" | grep -oP '"file_path"\s*:\s*"[^"]*"' | head -1 | sed 's/.*"file_path"\s*:\s*"//;s/"//')
[ -z "$FILE_PATH" ] && exit 0
FILENAME=$(basename "$FILE_PATH")
FILENAME_LOWER=$(echo "$FILENAME" | tr "[:upper:]" "[:lower:]")
DIR=$(dirname "$FILE_PATH")
ONE_WAY=0
REASON=""
# Database schemas and migrations
if echo "$FILENAME_LOWER" | grep -qE "schema\.(prisma|graphql|sql)|migration|\.sql$|models?\.(py|ts|js)$|entities?\.(py|ts|js)$"; then
ONE_WAY=1
REASON="data model / database schema"
fi
# Infrastructure and deployment configs
if echo "$FILENAME_LOWER" | grep -qE "^(docker-compose|dockerfile|terraform|pulumi|cdk)|\.tf$|cloudformation|k8s|kubernetes|helm"; then
ONE_WAY=1
REASON="infrastructure / deployment config"
fi
# Authentication and authorization
if echo "$FILENAME_LOWER" | grep -qE "auth\.(ts|js|py)|firestore\.rules|storage\.rules|security|\.rules$|rbac|permissions"; then
ONE_WAY=1
REASON="auth / security rules"
fi
# API contracts and service interfaces
if echo "$FILENAME_LOWER" | grep -qE "openapi|swagger|\.proto$|\.graphql$|api-schema|routes\.(ts|js|py)$"; then
ONE_WAY=1
REASON="API contract / service interface"
fi
# Event systems and message queues
if echo "$FILENAME_LOWER" | grep -qE "event(s|bus|emitter|handler)\.(ts|js|py)$|pubsub|queue|kafka|rabbit"; then
ONE_WAY=1
REASON="event system / message bus"
fi
# Package manager configs (dependency choices)
if echo "$FILENAME_LOWER" | grep -qE "^(package\.json|cargo\.toml|go\.mod|requirements\.txt|pyproject\.toml|gemfile)$"; then
ONE_WAY=1
REASON="dependency / package config"
fi
# Firebase and cloud service configs
if echo "$FILENAME_LOWER" | grep -qE "^firebase\.json$|^\.firebaserc$|firestore\.indexes"; then
ONE_WAY=1
REASON="cloud service config (Firebase)"
fi
# CI/CD pipelines
if echo "$DIR" | grep -qE "\.(github|gitlab|circleci)" || echo "$FILENAME_LOWER" | grep -qE "^(jenkinsfile|\.travis\.yml|cloudbuild)"; then
ONE_WAY=1
REASON="CI/CD pipeline"
fi
if [ "$ONE_WAY" = "1" ]; then
cat >&2 <<HOOK_MSG
ONE_WAY_DOOR: You tried to create $FILENAME ($REASON). This write has been blocked because it is a one-way door -- a decision that becomes hard to reverse once other code, data, or users depend on it.
REQUIRED ACTION: You MUST use the AskUserQuestion tool before retrying this write. Present the user with:
1. What this file does and why it is a one-way door
2. At least 2 alternative approaches (if any exist) with their trade-offs
3. An option to proceed as planned
Frame the question around the specific architectural decision, not just "should I create this file?" The user needs to understand what they are committing to.
After the user responds, proceed according to their choice.
HOOK_MSG
exit 2
fi
exit 0WriteAskUserQuestion02