--- description: Draft a standup from the latest Fidelity workspace context --- Generate a standup update using the latest workspace state. Temporal context. Read this before interpreting `today`, `yesterday`, `previous workday`, or `last workday`: !`python3 - <<'PY' from datetime import datetime, timedelta now = datetime.now().astimezone() today = now.date() calendar_yesterday = today - timedelta(days=1) default_previous_workday = calendar_yesterday while default_previous_workday.weekday() >= 5: default_previous_workday -= timedelta(days=1) print("## Temporal Context") print(f"current_time: {now.isoformat()}") print(f"today: {today.isoformat()} ({today.strftime('%A')})") print(f"calendar_yesterday: {calendar_yesterday.isoformat()} ({calendar_yesterday.strftime('%A')})") print(f"default_previous_workday: {default_previous_workday.isoformat()} ({default_previous_workday.strftime('%A')})") print("standup_rule: Generate the report for today. The previous-work section must describe work from calendar_yesterday when it was a workday; otherwise use the latest prior day with Mattermost activity.") PY` First, refresh Mattermost before drafting. This is mandatory for start-of-day standups and must not be skipped: !`python3 - <<'PY' import os import subprocess from pathlib import Path from datetime import datetime cmd = os.environ.get("AIW_MATTERMOST_SYNC_CMD") or os.environ.get("FIDELITY_MATTERMOST_SYNC_CMD") today = datetime.now().astimezone().date().isoformat() commands = [] if Path("scripts/mattermost/sync.sh").is_file(): commands.append(("latest", ["bash", "scripts/mattermost/sync.sh"])) commands.append(("previous-workday", ["bash", "scripts/mattermost/sync.sh", "--previous-workday", "--today", today])) elif cmd: commands.append(("configured", ["bash", "-lc", cmd])) if not commands: print("No Mattermost sync command configured.") raise SystemExit(0) failed = False for label, command in commands: result = subprocess.run(command, capture_output=True, text=True) print(f"__MATTERMOST_SYNC_LABEL__={label}") print(f"__MATTERMOST_SYNC_RETURN_CODE__={result.returncode}") if result.returncode != 0: failed = True print("__MATTERMOST_SYNC_FAILED__") if result.stdout.strip(): print(result.stdout.strip()) if result.stderr.strip(): print(result.stderr.strip()) if failed: raise SystemExit(0) PY` Read: @prompts/standup.md @workspaces/fidelity/project-knowledge/01-current/current-work.md @workspaces/fidelity/project-knowledge/01-current/work-items.md @workspaces/fidelity/project-knowledge/03-context/project.md @workspaces/fidelity/project-knowledge/03-context/workstreams/flow-page-references.md @workspaces/fidelity/project-knowledge/03-context/process/communication.md @workspaces/fidelity/project-knowledge/04-people/manager.md Today's log, if present: !`if [ -f workspaces/fidelity/project-knowledge/06-daily/$(date +%F).md ]; then cat workspaces/fidelity/project-knowledge/06-daily/$(date +%F).md; else echo "No daily note exists for today yet."; fi` Latest refreshed Mattermost context, if present: !`python3 scripts/mattermost-proxy/read-context.py --mode standup --today $(date +%F)` Detailed active work item files, if available: !`python3 - <<'PY' import re from pathlib import Path summary = Path("workspaces/fidelity/project-knowledge/01-current/work-items.md") if not summary.is_file(): print("No work item files available.") raise SystemExit(0) text = summary.read_text() paths = re.findall(r"Detail: `(workspaces/fidelity/project-knowledge/02-work-items/[^`]+)`", text) if not paths: print("No work item files available.") raise SystemExit(0) for rel in paths: path = Path(rel) if not path.is_file(): continue print(f"\n### {rel}") print(path.read_text()) PY` Before drafting: - use `status-reporting` when available - Mattermost refresh is mandatory for standup; do not draft from stale workspace memory if the refresh did not run - update workspace memory if the refreshed context introduced clear high-confidence project facts - prefer existing memory when the latest context is ambiguous - treat the previous workday Mattermost context as the source for the `Yesterday` section, even when the previous calendar day was a weekend, holiday, or OOO day - mention Jira IDs and approved titles when they map cleanly to previous-work context - prioritize story-based updates over side questions, memory refreshes, or manager-only context - if documentation or root cause updates directly support a story, roll them into that story's update instead of listing them separately - exclude items that are not directly tied to a story unless they are true blockers - when one Jira item has multiple concrete updates, group them under one top-level `JIRA-ID - Title` bullet with indented markdown sub-bullets instead of repeating the same Jira line - use `workspaces/fidelity/project-knowledge/03-context/workstreams/flow-page-references.md` to preserve real flow/page identifiers when shorthand appears in logs or messages - for standups that will also be sent to Teams, prefer plain language over internal implementation jargon; avoid unexplained terms like `fallback` - if work is in release-process waiting state, show the parallel story work explicitly instead of implying idle waiting - if Mattermost sync failed, acknowledge that internally and rely on the latest saved workspace context instead of inventing fresher communication - prefer only the detailed work-item files referenced by `workspaces/fidelity/project-knowledge/01-current/work-items.md`; do not mine unrelated or completed ticket files unless they are explicitly active in current memory Return a standup that is: - specific - concise - grounded in the latest context - safe to send without overstating certainty - written in natural US English that can be sent externally without rewriting - written as David's progress report - free of any mention of Mattermost, since it is internal-only communication - starts with exactly `Hi @jeff, here’s my daily scrum update:` for the active Fidelity profile - does not mention Jeff again after the greeting unless explicitly needed - uses bullet points for each item - groups multiple updates for the same Jira item as indented sub-bullets - uses `JIRA-ID - Title` or `JIRA-ID Title` formatting instead of comma-separated ID/title formatting - preserves chronological order within each Jira item's sub-bullets - omits future-sprint stories from `Today` unless they are real blockers - includes a visible blank line before `Today:` and before `Blockers:` when present; before returning, verify there is an empty line immediately above each section header so Mattermost renders it correctly - is ready to copy/paste into Mattermost as Markdown