ROOT CAUSE: 'apps/web/.next/' starts with a dot — it's a HIDDEN directory. actions/upload-artifact@v4 excludes hidden files by default (include-hidden-files: false). This is why the artifact was always empty, causing 'Artifact not found' in the deploy job. Fix: set include-hidden-files: true and use path without glob. Also fix deploy job download path to apps/web and SCP source to match.