ChatGPT-5.2 suggested these UI changes:

  1. Introduce a --dry-run and --yes pattern For anything that mutates history, a default preview would build trust. --yes keeps scripts fast.

  2. More actionable errors. Wrap backend tool failures with a short explanation and what to try next. Example: “SCCS rmdel failed: likely locked or not tip; run src checkout first.”

  3. Safer revision‑spec parsing. When a token ambiguously looks like a file, offer a hint: “If this is a file, use --.” You already do this in some places; make it universal.

  4. Improve default output consistency. Ensure all commands emit consistent prefixes/headers so piping to tools is easier and users can recognize patterns quickly.

It further extracts these design rules, which could be followed more strictly:

Here is a compact design rule set that matches the direction src already seems to be taking.

Core Rules
  1. src is file-oriented by default. Commands operate on explicitly named files unless the command is inherently repository/report scoped.

  2. Reporting commands may infer scope. Commands like status, list, log, ls, help, version may default to current file set, branch, or repository scope.

  3. Mutating commands must require explicit targets. If a command changes history, working copy state, names, tags, branches, or file placement, it must require explicit file arguments unless it is explicitly repo-wide by design.

  4. stdout is for payload, stderr is for commentary. Human-readable reports and machine-readable data go to stdout. Notices, selections, warnings, and errors go to stderr.

  5. Every command should have one stable mental model. A command should be clearly one of:

    • report

    • content emitter

    • mutator

    • admin/meta

      If a command straddles categories, the UI should make that explicit with options rather than
      implicit defaults.
      Scope Rules
  6. Empty file arguments mean “all files” only for report commands. Never for destructive or state-changing commands.

  7. Revision specs may default; file specs may not for mutators. It is fine for checkout foo to imply “tip of foo”. It is not fine for checkout to imply “tip of everything”.

  8. Repo-wide actions should be explicit in the command design. If you ever want a mutator to work repo-wide, that should be a dedicated option like --all, not silent defaulting.

    Output Rules
  9. Human output should be readable without decoration-dependent parsing. Avoid width-sensitive banners except where they add real value.

  10. Machine output should be a first-class interface. -P should mean:

    • no color

    • no padding

    • no banners

    • stable field order

    • escaped separators/newlines

    • one record per line unless documented otherwise

  11. Similar commands should emit similar shapes. If list -P and log -P are both record streams, their first fields should line up where practical:

    • file

    • revision

    • date

    • mode-specific fields

  12. Notices should never contaminate pipelines. Anything like src: .src is selected. belongs on stderr.

    Argument Rules
  13. Short options should preserve established Unix meaning where possible. Avoid reclaiming common options once published.

  14. Shared verbs should share shared options. If -l means limit in one history-report command, it should mean limit in the adjacent ones too.

  15. Hidden parser cleverness should be minimized. Convenient syntax is fine, but only if users can predict it from help text.

    Error Message Rules
  16. Errors should say what was missing, not just what was invalid. Good: checkout requires at least one file argument Less good: bad arguments

  17. Errors should preserve the command noun. tag deletion requires at least one file argument is better than a generic parser complaint.

  18. Errors should suggest recovery when there is an obvious next step. You already do this well in some places; keep that pattern.

    A Simple Test
    For any command, a user should be able to answer these questions without reading code:
  19. Does it read, emit, or mutate?

  20. If I omit files, what happens?

  21. If I pipe it, will I get only payload?

  22. Is there a stable machine-readable mode?

  23. Does its behavior match neighboring commands?

    If you apply these rules consistently, the UI will feel much more intentional and the remaining
    TODO items will likely collapse into smaller, local fixes rather
    than policy debates.

Here’s the highest-value change list, ordered roughly by impact.

Output Contract