- Created daily log entries for May 13, 14, 18, 19, 20, and 21, capturing work done, findings, and next steps. - Established a daily logs index for easy navigation of daily notes. - Developed templates for daily logs, decisions, meeting notes, people, systems, and work items to standardize documentation. - Introduced base files for filtering and displaying various types of project knowledge, including daily notes, decisions, people, systems, work items, and workstreams. - Added maps for current work, fidelity apps, and fidelity domain to enhance project navigation and context.
145 lines
6.7 KiB
Markdown
145 lines
6.7 KiB
Markdown
---
|
||
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
|