"""Add scripts errormode Backs the per-script "how should a non-terminating error be treated" field. PowerShell invoked with -File exits 0 whenever it reaches the end of the body, even if every meaningful line inside wrote an error. The agent derives the command verdict from that exit code, so a script could report SUCCEEDED while doing none of its work - which is exactly how an account-provisioning script came back green with the account only partly built. NOT NULL with server_default 'default', so every script row that existed before this migration keeps today's permissive behaviour exactly. Strict is opt-in per script and never retroactive: turning it on globally would change the meaning of bodies that were authored under the permissive rule and deliberately tolerate a failing Remove-Item, probe with Get-LocalUser, or loop past a bad item. Those would begin aborting partway through, which is worse than a false green because it leaves the endpoint half-configured. The value is validated in shopdb/core/api/scripts.py where a rejection can explain itself, not in the schema where it would only produce an IntegrityError. Revision ID: 7d49_script_errormode Revises: 7d48_script_workingdir Create Date: 2026-09-09 """ from alembic import op import sqlalchemy as sa revision = '7d49_script_errormode' down_revision = '7d48_script_workingdir' branch_labels = None depends_on = None def upgrade(): op.add_column('scripts', sa.Column( 'errormode', sa.String(length=16), nullable=False, server_default='default', comment="'default' keeps PowerShell's permissive behaviour; " "'strict' stops on the first error so the exit code is honest")) def downgrade(): op.drop_column('scripts', 'errormode')