code: func appStateInImmutablePod(app *v1.App, pod *pkgPod.Pod) error {
  	app.State = appStateFromPod(pod)
  
  	t, err := pod.CreationTime()
  	if err != nil {
  		return err
  	}
  	createdAt := t.UnixNano()
  	app.CreatedAt = &createdAt
  
  	code, err := pod.AppExitCode(app.Name)
  	if err == nil {
  		// there is an exit code, it is definitely Exited
  		app.State = v1.AppStateExited
  		exitCode := int32(code)
  		app.ExitCode = &exitCode
  	}
  
  	start, err := pod.StartTime()
  	if err != nil {
  		return err
  	}
  	if !start.IsZero() {
  		startedAt := start.UnixNano()
  		app.StartedAt = &startedAt
  	}
  	// the best we can guess for immutable pods
  	finish, err := pod.GCMarkedTime()
  	if err != nil {
  		return err
  	}
  	if !finish.IsZero() {
  		finishedAt := finish.UnixNano()
  		app.FinishedAt = &finishedAt
  	}
  
  	return nil
  }
docs: // appStateInImmutablePod infers most App state from the Pod itself, since all apps are created and destroyed with the Pod