Is it possible to use regular markdown links to other .md files in Hugo, or must one always use a shortcode?
To link to images and non-MD files, regular markdown links work, especially now with bundles as a feature. ex. 
But my understanding is that for other .md files, you need to use a shortcode: [another article]({{< ref "path/to/file.md" >}}).
This shortcode is a little cumbersome and also not entirely futureproof. If stop using Hugo, these don’t render to regular HTML links as regular .md links do.
Is there are hack to get around this? Or am I misunderstanding something?
It’s more about economy of writing the links and also so that they still work on my local machine. If I put the file path in the normal way, when I render the markdown, the links work locally. It’s more natural for me to just type in the .md file name. I suppose I could just make a keyboard snippet for shortcodes. I’ll read up on symbolic links in 0.32
As far as I can see, no, there is no way around it. Template code goes in templates, and the workaround to use that in markdown files is to use shortcodes.
I think that happens no matter what SSG you’re using / converting to.
In my opinion, use the permalink instead because, then at least you have a chance of converting directly, if you switch away from Hugo (but, why would you want to?! )
The nice thing about having normal .md links in the files for me is that you can use the same markdown file on github and on hugo. In general, I’d like to write a bunch of ‘normal’ md files, then have hugo build them into my pages based on my theme and config, not pollute my markdown files with Hugo-only shortcodes (which look bad and don’t work when you try to click them on Github, for instance)
It should be possible using Render Hook Templates if you’re using Goldmark (the default renderer since Hugo 0.60).
Paste this into layouts/_default/_markup/render-link.html:
{{- $url := .Destination -}}
{{- if ne (substr .Destination 0 1) "#" }}
{{- $targetFile := .Destination | absURL -}}
{{- range .Page.Site.Pages -}}
{{- if eq $targetFile (.File.Path | absURL) -}}
{{- $url = printf "%s%s" .RelPermalink (replaceRE "^[^#]*" "" $.Destination) -}}
{{- end -}}
{{- end -}}
{{- end -}}
<a href="{{ $url }}"{{ with .Title }} title="{{ . }}"{{ end }}>{{ $.Text }}</a>
{{- /* This tag removes whitespace at the end */ -}}
Basically, for every link written in any Markdown file it goes through all pages in the site and checks whether you’ve linked to its input file. If you did, it replaces the linked URL with the relative permalink of that page. Plus some regex trickery to preserve the fragment part (#this-bit) of replaced links.
Caveats:
I’ve only tested it in hugo serve.
It’s probably not very efficient for large sites with a lot of links and pages.
It uses Site.Pages, which according to the documentation “contains only the pages in the current language”, so if you’ve got a multilingual site you presumably can’t use this to link to pages in other languages.
I’m pretty new to Hugo so I’ve probably overlooked some other corner cases and there may be better ways to do this.